In App Purchase 概要

ここ数日間、iPhone の In App Purchase について、iTuneConnect の申請処理を行ってみたり、調べ物を
してみたり、サンプルの実装をしてみたりしていました.

着手当時に想像していたよりも、もめんどくさかったり、わかりづらかったりすることが多かったので、数回に
分けて気づいた点などをまとめてみたいと考えています.

おそらく、3〜4回ぐらいに分割してエントリーを書くことになると思います.


こんなところで、アプリ開発者の個々人が悩んでいても仕方がないので情報共有できればと思います.

...間違えている部分や、勘違いしている部分も多いかと思いますので、気づいた点があればコメントをお願いします.

それでは、第一回目として大まかな概要から

できること概要

基本的には、Appleは課金処理の代行しか行ってくれないため、追加データのダウンロードを行う場合などには、自前でダウンロードサーバを立てる必要がある.

また、アイテムの種別によっては、購入後に課金情報の問い合わせが行えない場合があるため、アプリ内Shopの機能要件によっては、ダウンロードサーバ上でユーザ管理などが必要になることもある.

アプリ内での課金アイテムの一覧表示なども、アプリ開発者側が実装を行う必要があるが、最終的な課金確認画面はOS側が表示を行ため、料金を実際よりも低く表示しておいて、実際には高額な課金を行うようなフィッシングまがいのアプリの実現は難しい.

以前は、(アプリ本体が)有料アプリのものかアプリ内課金を行うことができなかったが、(2009.10.1)現在はアプリ本体が無料アプリでも課金処理が行えるように規定が改訂されている.

課金形態

課金形態は、主に次の3種類に分けられている.

  • Consumable
  • Non-Consumable
  • Subscription

Consumable なアイテムは、ゲーム中で一度使うと無くなってしまうようなアイテムに対応する課金形態となる.
ユーザは、複数個のアイテムを同時購入することができ、購入した履歴は Store 上に残らない.
このため、必要に応じてアプリ内で履歴の管理を行う必要がある.
また、一度購入したアイテムを、再度購入する処理を行った場合、「一度購入したアイテムですが購入しますか?」といった確認画面を(OS側で)表示して、OKの場合には実際に課金処理が実行される.

Non-Consumable なアイテムは、一度購入したら利用し続けられるようなアイテムに対応する課金形態となる.
ユーザは、1個しかアイテムを購入することができず、購入した履歴は Store 上に残る.
Store上の履歴は、後から何度でも確認処理をおこなうことができるため、復帰手段(Storeへの確認処理)を用意しておけば、それほどセンシティブな実装を行う必要は無いと思われる.
アプリ実装者にとっては、利用しやすい課金形態だと思う.

Subscription は、利用できる期間が限定されているアイテムに対応する課金形態となる.
購入した履歴は Store 上に残らないので、後から課金の確認を行うことができない.
端末上の時刻は、実時間とマッチしているとは限らないため、まともな Subscription 契約アイテムの配信を行うためには、(自前の)サーバ側での認証作業が必要になると思われる.

iアプリの月額課金のような*自動引き落とし*の仕組みは、用意されていないので同じような仕組みを実装したい場合には、Subscription を利用して、自前で機能の実装を行う必要がある.

制限解除の実装について

お手軽にアプリ内課金を行う第一候補としてあがるのが、制限解除型の課金形態だと思われる.
アプリ内部に、全ての機能を実装しておき、解除キーだけをストアとやりとりする形態.

追加データは、アプリ配信時から(アプリ内部に含める形で)用意する必要があるが、特別なダウンロードサーバーなどを用意する必要は無い.

アプリ配信時には、想定していなかった新機能の追加や、(配信時に用意されていない)追加データの対応の為には、アプリのバージョンアップが必要になってしまう点が欠点だが、ダウンロードサーバなどを特別に用意しなくても実現可能なのが大きな利点となる.

制限解除に期間などをもうける必要がなければ、Consumable な形態でアイテムを販売すれば、アプリ内から直接 ITuneStore に購入履歴の確認が行えるので、それほど複雑な実装を必要としないと思われる.

