Open4

StoreKit: お試しオファーの条件

kabeyakabeya

StoreKit2でのお試しオファーの条件がいま一つ分かりにくい気がしています。

https://developer.apple.com/jp/documentation/storekit/in-app_purchase/subscriptions_and_offers/implementing_introductory_offers_in_your_app/

このドキュメントがStoreKit1のときのもの、というのもちょっと問題なんですよね。
StoreKit2版も用意して欲しい。

ともかくこのドキュメント、いくつか難解な部分があります。

まず、無料トライアルのところにある以下の説明が難解です。

サブスクリプションの新規登録者は、一定期間、無料でコンテンツにアクセスできます。サブスクリプションはすぐに開始されますが、無料トライアル期間が終了するまで請求が行われることはありません。

例えば年払いのサブスクリプションの場合で、1ヶ月無料とした場合、1/1に開始したとしたら、最初の請求がいつで、次の請求がいつになるのでしょうか。
サブスクリプションがすぐに開始されるなら、サブスクリプションの期間は1/1〜12/31で、最初の請求は無料トライアル期間が終了した直後の2/1になり、次の請求は翌年1/1になる気がしますが、果たしてそうなんでしょうか。
無料お試し期間というならそのお試しが終わったあと2/1〜1/31の1年のサブスクリプションになる気がするんですけども。

期間の絵が描いてあるのに、そのあたりが説明されていないんで困ります。
(絵を描いてみました!ってだけの絵ですね…)

次いで、このドキュメントには「利用資格を判断する」という項目があって、レシートを使ってApp側で判断する、というようなことが書いてありますが、これも分かりにくい。

これ自体はStoreKit1のときの説明なんですが、「App側で判断してください」なんですね。ところが実際、お試しオファーが使えるかどうかはApp Store側でも判断しているんですよね。

要はおそらく、App Store側でお試しオファーが使えるかどうかは判断しているんだけど、AppのUIでお試しオファーが使えるようなことを書いてしまうと、ユーザ体験が損なわれますよ?みたいなことなんだろうと推測します。それで、App Store側と同じロジックを使って判断してね、というような話なんでしょうね。これが分かりにくい。

StoreKit2になったら、わざわざレシート(トランザクション)を細かく見ずともSubscriptionInfoisEligibleForIntroOfferというプロパティがあるので、これを見れば良いようです。

次いで、以下が非常に分かりにくい。

  • サブスクリプションの新規登録者は、常に利用できます。
  • サブスクリプションを中断していた登録者が更新する場合は、以前にそのプロダクト(または同じサブスクリプショングループのプロダクト)でお試しオファーを利用したことがなければ、利用できます。
    既にサブスクリプションを利用中の登録者は、同じサブスクリプショングループのプロダクトでお試しオファーを利用することはできません。たとえば、登録者が別のプロダクトのサブスクリプションをアップグレード、ダウングレード、またはクロスグレードする場合、過去のお試しオファーの利用の有無に関わらず、利用資格はありません。
  • サブスクリプションを利用中の場合、お試しオファーは利用できません。
  • あるサブスクリプションの利用中状態から、アップグレード、ダウングレード、クロスグレードで同じサブスクリプショングループの別のサブスクリプションに切り替える場合もお試しオファーは利用できません。
  • サブスクリプションの契約期間が満了して終了した場合、もしくはサブスクリプションを途中解約した場合など、サブスクリプションを過去に利用したけども現在利用していない場合は、以前に同じサブスクリプショングループのサブスクリプションでお試しオファーを利用したことがなければ、お試しオファーが利用できます。過去に一度でも同じサブスクリプショングループのお試しオファーを利用したことがあれば、利用できません。
  • 同じサブスクリプショングループのサブスクリプションを今までに利用したことがなければ、お試しオファーが利用できます。

最後に以下の部分も分かりにくい。

お試しオファーを表示する
ユーザーのお試しオファーの利用資格を判断したら、App Storeに利用可能なプロダクトをクエリし、ユーザーにオファーを提示します。

これを読むと、お試しオファーを提示して、ユーザがその適用を選ぶ場合のみ、オファーが適用されるように読めるのですが、実際の動きやAPIの仕組みとかを見ると(自分が見ているのがStoreKit2だからなのかも知れませんが)、「お試しオファーが利用可能な状態でサブスクリプションに申し込むと必ずお試しオファーが利用されます」というような動きになっています。

特にお試し期間の部分は、もうちょっとテストして実際どうなっているのか判断したいと思います。

kabeyakabeya

お試しオファーを利用できるかどうかの条件は表にしてみました。
(マークダウンで表を書こうとしましたが、セル結合できず断念して絵で)

kabeyakabeya

XcodeのStoreKit Testingを利用して、期間がどうなってるか確認してみました。
1ヶ月無料期間がある、1年のサブスクリプションです。
Xcodeでは、StoreKitの時間経過を早められるので、1ヶ月=30秒でテスト。

初回の購入
originalPurchaseDate: 2024-02-11 04:59:50 +0000
purchaseDate: 2024-02-11 04:59:50 +0000
signedDate: 2024-02-11 04:59:50 +0000
expiresDate: 2024-02-11 05:00:20 +0000

更新1回目
originalPurchaseDate: 2024-02-11 04:59:50 +0000
purchaseDate: 2024-02-11 05:00:20 +0000
signedDate: 2024-02-11 05:00:20 +0000
expiresDate: 2024-02-11 05:06:20 +0000

更新2回目
originalPurchaseDate: 2024-02-11 04:59:50 +0000
purchaseDate: 2024-02-11 05:06:20 +0000
signedDate: 2024-02-11 05:06:20 +0000
expiresDate: 2024-02-11 05:12:20 +0000

最初に4:59:50に購入します。最初のexpireは5:00:20です。買ってから30秒つまり1ヶ月後に切れます。
次に最初の自動更新がかかります。更新は5:00:20に行われます。このときのexpireは5:06:20です。買ってから6分=30秒×12、つまり丸々12ヶ月後に切れます。
そして2回目の自動更新がかかります。更新は5:06:20に行われます。前の12ヶ月が切れたタイミングです。expireは5:12:20、つまりまた12ヶ月後です。

というわけで、以下のようになります。

  • サブスクリプションを申し込むと、お試しオファーが自動で適用されます(オファーが利用可能な場合)。
  • 最初のサブスクリプション有効期間は、お試し期間のみとなります。
  • お試しオファー終了のタイミングで、本来のサブスクリプション期間で更新されます。サブスクリプション期間の開始日時は、その自動更新のタイミングとなります。
kabeyakabeya

同じサブスクリプショングループの他のサブスクリプションでお試しオファーを利用すると、そのサブスクリプションでもお試しオファーが利用できなくなります。

StoreKit2になったら、わざわざレシート(トランザクション)を細かく見ずともSubscriptionInfoisEligibleForIntroOfferというプロパティがあるので、これを見れば良いようです。

月額とか年額とかのプランの一覧を表示していて、上記のプロパティを見て「無料でお試しできます!」とか書いている場合、月額プラン申し込み後もまだ年額プランでお試しオファーが有効になっているかのように見える可能性があります。

なので、あるプランの購入と同時に、他のプランのisEligibleForIntroOfferも再度、取得し直して表示を更新する必要があります。