2016年8月18日木曜日

CordovaアプリでAppStoreのストア情報の「言語」に「日本語」を追加するには?

CordovaアプリをAppStoreに提出すると、何もしなければストア情報の「言語」が英語になる。

気づいてはいた。実際のアプリは日本語のみ対応なので、せめて「日本語、英語」と表示されるようにすべきだ。しかし、そんなところを気にするユーザーはいないだろうと思って解決を先送りにしていたら、ユーザーから指摘を受けた。

やっぱりちゃんと解決しないとダメだと思い直したが、どうすればいいのか?色々と調べたけど、ぴったりな情報は無かったのでログしておこうと思う。

XcodeでFile>New>File...

ダイアログが出るので iOS>Resource>Strings File>Next

ファイル保存ダイアログが出るので「Localizable.strings」という名前でResources配下に保存する。

ファイルインスペクター(Xcodeのプロジェクトナビゲーターでファイルを選択すると右に出るやつ)でResources/Localizable.stringsを選択

「Localize...」ボタンをクリック

プロジェクトナビゲーターでプロジェクトをクリック

Infoタブクリック

Localizationsセクションで「+」アイコンをクリックし、Japanese(ja)を選択

ローカライズするファイルを選ぶダイアログが出るので、Localizable.stringsを選択し、Finish

すると、

Resources/en.lproj/Localizable.strings
Resources/ja.lproj/Localizable.strings

ができる。

これでAppStore上で「日本語、英語」と表示されることを確認した。

本当は「日本語」のみの方が好ましいが、次のアップデートで試してみるつもり。

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をチェックした方が良い。

2016年3月15日火曜日

iOSアプリ申請・公開手順まとめ 〜2016年3月版〜

iOSアプリの申請・公開手順については、すでに様々な人々がブログ等でまとめてくれているが、代表的な記事でもすでに少々古くなっていることを否めない。

そこで、2016年3月版として改めて書いておくことにはそれなりの意味があると思うのでログを残しておこうと思う。

記事を書くにあたり、こちらのサイトを大いに参考にさせて頂いた。
よく分かる!iOS アプリのリリース手順のまとめ | Developers.IO


前提として、アプリの開発が済んでいることとする。


1. Production用のCertificateファイルの作成

iOS Certificates - Apple Developer

にアクセス。作業は全てSafariで行った方が良い。

「+」ボタンをクリック。


「App Store and Ad Hoc」を選択してスクロールして「Continue」をクリック。


キーチェーンアクセスで申請用のファイルを作る方法が書いてあるページが表示される。「Continue」をクリック。


Macで、アプリケーション>ユーティリティー>キーチェーンアクセス.appを起動。「認証局に証明書を要求…」を選択。


「ユーザーのメールアドレス」を入力。
「通称」には「iOSアプリのリリース用」的なことを書いておいた方が良い。
「CAのメールアドレス」は空欄で。
「要求の処理は」は「ディスクに保存」を選択。
「続ける」をクリック。


すると、「CertificateSigningRequest.certSigningRequest」というファイルを保存するダイアログが出るので適当な場所に保存。

Safariに戻り、「Choose File…」をクリックして、「Generate」をクリックして保存したファイルをアップロードする。


「Donwload」ボタンをクリックして、「ios_distribution.cer」をダウンロードする。「Done」ボタンをクリックして終了。



2. Distribution用のProvisioning Profileを作成

「Provisioning Profiles」>「Distribution」のタブに移動し「+」ボタンをクリックする。


「Distribution」の「App Store」を選択し、「Continue」ボタンをクリック。


「App ID」でリリースしたいアプリのIDを選び、「Continue」ボタンをクリック。


先ほど作成したProduction用のCertificateファイルを選び、「Continue」ボタンをクリック。


分かりやすい「Profile Name」を入力し、「Generate」ボタンをクリック。


「Download」ボタンをクリックして、「プロファイル名.mobileprovision」をダウンロード。「Done」ボタンで終了。



3. 新規Appの作成

iTunes Connectにアクセス。「マイ App」へ。


「+」ボタンをクリックして「新規 App」を選択。



全て入力必須。「バンドルID」はリリースするアプリの逆ドメインのID、例えば「com.example.exapp」的なものを選ぶ。

「SKU」は、サイトの説明では「App Store では表示されない、App の固有IDです。」となっている。バンドルIDと同じ逆ドメインのもので良いだろう。

「OK」をボタンをクリックして完了する。


4. 「App 情報」の入力

前段階の入力でかなり補完されている。


もし「プライバシーポリシーURL」があれば入力する。

「カテゴリ」は最低でも「プライマリ」は選ぶ必要がある。選択肢は以下だった。


「追加情報」のところの「AppStoreで表示」をクリックするとiTunesが起動する。現状ではクリックしても意味は無い。

最後に「保存」ボタンをクリックするのを忘れずに。


5. 「価格および配信状況」の入力


まず「価格」を選ぶ。

すると「配信可否」が選択可能になる。これは要するに配信国の選択で、初期選択では全世界になっているので、そのままか、適当に減らす。


「Bitcode自動再コンパイル」の設定はアプリによる。デフォルトでは閉じているが、開くとこのようになる。


