首页 文章

不续订订阅:从收据中删除?

提问于
浏览
13

我正在为我的应用实施应用内购买(即将发布),并为iOS6和iOS7提供支持 . 我的问题与iOS6和iOS7上的非续订订阅机制之间的差异有关,更具体地说,关于如何实现恢复 . 为了适应iOS6和iOS7,我实现了一个服务器端解决方案来启用恢复 . 我可以选择允许用户创建可以在不同设备上使用的用户名/密码(如果数据丢失,则使用同一设备)进行恢复 . 我的大部分工作基本上都在工作,但随着我的测试进展,我发现了一些奇怪的东西 .

iOS7恢复过程的初始部分使用SKReceiptRefreshRequest刷新应用程序中的收据 . 当我从iOS7设备上删除应用程序时,重新安装(此时没有收据;使用iExplorer进行测试),并进行恢复,SKReceiptRefreshRequest恢复10次购买(我在测试期间为此特定用户创建) . 其中一种是非消耗品,而且是 nine of the receipts are non-renewing . 这让我很困惑 . 从Apple文档中,我预计只会在刷新的收据中看到非消费品购买 . 来自https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html

“消耗品和非更新订阅:在购买时,将消费品或非续订订购的应用内购买收据添加到收据中 . 它会保留在收据中,直到您的应用完成该交易 . 在此之后,下次更新收据时会将其从收据中删除 - 例如,当用户再次购买时,或者您的应用明确刷新收据时 .

与非续订订阅有关,来自https://developer.apple.com/in-app-purchase/In-App-Purchase-Guidelines.pdf

使用iCloud或您自己的服务器跟踪购买情况,并允许用户将购买的订阅恢复到单个用户拥有的所有iOS设备

和下表(https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Products.html

enter image description here

有人有任何见解吗?

问题:为什么SKReceiptRefreshRequest会在收据中留下非续订产品的购买?这是Apple文档中的错误还是还有其他事情发生?

2/23/14; Update: 我最近在Apple上发布了一个错误报告 . 还没回来 . 虽然,实际上,我不希望这个"bug"消失!

10/20/15; Update: 苹果似乎已经解决了这个问题"bug" . 现在,当我使用 SKReceiptRefreshRequest 进行恢复时(这似乎是Apple推荐的恢复方法,请参阅https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html),我现在没有收到显示在收据中的非续订订阅 . 我只收到非消耗品(我的应用程序只有非续订订阅和非消耗品购买) . 在我写完这篇文章后,我会立即向Apple提交一份错误报告,他们的文档对预期的行为不明确 .

到目前为止,我对此测试的测试包括我在iOS 8.4和iOS9上运行的应用程序(实际上因为我没有正确的设备运行 生产环境 版本,因此测试版为9.1 beta),因此看起来这是Apple的服务器端更改而不是严格说iOS /设备方改变 . 另请注意,到目前为止,我的所有测试都是在我的应用程序的开发版本中,因此在应用内购买沙箱中也是如此 . 我很快就会进行 生产环境 测试 .

12/3/15; Update; 在Apple技术支持的提示下,我又进行了一些测试 . 这一次,在运行iOS9.2 beta 4(13C75)的iPad上 . 看来我们再次看到收据中没有续订订阅了.1818165_

2 回答

  • 3

    请注意,在App Receipt中持续不续订订阅不能保证App Store审阅者不会接受 . 成功取决于特定的评论者 . 我最近得到了Apple的这条消息:

    我们发现您的应用程序包含一项功能,可通过输入用户的Apple ID和密码来恢复以前购买的应用程序内购买产品 . 但是,不能以这种方式恢复非续订订阅应用程序内购买 . 修改二进制文件以删除此功能是合适的 . 如果您希望用户能够还原非续订订阅应用程序内购买产品,则需要实施自己的还原机制 .

    所以提交应用程序的最后一次尝试是不吉利的 . 与前几个不同 .

    所以现在,我的计划是将应用程序收据存储在iCloud Key-Value Storage上并自动恢复所有购买 . 它会满足苹果的要求:

    对于非续订订阅,请使用iCloud或您自己的服务器来保留持久记录 . (c)商店套件编程指南

    以下是为此目的提供的Apple代码:

    #if USE_ICLOUD_STORAGE
    NSUbiquitousKeyValueStore *storage = [NSUbiquitousKeyValueStore defaultStore];
    #else
    NSUserDefaults *storage = [NSUserDefaults standardUserDefaults];
    #endif
    
    NSData *newReceipt = transaction.transactionReceipt;
    NSArray *savedReceipts = [storage arrayForKey:@"receipts"];
    if (!receipts) {
        // Storing the first receipt
        [storage setObject:@[newReceipt] forKey:@"receipts"];
    } else {
        // Adding another receipt
        NSArray *updatedReceipts = [savedReceipts arrayByAddingObject:newReceipt];
        [storage setObject:updatedReceipts forKey:@"receipts"];
    }
    
    [storage synchronize];
    
  • 2

    这也令我感到困惑 . 在多次查看文档之后,我终于在Receipt Validation Programming Guide的收据字段注释中看到以下内容:

    购买时,应将消费品的应用内购买收据添加到收据中 . 它会保留在收据中,直到您的应用完成该交易 . 在此之后,下次更新收据时会将其从收据中删除 - 例如,当用户再次购买时,或者您的应用明确刷新收据时 . 非消费品,自动续订,非续订或免费订阅的应用内购买收据将无限期保留在收据中 .

    而"Persisting Using the App Receipt"中的"Persisting Using the App Receipt"部分仍然表明消费品和非续订订阅的处理方式相同 .

    我猜测我们观察到IAP文件过时的行为?希望如此 .

相关问题