iTuneStore に購入履歴の問い合わせが行えるか否かという点は非常に重要で、問い合わせが行えない(Consumable / Subscriptionに該当する)場合、ユーザが iPhone から直接アプリをダウンロードしてアイテム課金を行った後に、iTuneでバックアップをとる前に、アプリを削除してしまった時には、開発者が独自に管理するサーバ上で購入履歴を管理しない限り、購入履歴の復帰が行えなく(難しく)なってしまう.

コンテンツダウンロード型の実装について

買い切りの、電子書籍などの、コンテンツを追加データとして配信する形態.
追加データを入手するためのサーバは、自社で用意する必要があるという欠点を持つ.

Non-Consumable で課金アイテムの配信を行っているのであれば、購入履歴を(開発者が用意したサーバ等を用いて)別途管理する必要は無いが、
再ダウンロードが必要となるのは言うまでもない.

サブスクリプション型の実装について

1週間だけ利用できる等と行った、定期的な購読権を販売する形態.

アイテムの再購入を行うことによって、購読期間の延長などが行えるが、根本的にアプリが単体で取得できる時間は、ユーザ設定によって変更できてしまうので、購読権の確認は別途開発者が用意したサーバ上で行う必要がある.

レシートの発行と購入の履歴について

すべてのアイテムは、購入処理後にStoreからレシートが発行される.
購入時にStoreから送られてくる、レシートは暗号化されており、フィッシングなどが行われないように、受け取ったレシートを(アプリが)Appleのレシート検証サーバに送るによってデコードされた実際のレシートが手に入る.

レシートのデコードの処理は意外とめんどくさいので、プログラマはなめてかからないこと.

なんども、書いていることだが Non-Consumable なアイテムに関しては、後から Store に履歴の問い合わせを行うことで、レシートの再発行を行うことができる.
Consumable や Subscription なアイテムは、再発行されないので、受け取ったレシートは適切な手段で保管するようにすること.

表示される言語や値段に関して

ユーザが利用するAppStoreに対応した言語(自分で登録する)を利用して、表示言語や値段表示が取得できるので、アプリケーション側で特殊なローカライズを行っているのでなければ、それほど気にする必要は無い.

ローカライズされた説明文の取得/ローカライズされた価格表記の取得等が行えるので、プログラマも必要以上に警戒する必要は無いと思う.

(補足1) type が Consumable のとき、再購入した場合の挙動

[購入]ボタン押下後、

このアイテムはすでに購入済みです.
もう一度購入しますか?

という表示が出る.
そこでも、購入すると(ユーザに課金が発生する)購入処理が行われる.

(補足2) type が Non-Consumable とき、再購入した場合の挙動

[購入]ボタン押下後、

このあいてむはすでに購入されています.
もう一度無料でダウンロードするには「OK」をタップします.

という表示が出る.
「OK」を押すと、購入処理.

アプリ実装者は、再ダウンロードといっても Transaction のステートが、SKPaymentTransactionStatePurchased になっている点に注意.

(補足3) type が Subscription のとき、再購入した場合の挙動

この購読はすでに購入済みです.
購入をタップして更新または延長する.

という表示が出る.
「OK」を押すと、ユーザに課金が発生する購入処理が行われる.
購読期間の管理手段などは、開発者側が用意する必要がある点に注意すること.

参考資料

『In App Purchase Programing Guid』
Apple が公開しているドキュメント

http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html

から入手可能可能.(日本語訳も出ている)

さらりと重要なことが書いてあるので、頭から最後まで一通り目を通しておく必要がある.


iPhone SDK 3 プログラミング大全』(p.289 〜 )

いろいろと間違えていたり、手を抜いている部分が多いので、鵜呑みにすると痛い目に遭うけれども、右も左もわからない状態だったので、基礎調査の足がかりとしてとても参考になりました.

一度目を通しておくと、良いことがあるかもしれませんが、購入してまで手元に置いておく価値があるかといわれれば、すこし悩んでしまいます.

日本語で In App Purchase に関連した参考書は少ないので、そういった意味では貴重だと思います.

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)

『iPhoneDev-jp 「目的別インデックス: アプリ内課金がしたい」』
http://iphone-dev.jp/modules/pico/index.php?content_id=24

iTuneConnect 周りに関する情報が、少しだけ入手できます.
量も少ないので、ざっくり目を通してみると良いです.

次回予告

iTuneConnect 上での登録作業などについて書く予定です.