デフォルトでは「Bitcode自動再コンパイルを使用しない」のチェックはOFFになっているが、必要ならチェックしてONにする。

最後に「保存」ボタンをクリックするのを忘れずに。


6. 「iOS App 1.0」の入力

ここはスクリーンショットなど、バージョンごとの情報を入力する場所だ。



何も入力していない段階から「審査へ提出」ボタンがクリック可能になっているが、クリックするとこのようにエラーになる。


スクリーンショットをアップロードする。仕様はここ。

iTunes Connect App Properties

こちらも参考になる。

Xcode - [デザイナー向け] iPhoneアプリに必要な画像・アイコン - Qiita

3.5インチ用と4インチ用を最低一枚づつ。iPad対応なら、iPad用を最低一枚。iPhone6対応なら最低一枚 and so on。

Cordova系のアプリの場合、4.7インチと5.5インチも自動的に対応になるので、それぞれ最低一枚づつ必要なので注意。

PNGの場合はアルファチャンネル有りではアップロードできないので注意。つまり32bitはNGで24bitはOK。ImageMagickでの24bitへの変換は「convert -type truecolor 32bit.png 24bit.png」で。

あと、アップロードは後ろの方からアップしないと後で自分でソートすることになるので注意。

「キーワード」をコンマ区切りで、「サポートURL」などを入力する。


「概要」は特定の絵文字や記号(ハート、星、音符など)を受け付けないので注意が必要だ。


順番から行くと「ビルド」の項目になるが、ここは重いので後回しにする。


「App一般情報」の各種情報を入力する。


「Appアイコン」は1024x1024のJPGもしくはPNGで、角丸処理をしていない画像をアップロードする。

「レーティング」は「編集」をクリックするとこのようなダイアログが出るので正直に答える。


必要であれば「App Review に関する情報」を入力する。


「バージョンのリリース」を入力する。デフォルトでは「このバージョンを自動的にリリースする」になっているので、リリース日を自分で決めたい場合は他を選択する。


最後に「保存」ボタンをクリックするのを忘れずに。なお、エラーがあるうちは保存できないようなので注意が必要だ。

あと残っているのはこの「ビルド」の部分。残りの作業はXcodeで行う。



7. リリースビルド

まずXcodeでアプリのプロジェクトを開き、General>Identity>Bundle Identifier がiTunes Connect>App 情報>バンドルIDと一致しているか確認する。


Build Settings>Code Signing>Code Signing Identity>ReleaseでiPhone Distributionを選択する。選択肢に出てこない場合は、step1で作ったios_distribution.cerをダブルクリックでキーチェーンに追加して、もう一度確認。


Build Settings>Code Signing>Code Signing Identity>Provisioning Profileで「iOSTeam Provisioning Profile:〜」でない「プロファイル名」を選択する。選択肢に出てこない場合はstep2で作った「プロファイル名.mobileprovision」をダブルクリックして、もう一度確認。


いよいよリリースビルド。Product>Archive。


するとcodesignがキーチェーンへのアクセス許可を求めてくるので許可する。後で何度も求められるので「常に許可」することをおすすめする。


ビルドが成功するとこのようなウインドウが表示されるので、「Upload to App Store」ボタンをクリック。


適切なProvisioning Teamを選択して「Choose」をクリック。


次にこのようなダイアログが出るので「Upload」をクリック。


アップロードが完了するとこんなメッセージが出ることもあるが、気にしない。


アップロードが完了して、iTunes Connect>App 情報>バイナリ へ行くとこのように表示が変わっている。


「〜ビルドを選択してください。」をクリックすると、このようにビルドを選択するダイアログが出るので、適切なバイナリを選択して「終了」をクリック。


すると、ビルドのセクションがこのような表示に変わる。



8. 提出

ページ上部の「保存」をクリック。


「審査に提出」ボタンをクリック。


ページが変わって、初期状態ではこのようなページ表示になる。


「輸出コンプライアンス」は暗号を使っているかどうかを聞いてくる。今回のアプリはhttpsを叩く場合はあるが、特に暗号化する機能はついていないので「いいえ」とした。

「コンテンツ配信権」は著作権関連のことを聞いてくる。今回のアプリは外部APIを使っているので「はい」。すると新たな項目が出てきて、権利関係を完全にクリアしているかどうか聞かれる。当然完全にクリアしておかなければならないので「はい」。


問題なのが広告IDのセクション。広告を使ってないなら、迷わず「いいえ」で終了だが、今回のアプリは広告を使用している。具体的にはAdMobを使用している。メディエーションは無し。

どのように答えるべきかは各所で議論になっているが、今回はこのように選択して審査に通過した。


最後にページ上部の「送信」ボタンをクリックする。元の画面に戻り、アプリのステータスが「審査待ち」になる。


しばらくすると、Appleから審査を受け付けました的な内容のメール(status is Waiting For Review)が届く。

その後、3日〜5日ほどすると審査に入りました的な内容のメール(status is In Review)が届く。

ここまで来ると早くて、問題が無ければ半日もしないうちにリリース待ちです的な内容のメール(status is Pending Developer Release)が届く。

iTunes Connectを確認すると、このようになっているはず。




無事審査に通りますように。GOOD LUCK!お疲れ様でした〜\(^o^)/