Swift inapp purchase fails but system dialog say y

2020-07-30 03:13发布

I have an app which has inApp purchase feature. The problem is even if I get error, such as the fail case because of "Cannot connect to iTunes Store", the system dialog says "You are all set. Your purchase was successful". You can find my inApp purchase helper class code down.

  public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        switch (transaction.transactionState) {
        case .purchased:
            NotificationCenter.default.post(name: .IAPHelperSetPepqueenNotification, object: nil)

            if let url = Bundle.main.appStoreReceiptURL {
                guard let receipt = try? Data(contentsOf: url) else {
                    print("error to take receipt")
                    return
                }
                let receiptData: String = receipt.base64EncodedString(options: .init(rawValue: 0))
                PepappNetwork.request(target: .postReceipt(platform: "ios", receipt: receiptData) , success: { (JSON) in
                    print(JSON)
                    let user = User(JSON: JSON["data"].dictionaryObject!)
                    UserDefaults.standard.set(user?.identifier, forKey: "userID")
                    user?.persist()

                    if user?.language != nil {
                        UserDefaults.standard.set(user!.language!, forKey: "forcedLanguage")
                        UserDefaults(suiteName: Constants.UserDefaults.containerName)!.set(user!.language!, forKey: "forcedLanguage")
                    }

                    NotificationCenter.default.post(name: Notification.Name.CurrentUserChanged, object: nil)
                    self.complete(transaction: transaction)

                }, error: { (errorString, _) in

                }) { (MoyaError) in

                }
            }
            break
        case .failed:
            NotificationCenter.default.post(name: .IAPHelperCancelNotification, object: nil)
            fail(transaction: transaction)
            break
        case .restored:
            restore(transaction: transaction)
            break
        case .deferred:
            break
        case .purchasing:
            break
        }
    }
}

Fail transaction func

private func fail(transaction: SKPaymentTransaction) {
    print("fail...")
    if let transactionError = transaction.error as NSError?,
        let localizedDescription = transaction.error?.localizedDescription,
        transactionError.code != SKError.paymentCancelled.rawValue {
        print("Transaction Error: \(localizedDescription)")

    }

Before app enter update transactions function "You're all set." dialog has already been show.

2条回答
祖国的老花朵
2楼-- · 2020-07-30 04:01

Seems like it's a recent Apple bug. I started experiencing it today and it appears when making purchase with sandbox account. However, in-app purchases still work if you upload an app to TestFlight.

查看更多
闹够了就滚
3楼-- · 2020-07-30 04:06

There was an issue with the Apple Sandbox, It has been resolved now - https://developer.apple.com/system-status/

查看更多
登录 后发表回答