しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【In-App Purchase】iOSでInvalid Product Identifierが出た時の対処法

アプリ内課金でアイテム情報が取得できなかった時の対処法です。

今回のケースでは、iTunesconnectの「契約/税金/口座情報」を入力する事で解決しました。 入力後30分くらい経ったらプロダクト情報が取れるようになりました。

シンプルなRESTClient、insomniaを試してみる

insomniaというRESTClientを試してみました。

insomnia.rest

アプリはこちらのページからダウンロードしました。

insomnia.rest

起動後画面は下のようなものです。

f:id:llcc:20160921234259p:plain

このようにURL指定でリクエストを送る事ができます。

f:id:llcc:20160921234305p:plain

ベーシック認証・ヘッダー・パラメータなどを自由に付けれるようです。

f:id:llcc:20160921234311p:plain

作成したリクエストは保存する事もできます。

f:id:llcc:20160921234314p:plain

【Swift】呼び出し元のメソッド名を取得する

メソッドの呼び出し元を取得する方法を調べました。

良くある方法はスタックトレースを見る方法です。

class MyClass {
    func originMethod() {
        targetMethod()
    }
    
    func targetMethod() {
        let symbols = NSThread.callStackSymbols()
        print(symbols.count >= 2 ? symbols[1] : "")
    }
}

以下のような形式で出力されるので少し加工が必要です。

1   MyApp                               0x000000010be1f242 _TFC5MyApp7MyClass12originMethodfT_T_ + 18

他にもデフォルト引数で#functionを受け取る方法もあります。

class MyClass {
    func originMethod() {
        targetMethod()
    }
    
    func targetMethod(originMethodName: String = #function) {
        print(originMethodName)
    }
}

こちらだとメソッド名がしっかり出てくれるので扱いやすいです。

targetMethod

参考URL

【Swift】メソッドがどこから呼ばれているかを知るTips - debug identifiers - - Qiita

自作のCocoaPodsライブラリのバージョンを上げる

自作のCocoaPodsライブラリのバージョンを上げる方法です。

まずはpodspecファイルのバージョンを更新します。

Pod::Spec.new do |s|
  s.version = "0.1.4" # ここのバージョンを変える
end

次はそのバージョンのタグを作ってpushします。

git tag 0.1.4
git push --tags

最後にpodコマンドでライブラリの更新をします。

pod trunk push

DIコンテナとは何かを調べてみた

DIコンテナとは何か調べてみました。
サンプルはSwiftで書かれています。

DIとは

DIとはDependency injectionの略で、デザインパターンの一種です。
日本語では言うと依存性の注入などと呼ばれる事が多いです。
このデザインパターンは複数の関連するオブジェクトの結合を疎にする為のものです。

例えば以下のようにOwnerはDogクラスに紐付いているとします。
もしこのコードで、OwnerにDogのサブクラスを渡したいと言われたりDogのプロパティーを変更したいと言われると都度Ownerを変更する必要があります。
そうなるとOwnerが多くの場所で使われている場合にテストが大変ですし、柔軟性にも欠けます。

class Owner {
    func exec() {
        Dog().howl()
    }
}

class Dog {
    func howl() {
        print("wan!")
    }
}

Owner().exec()

それをDIを使って変更してみます。
DIを使うと以下のようになります。
Dogをコンストラクタで外部から渡す事で柔軟なクラスになりました。

class Owner {
    let dog: Dog
    
    init(dog: Dog) {
        self.dog = dog
    }
    
    func exec() {
        dog.howl()
    }
}

class Dog {
    func howl() {
        print("wan!")
    }
}

Owner(dog: Dog()).exec()

DIコンテナとは

DIコンテナとはDIを実現できるフレームワークの事を指します。
JavaSpring Frameworkなどが有名です。

参考URL

仕事に役立つプログラミング・キーワード - DIコンテナ【Dependency Injection Container】:ITpro
依存性の注入 - Wikipedia

RealmのデータをGUIで確認できるRealm Browserを試してみた

Realm BrowserというRealmのデータを見れるツールが出ていたので試してみました。
Realmが公式で開発しているもので、1年以上前から出ていたようです。

Realm Browser

Realm Browser

  • Realm
  • 開発ツール
  • 無料

起動するとRealmファイルの場所を聞かれます。
Realmファイルは、シミュレータのフォルダにrealmという拡張子で保存されているのでそれを指定します。

f:id:llcc:20160705233319p:plain

シミュレータのフォルダは以下のパスです。
device_idとapp_idには端末のIDとアプリのIDを指定します。

~/Library/Developer/CoreSimulator/Devices/#{device_id}/data/Containers/Data/Application/#{app_id}

デフォルトのまま使っている場合、その中のDocumentsフォルダにRealmファイルは格納されています。

Documents/default.realm

画面はこのようにModelとそのデータ一覧が表示されています。

f:id:llcc:20160705234823p:plain

検索は右上の検索窓から行う事ができます。
全カラムから検索するようです。

f:id:llcc:20160705234954p:plain

値の更新と削除はできました。
行の追加は、メニューに「Add new object」というものがあったのですがうまく動いてくれませんでした。

f:id:llcc:20160705235156p:plain

メニューを見たところ他にもCSVの吐き出しや定義をコードとして出力する機能を備えていそうです。

f:id:llcc:20160705235416p:plain

MacにDjangoをインストールしてサーバーを動かす所まで試してみた

Djangoをインストールしてサーバーを動かすところやってみました。

まずはPythonのパッケージ管理ライブラリであるpipをインストールします。

easy_install pip

次はpipを使ってdjangoをインストールします。

pip install django

インストールが終わったのでプロジェクトを作ってみます。
django-admin.pyを使ってtest_appというプロジェクトを作成します。

django-admin.py startproject test_app

最後にプロジェクトを起動してみます。
runserverコマンドでサーバーを起動します。

cd test_app/
python manage.py runserver

このようにサーバーが起動しました。
migrateするように言われていますが、しなくても一応動かす事ができます。

f:id:llcc:20160701231623p:plain

実際にlocalhost:8000にアクセスすると以下のようにページが表示されていました。

f:id:llcc:20160701231709p:plain