2016年3月17日木曜日

AppleのAppStoreにCordovaアプリを提出してリジェクトされたら…これをチェック!

AppleのAppStoreにCordovaアプリを審査に提出したらリジェクトを食らった。曰く。

During review, your app failed to launch on iPad running iOS 9.2.1 and iPhone running iOS 9.2.1 on both Wi-Fi and cellular networks. Specifically, when we selected the application on the Home screen, the app displayed a launch image then quit unexpectedly. This may be because iOS 9 uses a watchdog timer for applications; if an application takes too long to complete its initial startup, the operating system terminates the application.

要するに「起動しない」と。iOS9は「watchdog timer」という、起動に時間がかかり過ぎるアプリを自動的に終了させる機能があるので、そのせいかもしれないとのこと。

結論から言うと、

Runpath Search Paths>Releaseにパスが設定されているか確認せよ!

ということである。watchdogは関係無かった。単に必要なライブラリがリンクされていないせいでクラッシュしていただけだった^^;

もちろん審査に提出するにあたりアプリが正常に起動することは確認している。デバッグモードではね。しかし、リリースビルドで起動確認することをすっ飛ばしていた。慢心があった。まずこれが敗因の一つ。

リリースビルドは、Xcode>Window>Organizer>Exportで抽出できる。抽出方法がいくつかあるが、今回のようなテスト目的なら「Sava for Development Deployment」で抽出する。


抽出したリリースビルドは、Xcode>Window>Devicesで各実機にインストールできる。


もうひとつの敗因は、CordovaがiOSプロジェクトを作成する方法に問題があったことだ。

リリースビルドを実機にインストールして起動すると、確かにクラッシュしたw ログを見てみると

・・・
Dyld Error Message: Dyld Message: Library not loaded: @rpath/libswiftAVFoundation.dylib
・・・

つまりlibswiftAVFoundation.dylibがリンクされていないことが原因だとわかった。調べてみると、結構ハマっている人がいるようだ。

osx - dyld: Library not loaded: @rpath/libswiftAVFoundation.dylib - Stack Overflow

答えの中に、「runpathを設定せよ」と言っている人がいる。確か、iOS版の開発の初めの方でAVFoundationの問題に出くわした気がする。

そこでプロジェクトでrunpathの設定を確認してみると、releaseのところだけ空欄だった!このように設定して、実機での起動を確認した。



このプロジェクトではSwiftでネイティブプラグインを書いているのだが、この問題が出たのはそのせいかもしれない。ObjCのみのプロジェクトの場合はこの問題は出ないかもしれない。

もし少しでもSwiftで書いている場合はリリースビルドの直前に必ずrunpathをチェックした方が良い。