こんにちは!代表取締役 兼 AIサービス開発室の鈴木生雄です。
前回の記事では、Sign in with AppleとSupabase Authによる認証の仕組みを紹介しました。今回は、Shoelogのプレミアムプランを支える「アプリ内課金」を取り上げます。
個人の週末開発とはいえ、Shoelogは月額・年額のサブスクリプションを販売する、れっきとした有料サービスです。「お金を扱う機能」と聞くと身構えてしまいますが、Appleが提供する仕組みに乗ることで、決済の難所を回避しながら実装できました。今回はその仕組みと設計を紹介します。
In-App Purchaseとは
In-App Purchase(IAP)は、Appleが提供するアプリ内課金の仕組みです。アプリ内でデジタルコンテンツや機能を販売する場合は、App Storeの規約に基づき、この仕組みを利用することが求められます。
IAPで販売できる商品には、次の4つの種別があります。
| 種別 | 説明 |
|---|---|
| 消耗型 | 一度使用するとなくなり、繰り返し購入できる商品(例:ゲーム内通貨) |
| 非消耗型 | 一度購入すれば永続的に利用できる商品(例:広告の除去、機能の解放) |
| 自動更新サブスクリプション | 期間ごとに自動的に更新・課金が継続されるサブスクリプション |
| 非更新サブスクリプション | 一定期間のみ有効で自動更新されず、継続利用には再購入が必要なサブスクリプション |
Shoelogのプレミアムプランは、このうち自動更新サブスクリプションとして提供しています。
ここで重要なのは、決済処理はApp Storeが行うため、アプリ側で決済情報を扱う必要がないという点です。クレジットカード番号のような決済情報は、利用者とAppleの間で完結し、Shoelogには一切渡ってきません。前回の認証の話で「パスワードは持たなければ漏らしようがない」と書きましたが、決済情報も全く同じです。センシティブな情報をプラットフォームに任せられるのは、IAPという仕組みの大きな利点だと思います。
無料プランとプレミアムプラン
Shoelogでは、無料プランとプレミアムプランの二つの利用形態を設けています。
- 無料プラン:登録できる靴は3足まで
- プレミアムプラン:靴の登録数は無制限
プレミアムプランには月額プランと年額プランがあり、いずれも自動更新型のサブスクリプションです。

「3足まで無料」という線引きには理由があります。3足あればひとまずローテーションは組めるので、無料の範囲でもアプリの価値は体験できます。しかし、革靴が好きになってくると、所有数は必ず3足では収まらなくなるのです(私が保証します笑)。アプリを気に入って使い込むほど自然にプレミアムプランが視野に入る、という設計にしました。
商品購入の流れ
続いて、購入処理がどのように動いているかを紹介します。

まず、アプリの起動時および商品購入画面の表示時には、App Storeから現在の権利を取得して確認します。検証済みの自動更新サブスクリプションが存在する場合はプレミアムプランが有効となり、有効な権利がない場合は無料プランとして動作します。
購入の際は、利用者が商品購入画面で月額または年額のプランを選択すると購入処理が開始され、決済はApp Storeが行います。購入が成功し、その結果が検証済みであればプレミアムプランへ遷移します。利用者が購入を取りやめた場合は、無料プランのままとなります。
また、商品情報を取得できない場合や、検証の失敗、通信エラーなどが発生した場合は、エラーメッセージを表示したうえで、閉じるまたは再試行を選択できるようにしています。
主要シナリオの外側にも対応する
状態遷移図に示した主要なシナリオのほかにも、実際の運用では次のようなケースへの対応が必要です。
- 購入の保留:保護者による承認待ちなどの理由で、購入がすぐに確定しないケース
- 購入の復元:機種変更や再インストールの後に、購入済みのサブスクリプションを取り戻すケース
Shoelogではこれらのケースにも対応しています。「買う」「買わない」だけを考えていればよいわけではないのが、課金機能の奥深いところです。特に「購入を復元」は、Appleの審査でも実装が求められる重要な機能です。
実はこのアプリ内課金、後にApp Storeの審査で私を大いに苦しめることになるのですが……その顛末は連載の最終回、ストア公開編でたっぷりお話しします。
次回予告
次回は、公開後のアプリを見守る仕組み「オブザーバビリティ」を取り上げます。App Storeで公開したアプリは、開発者の手元を離れた無数の端末の上で動きます。そこで起きた不具合をどうやって検知し、原因を調べるのか。Shoelogに導入したSentryというサービスを紹介する予定です。お楽しみに!
