Still Life

残念IT系母ちゃん。旦那さん、娘1歳、猫の4人暮らし。

アプリ内課金の実装を目指しつつ、ProvisioningとかAdHocとかよくわかんないなりにまとめてみる(2)

前回は、アプリケーション登録、プロダクト登録と順当に進んできたつもりでした。公式資料のサンプル通りのプログラムにしたつもりなのに、いざ実行してみると思うように動かない。

最初に、プロダクト情報をストアにリクエストして、そのレスポンスを、お店に商品を並べるように画面上に陳列する必要があります。ストアから買える状態かどうか確認しないで、勝手にお店広げちゃいけないわけです。

いきなりこのレスポンスが帰ってこない。全部「今買えない状態の商品リスト」に入ってきてしまいます。

わたしの手元の「In App Purchaseプログラミングガイト」(2010-06-14版)では、

- (void)productsRequest:(SKProductsRequest *)request 
didReceiveResponse:(SKProductsResponse *)response {
    NSArray *myProduct = response.products; // UIを埋める [request autorelease];
}

となっているメソッド内で、

response.invalidProductIdentifiers

配列に入って来てしまうのです。


適当に登録したアプリケーション登録がマズいのでしょう。どのように登録したのか、おさらいします。

再び、アプリケーション登録

前回初めて行けるようになったiTunes Connectページから、「Manage Your Applications」ページへ行きます。
f:id:Aodrey:20110529212047p:image:w320


画面左上に追加ボタンがあるので押します。
f:id:Aodrey:20110529214606p:image:w320

大事なアプリ名を入力、次にユニークになる名前(...Numberって書いてありますね・・・英字で通りましたよ)を入力します。そして、Bundle IDですが、
f:id:Aodrey:20110529214950p:image:w320

既に登録していた、「*」のついたIDがてっぺんにあり、いかにも汎用的に使えそうな雰囲気だったので、これを選択したところ、Suffixの入力項目が登場。ここに適当な文字列を入れちゃった。
f:id:Aodrey:20110529214947p:image:w320

あとはどんどん入力して「続き」ボタンを押していきます。
f:id:Aodrey:20110529214945p:image:w320
f:id:Aodrey:20110529214942p:image:w320
f:id:Aodrey:20110529214940p:image:w320

撮影用に「ほげほげ」アプリを作ったので、ちーちゃんをアイコンとスクリーンショットにしてみました。
f:id:Aodrey:20110529214937p:image:w320

無事アプリ登録が出来た様子です。
Bundle IDもしっかりふられています。適当につけてしまいましたが、実はこのIDが結びつく先が必要なのです。あとでこのIDを参照しますので、このページに表示されていることを覚えておいてください。

バイナリをアップロードしていないので、状態が「Prepare for Upload」になっています。バイナリファイルをアップロードしない状態では、3ヶ月だったかな?しかアプリケーション情報を維持できないので、急いで実装を済ませましょう(笑)
f:id:Aodrey:20110529214933p:image:w320

再び、プロダクトの登録

今回の記事で注目したいところとはズレてしまいますが、せっかくスクリーンショットを撮ったのでプロダクトの登録の仕方も載せます。

さきほど登録したアプリケーションの画面の右上に、「Manage In-App Purchases」ボタンがあるので、それをクリックします。
f:id:Aodrey:20110529223615p:image:w320

追加ボタンを押すと、商品のタイプを聞いてきます。サービスなのか、コンテンツなのか、購読型なのかといった4種類の提供形態から選べるわけです。
わたしはゲーム内で使用するアイテムを売りたいので、「魚釣りアプリの魚のエサみたいなやつ」と言っている、「Consumable(消耗型)」ということになります。
f:id:Aodrey:20110529221857p:image:w320

いよいよ商品情報を記入していきます。Reference Nameは適当でいいのですが、Product IDはコーディングのときの手がかりになるIDなので、慎重にネーミングします。自分のプログラムでマスター登録している場合は、このIDを登録しておくと扱いやすいです。また、商品の登録に失敗したからといって削除すると、もう二度と同じIDが登録できないようなので、注意です。
f:id:Aodrey:20110529221855p:image:w320

次がちょっとわかりづらいのですが、Add Languageボタンを押して、言語ごとの商品情報を登録します。販売したい言語全てに対して1つ1つ追加しないといけないようです。グローバルに販売したい人には面倒ですね。
ここでは、実際に画面に表示される商品名と商品説明を入力します。
f:id:Aodrey:20110529224544p:image:w320
これらの値は購入可能商品を取得するときに全て引っ張って来れる情報なので、アプリの画面に表示させることを念頭に内容を決めるといいでしょう。

価格帯を選択します。1つ選択すると、下に各国通貨でいくらなのかが表示されるのでわかりやすいです。
f:id:Aodrey:20110529224541p:image:w320

スクリーンショットは、テストが終了して審査をしてもらうときに必要なので、まだアップロードしません。最後のSaveボタンを押して終了です。
f:id:Aodrey:20110529224537p:image:w320

商品がアプリケーションに追加され、「Waiting for Screenshot」状態になっていればバッチリです。
f:id:Aodrey:20110529225141p:image:w320

