iOS IAPテスト、あなたの品物がすでに買ったことをヒントにします

2336 ワード

iOS内で購入する場合は、Consumable種類のアイテムを購入する必要があります.例えば、コインを購入するのは古典的な使用シーンです.最近、この消耗品をテストして購入したとき、非常に奇妙な問題に遭遇したことに気づきました.ゲームコインを繰り返し購入すると、システムのヒントが表示されます.
This In-App Purchase has already been bought. It will be restored for free.

この品物はすでに購入したので、直接回復すればいいです.
取引が完了すると、StoreKit.SKPaymentQueuefinishTransactionを呼び出すと、この取引を購入済みとマークすることができ、その後、Consumable種類の商品を引き続き購入することができます.
では、今はどんな状況ですか.とてもわかりにくいです.私と同じ問題に直面した開発者、This In-App Purchase Has Aready Been Boughtを発見してよかった.
彼も言及しました
Apple has designed the payment queue in such a way as to enable apps to fulfill a purchase before completing - with finishTransaction being the indication that fulfillment is complete. In the case that a failure occurs during fulfillment, the app can recover when SKPaymentQueue calls the app’s observer again.
This is all good and fine - except many developers have encountered a situation where this process breaks down. Their SKPaymentTransactionObserver is never called again, and the user is presented with the dreaded “already bought” dialog and no apparent way to fix the problem. SKPaymentTransactionObserverは呼び出されず、 のダイアログボックスが表示されます.
A library (in my case Firebase analytics) is adding its own SKPaymentTransactionObserver before your app adds its own observer. As a result, SKPaymentQueue is calling that observer first, and by the time your observer is added, as far as the payment queue is concerned it has already delivered the notification and there’s nothing left to do.
彼は私に原因を見つけてくれた--サードパーティのソフトウェア(私と同じFirebaseの問題です).SKPaymentTransactionObserverは呼び出されていませんが、実はすでにObserverが存在しているからです.
ソリューションも簡単です.サードパーティ製ソフトウェアを初期化する前に、Queueを追加します.
プロジェクトでサードパーティの支払いライブラリjinSasaki/InAppPurchaseを引用したので、これを例に、簡単にソリューションを書きます.
class AppDelegate: UIResponder, UIApplicationDelegate {
    //  InAppPurchase
    let iap = InAppPurchase.default
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        //  Transaction Observer
        iap.addTransactionObserver()
    
        //  Firebase 
        FirebaseApp.configure()
        return true
    }
}

そして大功を成し遂げた.