2016年11月15日

[開発者向け] とりあえず アプリ配ろう Ad Hoc

 週報 にも書いたとおり、やっと iOS 版 Chronus も実機での最低限の動作検証はできるようになったので、ハードウェア担当の戦民思想さんにもお渡しする事になりました。
 Android 版の時から、戦民思想さんや関係者の方への配布には DeployGate を使わせてもらっていますが、配布するには配布可能なパッケージ (iOS アプリの場合は ipa ファイル) を作らないといけないので、そのために最低限必要な物と手順のまとめです。

 ちなみに、ネットを探せばこの手の記事はいくらでもみつかりますが、Apple 先生はとにかく仕様や設定画面をコロッコロッコロッコロ変えやがるので、ノウハウ記事を読んでも話半分程度にしか役に立ちません。この記事もどうせすぐ時代遅れになるでしょうが、2016/11 現在の、極力自分で実際に試した上での覚え書きです。

ipa を作るために必要なもの
 一昔前は、iOS 開発に手を出したはいいものの、何も分からんのに謎の証明書とか次々作らされて詐欺にでも遭ってる気分になったもんですが、今の Xcode ではその辺がほぼ自動化されて、証明書とかほとんど意識しなくてよくなったみたいですね。
  1. Xcode の Preference > Account から開発者アカウントを登録
  2. プロジェクトのターゲット設定の General > Automatically manage signing をチェック
  3. その下にある Team を自分のアカウントにする
さえ設定しておけば、あとは Xcode が裏で勝手に Apple Developer のサイトにアクセスして、必要な証明書とかを勝手に作ってくれます。

 でも結局、アプリを開発してると Apple Developer のサイトで手動で設定しないといけないケースも出てくるので、何が何のために存在しているのかくらいは知っておいた方が後々混乱しません。なのでとりあえず、アプリを配布可能にするまでに最低限必要な概念だけでも軽く。
Apple Developer Program
  • 開発した iOS などのアプリを、App Store 等で配布、販売するために必要な Apple との契約。1年間有効で、2016/11 現在、個人契約で ¥11800 / 年。
    なお、アプリの開発や自分の端末での起動だけなら、無料でも可能。
  • 登録方法
    Apple Developer Program から登録手続き。
  • 期限が切れるとどうなる?
    App Store で公開中のアプリは契約を更新するまでダウンロード不可になり、アプリの申請やアップデートなども当然できなくなる。すでに端末にインストール済みのアプリは引き続き使えるとのことだが、各種サービスがどこまで使えるかは不明。
iOS Development 証明書
  • iOS アプリを実機で起動する際に必要な証明書。これがなくてもシミュレータでの起動は可能。以前は Developer Program に契約してないと実機で起動できなかったが、今は Apple ID だけで実機で起動できるらしい
  • 入手方法
    以前は Apple Developer サイトの Certificates で作成する必要があったが、現在では初めて実機で起動する際に自動的に作られる。以前は Mac のキーチェーンアクセスで CSR という物を準備する必要があったが、それも自動化された模様。
  • 期限が切れるとどうなる?
    実機で起動できなくなる。といっても、作り直せばいいだけ。
iOS Distribution 証明書
  • 開発したアプリを配布可能な ipa 形式に出力する際に必要な証明書。Developer Program 契約をしてないと作れない。
  • 入手方法
    以前は Apple Developer サイトの Certificates で作成する必要があったが、現在では初めて ipa を Export する際に自動的に作られる
  • 期限が切れるとどうなる?
    Export ができなくなる。といっても、作り直せばいいだけ。この証明書の期限が切れると、後述の Provisioning Profile も無効になるので、そちらの修正も必要。
App ID
  • 公開するアプリのIDを Apple に登録する手続き、と思いがちだが、正確には、そのアプリが利用したい Apple 提供のサービスの登録。Apple 提供のサービスを特に使わないアプリであれば、いちいち個別のIDを登録する必要はない。
  • 登録方法
    以前は Apple Developer サイトの Identifiers で登録する必要があったが、現在ではアプリのターゲット設定の Capabilities に何かを追加した際に自動的に登録される
    特に何もサービスを利用しない場合、個別の App ID は登録されず、デフォルトの * というIDでひとからげにされる。
  • 期限なし
