In-tamachi Billing Night 登壇資料 https://billing-night.connpass.com/event/125510/
Promoting IAP対応から学ぶ外部アプリ内課金実装@uzzu
View Slide
About me@uzzu (GitHub, Twtter, etc…) Cookpad Inc. ユーザ・決済基盤部 エンジニア アプリ内課金とは 前職(スマホゲーム開発)からの お付き合い(iOS/Android) https://uzzu.co
https://speakerdeck.com/uzzu/xin-gui-apurikai-fa-wozhi-eruyuzajue-ji-ji-pan
はとりあえず置いといて、Promoting IAPについて説明します外部アプリ内課金実装?????
Promoting IAPとは•App Storeアプリから アプリ内課金アイテムの購入を実施する為の機能
Promoting IAPとは
Promoting IAPとは未インストールユーザも利用できる
Promoting IAPに対応するには•まずはアプリ内課金実装をする•protocol SKPaymentTransactionObserverの optional func paymentQueue(_ queue: SKPaymentQueue, shouldAddStorePayment: SKPayment, for: SKProduct) -> Bool を実装する•AppStore ConnectでPromoting IAP用の商品設定をする•(任意) SKProductPromotionControllerで表示制御をする※正確な情報はApp内課金プログラミングガイドを参照してね
テストitms-services:// ?action=purchaseIntent &bundleId={Bundle Identifier} &productIdentifier={Product Identifier}※正確な情報はApp内課金プログラミングガイドを参照してね
shouldAddStorePaymentpublic func paymentQueue(_ queue: SKPaymentQueue,shouldAddStorePayment payment: SKPayment,for product: SKProduct) -> Bool {return true // PaymentQueueʹੵ·ΕΔ}最短実装。だがしかし…
俺たちには利用規約がある•return trueとしてしまうと、アプリ遷移後にすぐに IAP決済処理が走ってしまう (正確にはSKPaymentQueue#add後、任意のタイミング)•利用規約に同意してもらうタイミングがない アプリ内課金商品によっては年齢確認も必要•利用規約がなくても、アプリの初期化処理はしばしある その後に処理するようにしないといけない
どうする?// shouldAddStorePaymentͷύϥϝʔλΛ࣋ͭstructΛ༻ҙpublic struct PromotingPurchasePayment {public var product: SKProductpublic var payment: SKPaymentinit(payment: SKPayment, product: SKProduct) {assert(payment.productIdentifier == product.productIdentifier)self.payment = paymentself.product = product}}// Promoting IAPͷใΛஷΊΔprotocolpublic protocol PromotingPurchasePaymentHolder {func add(_ storePayment: StorePayment)func pendingPayments() -> [StorePayment]func consume(_ storePayment: StorePayment)}
どうする?let holder: PromotingPurchasePaymentHolderpublic func paymentQueue(_ queue: SKPaymentQueue,shouldAddStorePayment payment: SKPayment,for product: SKProduct) -> Bool {// ͱΓ͋͑ͣஷΊΔ!!holder.add(StorePayment(payment: payment, product: product))return false}
どうする?•アプリ初期化後、トップ画面のViewController上で 未処理のPromoting IAPがあれば 決済処理開始•クックパッドでは トップ画面とは別の UIViewControllerに遷移して処理している•決済処理が終わったらHolderから破棄
Promoting IAPまとめ•超カジュアル実装ならtrue•アプリ初期化処理や利用規約があるならfalse•個人プロダクトでないアプリであれば だいたいfalseになるんじゃないか?•貯めて特定画面で処理が柔軟
Promoting IAPだけが特別?
アプリ外に決済起点のあるアプリ内課金機能は他にもある(実際に決済が走っているかはさておき)
例えば•Promotion Code(iOS, Android)•Google Play Points(Android)
一旦貯めるのは柔軟•iOSの場合はこれまでにお話した通り•Google Play(Android)においては特に貯めずとも BillingClient#queryPurchases を 特定画面で呼び出して購入状況を確認すれば良い iOSと違い決済は既に走っているので 決済後の処理(いわゆる復元処理)をやれば良さそう
まとめ•アプリ外部からのトリガーによるアプリ内課金を処理する前に (時には)サービス利用規約への同意が必要(利用規約の更新もあるよね) その後に 都度課金であれば(時には)年齢確認が必要 定期購読であれば定期購読サービス利用規約の同意が必要•どのケースにおいても プラットフォームからの通知は貯めておいて 特定画面(アプリ起動後のTOP画面等)でまとめて処理すると 柔軟で良い (Realtime notificationが使えるなら使いたいが未検証)
終ありがとうございました