iOS 11/10上的应用内购买结果不一致

iOS 11/10上的应用内购买结果不一致,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,在以前版本的应用程序中,我的应用程序内购买(IAP)运行良好。在我的最新版本中,用户向我报告了一些奇怪的不一致之处 IAP只是允许用户访问应用程序的“专业”版本,该版本可以删除广告,并允许用户在应用程序处于后台时播放音频文件 问题: 用户可以在应用程序内成功购买IAP。他们收到消息说购买成功。但是,当他们重新启动应用程序时(按照成功购买UIAlert的指示),Pro功能不会解锁 当用户使用“恢复购买”按钮时,他们会收到一条错误消息,说明“无需恢复”基本上告诉他们没有购买任何东西 有趣的是,如果他

在以前版本的应用程序中,我的应用程序内购买(IAP)运行良好。在我的最新版本中,用户向我报告了一些奇怪的不一致之处

IAP只是允许用户访问应用程序的“专业”版本,该版本可以删除广告,并允许用户在应用程序处于后台时播放音频文件

问题: 用户可以在应用程序内成功购买IAP。他们收到消息说购买成功。但是,当他们重新启动应用程序时(按照成功购买UIAlert的指示),Pro功能不会解锁

当用户使用“恢复购买”按钮时,他们会收到一条错误消息,说明“无需恢复”基本上告诉他们没有购买任何东西

有趣的是,如果他们再次按下购买按钮,他们就会被告知他们已经购买了IAP,可以免费重新下载。同样,这不会解锁Pro功能

报告病例 我收到了许多关于这个问题的报告。iOS 10和iOS 11上的用户都遇到过此问题。不过,iOS 11和iOS 10上的其他用户也可以毫无问题地购买升级。所以我有点困惑是什么导致了这个问题

工具 我正在使用SwiftyStoreKit 0.10.5管理我的IAP。我使用Swift 4使用Xcode 9.0

下面是我用来购买和恢复购买的代码

出于安全考虑,我已经用***覆盖了我的包,因为我不知道如何处理它

// Purchase Product
func purchase(purchase: RegisteredPurchases) {
    NetworkActivityIndicatorManager.NetworkOperationStarted()
    SwiftyStoreKit.purchaseProduct(bundleID + "." + purchase.rawValue, completion: {
        result in
        NetworkActivityIndicatorManager.NetworkOperationFinished()

        if case .success(let product) = result {

            if product.productId == "com.************.RemoveAds" {

                self.defaults.set(true, forKey: "NoAds")

            }

            if product.needsFinishTransaction {

                SwiftyStoreKit.finishTransaction(product.transaction)
            }


            self.showAlert(alert: self.alertForPurchaseResult(result: result))

        }

    })

}

// Restore Purchases
func restorePurchases() {
    NetworkActivityIndicatorManager.NetworkOperationStarted()
    SwiftyStoreKit.restorePurchases(atomically: true,  completion: {
        result in
        NetworkActivityIndicatorManager.NetworkOperationFinished()

        for product in result.restoredPurchases {

            if product.needsFinishTransaction {

                SwiftyStoreKit.finishTransaction(product.transaction)
            }

            if product.productId == "com.************.RemoveAds" {

                self.defaults.set(true, forKey: "NoAds")

            }

            print(product.productId)
            self.defaults.set(true, forKey: "\(product.productId)")


        }

        self.showAlert(alert: self.alertForRestorePurchases(result: result))

    })

}
如果您能提供有关这一事件原因的任何信息,我将不胜感激。因为我现在有点不知道原因是什么


谢谢

很难说清楚,因为我不知道SwiftyStoreKkt内部发生了什么(就个人而言,我不太喜欢为IAP使用其他框架;特别是使用闭包而不是委托模式的“快速”框架。直接实现IAP委托非常简单),但听起来交易没有正确完成,因此仍处于未决状态。另外,从用户体验的角度来看,需要重新启动应用程序并不太好。感谢您的回复。我接受了您的建议,并在AppDelegate DidFinishLaunching方法中添加了一个CompleteTransaction检查。由于我只是在现场看到他,我现在将发布一个修复版本,看看它是否解决了这个问题。谢谢你的帮助!