デバイスリスト
  • アプリを起動できる端末のID (UDID) のリスト。App Store のアプリは、インストール時にその端末のIDが書き込まれ、それ以外の端末では起動できなくなるが、App Store 以外での Ad Hoc 配布については、このリストの端末でのみ起動できるようになる。なので、知人に直接配布する場合なども、あらかじめ端末のIDを登録しておく必要がある。
  • 登録方法
    Apple Developer サイトの Devices で登録する必要があるが、Xcode で実機起動に使った端末は自動で登録されたはず(検証不能なので無責任でスンマセン)。手元にない端末については、相手に UDID を問い合わせて手動で追加する。
  • 期限なし
    ただし、登録は100台までで、不要な端末IDの削除は年に1度しかできない ので、登録は慎重に。
Provisioning Profile
  • 上記の Distribution 証明書、App ID、デバイスリストを1つにまとめた設定ファイル。最終的にアプリにはこのファイルで書き込まれる。
    また、デバイスリストの中から、配布したい人を選択できる機能もある。
  • 入手方法
    以前は Apple Developer サイトの Provisioning Profiles で作成する必要があったが、今では ipa を Export する際に、必要に応じて自動で作られる。App ID が * の場合は、Provisioning Profile も使いまわされる。
    なお困った事に、現在の通常手順では ipa に組み込む Provisioning Profile を Xcode が勝手に決めてしまう ので、自前で用意した Provisioning Profile を組み込むのがかなり面倒な模様。意味わからん。迷惑極まりない。
  • 期限が切れるとどうなる?
    Export ができなくなる。といっても、作り直せばいいだけ。
 てことで、まとめると、一般的なアプリであれば、必要な証明書などは Xcode が全部勝手に作ってしまいます。開発初期はありがたいのですが、勝手すぎてだんだんイラっときます。
 Apple の提供する各種サービスを使用する際にはさらに他の証明書やら必要になるみたいですが、その辺はまだ未経験なので、ここでは書きません。

 それと、少なくとも上記については、期限が切れたとしても作り直せばいいだけで、「証明書が違うと別アプリ扱いになる!」みたいな怖い事はなさそう です。実際、検証中に何度も証明書を作りなおしましたが、アプリIDさえ同じなら同じアプリとして扱われています。
 アプリを認証するための仕組みかと思ってましたが、Developer Program の期間終了後にタダ乗りさせないための方がメインなんですかね。
で、配布可能なパッケージ(ipa) の作り方
 という事で、何が必要なのかは分かったところで、肝心の ipa の作り方です。App Store での配布版の作り方については、またリリースする時に詳しく調べますので、とりあえずは今必要な、DeployGate やメール等で配布してインストールできる Ad Hoc 配布版 ipa の作り方。
  1. まずはアプリを作って、Xcode から実機で問題なく起動できる事は確認しとく。
    ここまでの過程で Development 証明書と App ID(必要な場合のみ)は作られてるはず。
  2. Xcode の ターゲットデバイスを Generic iOS Device に変える。(※これにしないと次の Archive が選択できない)
    20161115a.png
  3. Xcode のメニューの Product > Archive を実行すれば、まずはアプリに必要な物を全部固めただけの Archive って物が作られる。出来上がった Archive はメニューの Window > Organizer のウインドウで管理する。
  4. Organizer のウインドウで出来上がった Archive を選択して、右の Information 欄にある Export を押す。
  5. Export のダイアログで Save for Ad Hoc Deployment を選択。
    このあとにチームを選択すると、Distribution 証明書や Provisioning Profile も必要に応じて自動的に作られる。というか、あらかじめ用意してても無視して勝手に押し付けられる(用意した物が使われる事もある)。何とかならんのコレ?
  6. 以後、基本的にデフォルト設定で問題ないはずだけど、一応内容は軽くは確認しつつ、肯定ボタンを押していく。最終的にファイル保存になるので、保存すれば ipa 完成。
  7. 出来上がった ipa は、Xcode の Window > Device のウインドウを開いて、接続中の実機を選択し、Installed Apps のところに ipa を放り込めばインストールできる。DeployGate で配布したい場合も、ログインして ipa をドロップするだけ。
注意点1:デバイスリストは登録済み?
 前述したとおり、Ad Hoc で配布するアプリは、Apple Developer サイトの Devices に登録されてる端末でしか起動できないので、配布する全員の端末の UDID をあらかじめ収集しておく必要があります。端末の UDID は iTunes 等でも確認できますが、DeployGate を使っているのであれば、招待に応じる際に自動的に UDID も収集してくれるようなので、活用させてもらいましょう。
