Apple的文档似乎没有提到这一点。因此,如果用户取消在免费试用期内购买的自动续订订阅,我们如何检测?
在appstore收据JSON中有这个字段:is_trial_period
。但我认为这是为了表明免费试用期是否结束。
我唯一能想到的就是这个NSBundle.mainBundle().appStoreReceiptURL?.path
,如果这个没有那么表明用户在免费试用期内没有订阅或取消。但是对于沙盒测试,在免费试用期间无法取消测试此方案。
有没有人对此有充分的了解?
答案 0 :(得分:10)
为了支持自动续订订阅,您的应用需要定期将从NSBundle.mainBundle().appStoreReceiptURL?.path
获得的应用收据提交至Apple's receipt validation service。
此服务的JSON响应中包含latest_receipt_info
数组。
通过检查此数组,您将能够确定当前有效的订阅。
如果用户在免费试用期满前关闭了自动续订,则latest_receipt_info
在免费试用结束日期之后不会包含expires_date
的购买
这意味着,严格来说,您无法检测到取消"因为没有"取消&#34 ;;在免费试用期结束时,没有续约。
答案 1 :(得分:1)
使用iTunes Connect中的网络摘要功能可以实现这一点。
当您为应用的Subscription Status URL
设置路径时,App Store服务器将在订阅状态更改时调用该URL。
目前,以下关键事件将触发呼叫:
答案 2 :(得分:0)
执行此操作的正确方法是检查收据上的自动续订首选项。如果即使用户没有打开(或删除)您的应用程序也要得到通知,则需要在服务器上存储并刷新收据。您应该关注3个字段来检测取消。
您应检查未过期,未取消且自动更新状态为“ 0”的收据。这些将是处于免费试用中但已关闭自动续订的用户。不幸的是,App Store Connect订阅状态通知不会向您报告。
这是一篇很好的博客文章,其中详细介绍了一些细节:iOS Subscriptions are Hard
答案 3 :(得分:0)
这是我如何获取有关收据的json数据:
let sharedSecret = "..." //you can find this string on AppStoreConnect-IAP
if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
FileManager.default.fileExists(atPath: appStoreReceiptURL.path) {
do {
let receiptData = try Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped)
let receiptString = receiptData.base64EncodedString(options: [])
AF.request("https://sandbox.itunes.apple.com/verifyReceipt", method: .post, parameters: ["receipt-data":receiptString, "password": sharedSecret], encoding: JSONEncoding.default, headers: nil)
.responseJSON(completionHandler: { (response) -> Void in
print(response)
})
}
catch {
print("Couldn't read receipt data with error: " + error.localizedDescription) }
}
如果要使用生产URL,而不是沙盒,请将URL更改为https://buy.itunes.apple.com/verifyReceipt
在response
中,您将找到所需的所有数据。
请注意,您需要将此内容包含在Podfile
中:pod 'Alamofire', '~> 5.2'