Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何检测用户是否在免费试用期内取消自动续费订阅?_Ios_In App Purchase - Fatal编程技术网

Ios 如何检测用户是否在免费试用期内取消自动续费订阅?

Ios 如何检测用户是否在免费试用期内取消自动续费订阅?,ios,in-app-purchase,Ios,In App Purchase,苹果的文件似乎没有提到这一点。所以,如果用户取消了在免费试用期内购买的自动续费订阅,我们如何检测 在appstore收据JSON中有以下字段:是试用期。但我认为这是为了表明免费试用期是否已经结束 我唯一能想到的就是这个NSBundle.mainBundle().appStoreReceiptURL?.path,如果这个值为零,则表示用户在免费试用期内没有订阅或取消。但对于沙盒测试,在免费试用期内无法执行取消来测试此场景 是否有人对此非常了解?为了支持自动续订订阅,您的应用程序需要定期将从NSBu

苹果的文件似乎没有提到这一点。所以,如果用户取消了在免费试用期内购买的自动续费订阅,我们如何检测

在appstore收据JSON中有以下字段:
是试用期
。但我认为这是为了表明免费试用期是否已经结束

我唯一能想到的就是这个
NSBundle.mainBundle().appStoreReceiptURL?.path
,如果这个值为零,则表示用户在免费试用期内没有订阅或取消。但对于沙盒测试,在免费试用期内无法执行取消来测试此场景


是否有人对此非常了解?

为了支持自动续订订阅,您的应用程序需要定期将从
NSBundle.mainBundle().appStoreReceiptURL?path获得的应用程序收据提交到

此服务的JSON响应中包含
latest\u receipt\u info
数组

通过检查此阵列,您将能够确定当前活动的订阅

如果用户在免费试用期到期之前关闭自动续订,则
最新收据\u信息
将不包含在免费试用期结束日期之后的
到期日期
的购买


这意味着,严格来说,你不能“检测到取消”,因为没有“取消”;免费试用期结束时没有续费。

这可以通过iTunes Connect中的网络挂钩功能实现

为应用程序的
订阅状态URL
设置路径时,当订阅状态更改时,应用商店服务器将调用该URL

当前,以下关键事件将触发呼叫:

  • 首次购买认购的首次购买
  • 取消订阅已被苹果客户支持部取消
  • 续订已成功为过期订阅自动续订
  • 交互式\u续订客户在订阅过期后通过使用应用程序的界面或在应用程序上以交互方式续订订阅 存储在帐户设置中
  • 是否更改了续订首选项客户更改了在下次续订时生效的计划
  • 是否更改更新状态订阅已过期,客户已重新订阅相同或其他计划

可以找到更多信息。

正确的方法是检查收据上的自动续订首选项。如果您希望在用户未打开(或删除)您的应用程序时收到通知,您需要在服务器上存储并刷新收据。要检测取消,您应该关注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

    响应中
    您将找到所需的所有数据。

    请注意,您需要在沙盒环境中的
    pod文件
    pod'Alamofire',“~>5.2”

    中包含此内容。购买后,JSON仅在最新的\u receipt\u info数组中包含一个dictionary对象。此词典的试用期设置为true,过期日期为。如果我理解正确,如果用户在免费试用期到期前取消,我重新请求应用程序收据,则在最新收据信息数组中应该只有一个dictionary对象,并且expires\u date字段将不存在?不,该项目仍然存在。用户无法取消订阅。他们只能关闭自动续订。任何开始的订阅期,无论是试用期还是付费期,都将持续到its
    到期日
    您的应用程序有责任确定哪些订阅处于活动状态并采取相应的行动。例如,如果用户是上个月订阅的,而现在不是,那么他们应该仍然可以访问上个月的内容(如果您的订阅与内容相关)。如果没有有效的付费子网站,您可以选择不提供免费试用内容的历史访问权限。这并不能回答问题。如果用户取消免费试用订阅,在试用结束之前您无法检测到此事件,因为阵列中不会有新的订阅对象。这就是我所说的。用户实际上不能取消订阅(免费或其他)。他们只能关闭续约。如果他们在免费试用期内这样做,那么他们就不会在免费期结束时进入付费期。他们可以在整个免费期内访问。此外,如果苹果发布退款,收据将包含“取消日期”字段。您应该检查此字段,如果您找到它,“将其视为从未进行过购买。”但是,当用户将其订阅设置为不续订时,我们是否立即收到通知?看起来只有在涉及苹果支持时才取消。@Say.My.Name。现在可用于DID_CHANGE_RENEWAL_Status。我收到一个错误***由于未捕获的异常“NSInvalidArgumentException”终止应用程序,原因是:“JSON写入中的类型无效(u SwiftValue)”,由于未捕获的异常t终止