注意点2:Export に時間かかりすぎじゃね?
 Export の処理中に、Compile Bitcode と出たまま、やたら待たされると思うのですが、Summary の画面で Rebuild from bitcode のチェックを外せば、大幅に時間短縮はできます。
20161115b.png
 イマイチ自信ないですが、これをチェックすると、App Store での正規インストール時と同じく、bitcode からビルドしなおしたアプリが出来上がる、という事みたいなので、開発末期はともかく、毎回チェックする必要はなさそうな気はする。そもそも、こんだけ待たされるのに (ウチでは10分近く) 調べてもほぼ情報がないんだけど、ひょっとして遅いのウチだけの問題なん?
 あと本来、bitcode ってインストール先の端末に向けて最適化ビルドする物だと思うんだけど、この場合いったい何に向けてどうしてるのか色々と謎。でも何かは最適化されるようで、ipa のサイズはだいぶ小さくなるし、謎は増えるばかり。
 てことで、簡単にですが手順だけ書いてみましたが、最初に書いたとおり、Apple 先生はしょっちゅうルールをひっくり返すので、もし書いてある項目とか見当たらないなら、諦めて他のもっと新しい情報を探してくださいね。
 とりあえず公式ドキュメントと、ビルドに関する情報の更新は速いであろう、DeployGate のヘルプを紹介しておきます。DeployGate のヘルプはいつも簡潔かつ親切で、すごく助かる。
App Store 版と Ad Hoc 版、Debug 版を別アプリ扱いにしたい
 特に何も設定しなければ、 Xcode から直接起動する Debug 版も、App Store からインストールした正式版も同じアプリID (=Bundle Identifier) ですので、端末上では同じアプリとして扱われ、お互い上書きされてしまう事になります。でも、開発版と正式版は別のアプリとしてインストールしたいですよね。Android の時もそんな記事を書きましたが、それの iOS 版。

 調べてみたところ、よさげな以下のページを見つけたのですが、これを試してみようとしたところ、なんと現在の Xcode はもっと便利になってて、悩む間でもなかったという。
20161115c.png
 現在の Xcode のターゲット設定の Build Settings では、 Product Bundle Identifier の値は Debug / Release で個別につけられるようになってますので、これを変えるだけでOKでした。Ad Hoc 版も変えたければ、新しい Configurations を増やせばいいですね。

 アプリ名についても、すぐ下の Product Name で同様につけかえられますね (※この方法ダメでした。詳しくは後述)
 ただアプリ名については、Info.plist の Bundle name (CFBundleName)をローカライズしてしまうとそれで上書きされるので、結局変えても意味ないんですけどね。いろいろ試してみたものの、結局ローカライズしつつプレフィックス等をつける方法は分かりませんでした。.strings で #ifdef DEBUG とか使えたら便利なんだけどなぁ。

 あともうちょい下には、アイコンも Debug / Release で変えられそうな項目もありますね。でもこの指定方法だと、使ってない方までアプリに含まれそうな気がするんだけど、どうなんだろう。


【11/20追記】
 Product Name を変えると、その名前に引きずられて Product Module Name とか Private Header Path とか いろんな物が勝手に Debug / Release に分けられてしまい、いろいろ問題が起きそう な事が分かりました。特にモジュール名は致命的で、Interface Builder でのクラス指定が使い物にならなくなります。Product Name は迂闊に変える物じゃないですね。

 なのでやっぱり、上の参考サイトの手法に戻って、Build Setting に独自項目を追加し、それを Info.plist 上で組み合わせる 手法に変えました。Product Bundle Identifier も同じ手法にした方が管理しやすそうなので、同じ手法にしましょう。
  1. プロジェクト設定 (※ターゲット設定じゃない) の Build Settings に、User-Defined の項目として、BUNDLE_ID_SUFFIX と、BUNDLE_NAME_PREFIX を新規追加。項目名は分かりやすければ何でも構いません。
    他のターゲットでも (例えば有料版と体験版で) 同じ事をしたいはずなので、ターゲット別の設定ではなく、プロジェクトの共通設定にしました。
    20161120a.png
  2. Info.plist の Bundle identifierBundle name に上記を連結させる。
    20161120b.png
    なお、この場合についても、アプリ名をローカライズしてる場合は結局それが上書きされるので、ここで変えても意味ないですよ。使い勝手の悪い仕組みだなぁ。
posted by ひこざ at 23:59| Comment(0) | 開発 - iPhone
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。