Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2021年10月02日

SKProductsRequestのRequestをstartしてもdelegateのdidReceiveResponseが呼ばれない



Deploy targetをiOS13.0にすると、アプリ内課金のSANDBOXにおいて StoreKitのProduct情報取得を行うSKProductsRequestをstartしても、delegateメソッドのdidReceiveResponseが1回呼ばれた後、その後数時間は呼ばれなくなった。

1.原因
この現象はSKRequestの下位APIであるSKProductsRequestのdelegateで処理完了時(正常及びエラー系delegate呼び出し)、トランザクションの完了通知が適切に行われていない場合に発生する。
キューが解放されていないため、キューの有効期限が達するまで次のキューが処理されないのが理由である。


2. 対策
(1) 下記メソッドを追加する。

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
- (void)requestDidFinish:(SKRequest *)request;


(2) updatedTransactionsメソッドで、SKPaymentTransactionStatePurchased、SKPaymentTransactionStateFailed、SKPaymentTransactionStateRestoredのときに、トランザクションの完了通知が実行されていない場合は、記述する。
[queue finishTransaction:transaction];


SKProductsRequestは強参照にしておかないと、リクエストがOS制御により消去されることがある。
処理はメインスレッドで行われないので、delegateが呼び出された後のUI構築はメインスレッドで実行するように明示すること。


参考記事:
https://stackoverflow.com/questions/9935054/storekit-delegate-method-not-getting-called
https://iganin.hatenablog.com/entry/2019/10/09/014932
https://developer.apple.com/documentation/storekit/skproductsrequest?language=objc
https://developer.apple.com/documentation/storekit/skproductsrequestdelegate?language=objc
https://developer.apple.com/documentation/storekit/skrequestdelegate/1385536-request?language=objc
https://githubmemory.com/repo/tikhop/TPInAppReceipt/issues/74
https://github.com/RevenueCat/purchases-ios/pull/418
https://github.com/RevenueCat/purchases-ios/issues/391


posted by mobileDeveloper at 21:47 | Comment(0) | アプリ内課金 はてなブックマーク - SKProductsRequestのRequestをstartしてもdelegateのdidReceiveResponseが呼ばれない | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。