0

我一直在使用SwiftyStoreKit.verifyReceipt以确保用户仍然订阅自动更新会员资格。我在 运行此代码viewWillAppear,它运行良好,但问题是它每次都要求输入 Apple ID 和密码,是因为该应用程序仍在开发中/应用程序内购买尚未得到 Apple 验证还是我错误地使用 SwiftyStoreKit.verifyReceipt。

文档:https ://github.com/bizz84/SwiftyStoreKit

我在viewWillAppear中的代码:

 let appleValidator = AppleReceiptValidator(service: .production, sharedSecret: "123")
                            SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in


                                switch result {
                                case .success(let receipt):
                                    let productId = "123"
                                    // Verify the purchase of a Subscription
                                    let purchaseResult = SwiftyStoreKit.verifySubscription(
                                        ofType: .autoRenewable, // or .nonRenewing (see below)
                                        productId: productId,
                                        inReceipt: receipt)


                                    switch purchaseResult {
                                    case .purchased(let expiryDate, let items):
                                        print("\(productId) is valid until \(expiryDate)\n\(items)\n")
                                        OneSignal.sendTag("isUserVIPMember", value: "true")
                                    case .expired(let expiryDate, let items):
                                        print("\(productId) is expired since \(expiryDate)\n\(items)\n")
                                        OneSignal.sendTag("isUserVIPMember", value: "false")
                                    case .notPurchased:
                                        print("The user has never purchased \(productId)")
                                        OneSignal.sendTag("isUserVIPMember", value: "false")
                                    }

                                case .error(let error):
                                    print("Receipt verification failed: \(error)")


                                }
                            }
4

1 回答 1

0

我的假设是verifyReceipt不使用本地收据,而是从 App Store 请求它。请求收据需要用户的同意,因此会解释为什么他必须输入他的凭据。

Github 上的代码声明默认值为forceRefreshfalse但您可以添加forceRefresh: falseverifyReceipt调用中。

也请您检查是否receiptString包含任何数据?

let receiptData = SwiftyStoreKit.localReceiptData
let receiptString = receiptData.base64EncodedString(options: [])

如果是这样,请尝试SwiftyStoreKit.verifySubscription()使用当地收据。您还需要输入您的凭据吗?

我不知道你正在构建什么样的应用程序,但我建议不要验证收据viewWillAppear。本地收据无论如何都不会改变(续订除外)。因此,在应用程序启动时执行一次,或者如果用户失去访问权限真的很重要,无论他从您的订阅中获得什么,我建议使用自定义服务器。如果用户的订阅状态发生变化,服务器将收到通知。

旁注:目前我建议不要使用SwiftyStoreKit,因为他们会验证来自 Apple 的服务器端点的收据,并且仅允许来自另一台服务器。Apple 很有可能会拒绝您的应用。

警告

不要从您的应用程序调用 App Store 服务器 verifyReceipt 端点。您无法直接在用户设备和 App Store 之间建立受信任的连接,因为您无法控制该连接的任何一端,这使其容易受到中间人攻击。

资源

于 2020-03-19T13:38:52.850 回答