Sandbox StoreKit 收据中缺少交易

Mas*_*cio 5 sandbox storekit ios receipt-validation swift

我目前正在开发的应用程序混合了非消耗性产品和自动更新订阅。看起来一两天后,购买的非消耗性产品将从沙盒收据中删除。恢复后,产品由 StoreKit 观察者回调提供,但收据中仍然缺少它们。

我已经尝试过通过 OpenSSL 进行本地验证和解析,以及通过 Apple 服务器进行远程验证,结果匹配:这些产品总是丢失。请注意,订阅永远不会发生这种情况,收据中始终存在过期和有效的订阅。另一个有趣的细节:产品不会一下子全部丢失,它们会随着采购订单逐渐消失,因为沙盒测试用户正在被“清理”。

由于 Apple 文档 在这里 声明“非消耗品、自动续订订阅项目和非续订订阅项目无限期地保留在收据中”,我希望它们在那里。

有人知道这是否是预期的沙箱行为吗?是否有任何官方的 Apple 资源说明一旦应用程序投入生产就可以了?

编辑:在此处的开发论坛中找到了某人发布的完全相同的问题。

app*_*hud 0

马西莫!您确定您的产品是非消耗品吗?因为消耗品从收据中消失了。

\n\n

以下是如何通过 Apple 服务器验证收据的示例:

\n\n
func validateReceipt(){\n    guard let receiptUrl = Bundle.main.appStoreReceiptURL else {\n            return\n    }\n\n    #if DEBUG\n        let urlString = "https://sandbox.itunes.apple.com/verifyReceipt"\n    #else \n        let urlString = "https://buy.itunes.apple.com/verifyReceipt"\n    #endif\n    let receiptData = try? Data(contentsOf: receiptUrl).base64EncodedString()\n    let requestData = ["receipt-data" : receiptData ?? "", "password" : "YOUR_SHARED_SECRET", "exclude-old-transactions" : false] as [String : Any]\n    var request = URLRequest(url: URL(string: urlString)!)\n    request.httpMethod = "POST"\n    request.setValue("Application/json", forHTTPHeaderField: "Content-Type")\n    let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: [])\n    request.httpBody = httpBody\n    URLSession.shared.dataTask(with: request)  { (data, response, error) in\n      // view your transactions here\n    }.resume()        \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们是管理订阅(包括收据验证)的平台,我们在这方面拥有丰富的经验\xe2\x80\x93,但我们从未遇到过您所说的问题。

\n\n

请仔细检查您是否使用非消耗品,如果您提供更多详细信息、屏幕截图、代码等,那就太好了。

\n