Bundle IDに何を選択すべきだったのか

プロダクト登録に夢中で忘れそうでしたが、アプリケーション登録で適当に済ませてしまっていた、気がかりな部分がありました。Bundle IDです。ここは何にすべきだったかというと、Provisioning Portal画面で設定する、アプリケーションのプロビジョニングと一致していないといけなかったのです。


そんなの登録してない!


というわけで、登録しに行きます。

画面はかなりさかのぼり、iOS Dev CenterからiTunes Connectの上にある「Provisioning Portal」に行きます。
f:id:Aodrey:20110529230938p:image:w320
ここの画面は、いろんな単位ごとに発行される各種証明書を管理するページです。(・・・という理解をしています。)
上からリンクを順に見ていきます。
まず「Certificates」。これは開発者自身の証明書情報です。
「Devices」ページでは、開発用のデバイスを登録します。
「App IDs」は、アプリごとの情報を登録します。
「Provisioning」は、今までのページで登録したデバイス情報とアプリ情報とを組み合わせて、証明書を作成します。このページは「Development」タブと「Distribution」タブがあります。「Distribution」タブではAdHocを作成するときに使うので、まだコーディング中の今回は「Development」タブでの作業になります。



それでは、App IDsをクリックしてアプリの登録をしましょう。
おそらく本来はアプリケーション登録よりも、こちらを先に行うのが普通だと思いますので、よかったら先にやってね。(今更...)


右上のNew App IDボタンを押して、登録スタートです。
f:id:Aodrey:20110529235007p:image:w320

Descriptionは、アプリの識別子としてわかりやすい一般的な名前をつけます。
Bundle Seed IDは、Generate Newにしておきます。10桁の英数字が割り振られます。
Bundle Identifier。これこそがアプリケーション登録で適当に名付けてしまった部分のことです。
確実に一致させるために、App Informationのページから、Bundle IDをコピーしてそのまま貼付けてください。

本来はここで、画面上の例に出ているように、ドメイン名を逆につけて、アプリ名を最後につけるような命名のしかたで、名付けるようです。そうすると、アプリケーション登録時、Bundle ID項目にちゃんと選択肢として出てきます。

設定後のApp IDはたとえば、1A2B3C4D5E.jp.co.company-name.hogehogeという感じになります。

続いて、Provisioningを作成します。
Provisioningのページに行くと、おそらく「Team Provisioning Profile」という行が既にあるのではないでしょうか。
さきほどアプリケーション登録時に選択できた、「汎用チックなBundle ID」の正体はこいつなのです。
アプリ内課金以前のアプリ開発状態では、このプロビジョニングでこと足りていたのですが、アプリ内課金の局面でいよいよきちんとしたアプリの登録が必要になったというわけです。


さて、新たに作成するので、右上の「New Profile」ボタンを押します。
f:id:Aodrey:20110530001209p:image:w320
また似たような項目に入力させられますが、注意すべきは、App IDでさきほど作成したアプリを選択するのと、Devicesでテストをしたいデバイスを全て選択しておくことです。

Submitすると、Provisioningの一覧が追加されることでしょう。StatusがPendingになってるかもしれませんが、再読み込みすれば、すぐにActiveになると思います。その右にDownloadボタンが出現するので、クリックしてProvisioningをダウンロードします。

ダウンロードしたProvisioningファイルは、ダブルクリックすることで適用されます。環境によって違うのかわかりませんが、わたしの環境ではxcodeのオーガナイザが自動的に立ち上がり、適用されたProvisioningファイルを確認することができます。

これで、サイト上での登録は終了。お疲れさまでした!

まだやることが・・・

最後の一歩です。
先ほど登録したApp IDと、現在実際に動かしているアプリとを結びつけなければいけません。
これを設定するのが、アプリプロジェクト内のinfo.plistファイルです。
実際のファイル名は「プロジェクト名-info.plist」です。
f:id:Aodrey:20110530004702p:image:w320
ここの、Bundle identifierキーの値に、Bundle IDをコピペして指定します。


もうひとつ、xcodeの左のツリーから、「ターゲット」内のアプリ名のファイルを選択し、「情報」ボタンをクリックします。「ビルド」タブから「コード書名 ID」の値の部分をクリックすると、登録されているProvisioningやAdHocがずらりと出てくるので、さきほど作成したProvisioningを選択します。
f:id:Aodrey:20110530004700p:image:w320
写真ではさんざん例として使って来たhogehogeではなくてすみません。

さあこれで全て完了です。ビルドし直して実行してみます。
ちなみに、info.plistのBundle IDを変更してしまったので、インストール先では別アプリとして認識されてしまうことに注意です。変更前に動かしていたアプリがデバイスに残っているようなら、削除してしまったほうが良いです。

まだアプリ内課金の商品が取得できないようでしたら、もう一度、各所で設定したBundle IDが一致しているか確認してみてください。
わたしは「一度成功したのに、いろいろ他のこともしてたらまたできなくなった」という現象が発生しましたが、デバイス内のアプリを削除して入れ直したところ、再びできるようになりました。