Ios7 非续订订阅:是否从收据中删除?

Ios7 非续订订阅:是否从收据中删除?,ios7,restore,storekit,non-renewing-subscription,Ios7,Restore,Storekit,Non Renewing Subscription,我正在为我的应用程序(即将发布)实施应用程序内购买,并为iOS6和iOS7提供支持。我的问题与iOS6和iOS7中的非续订订阅机制之间的差异有关,更具体地说是关于如何实现恢复。为了适应iOS6和iOS7,我实现了一个服务器端解决方案来支持恢复。我可以选择允许用户创建一个用户名/密码,该用户名/密码可以在不同的设备上使用(如果数据丢失,也可以在同一设备上使用)进行恢复。我已经基本上做到了这一点,但随着测试的进行,我发现了一些奇怪的东西 iOS7恢复过程的初始部分使用SKReceiptRefresh

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

iOS7恢复过程的初始部分使用SKReceiptRefreshRequest刷新应用程序中的收据。当我从iOS7设备删除应用程序时,重新安装(此时没有收据;使用iExplorer进行测试),然后执行恢复,SKReceiptRefreshRequest恢复10次购买(我在测试期间为该特定用户创建的)。其中一种是非消费品,九种收据是非续费的。这使我困惑。从Apple文档中,我只希望在刷新的收据中看到非消费品购买。发件人:

“消耗品和非续费订阅:应用程序内 消耗品或非续期产品的采购收据 购买时,订阅将添加到收据中。它是 保留在收据中,直到您的应用程序完成该交易。 在这一点之后,它将在下次接收时从收据中删除 例如,当用户进行另一次购买时,收据会更新 或者如果您的应用程序明确刷新收据。“

关于非续约订阅,来自:

使用iCloud或您自己的服务器跟踪购买并允许用户 将购买的订阅还原到单个服务器拥有的所有iOS设备 使用者

下表来自()

有人有什么见解吗

问题:为什么SKReceiptRefreshRequest会将非续期产品的采购留在收据中?这是苹果文档中的一个bug吗 还是有别的事情发生了

2/23/14;更新:我最近向苹果公司发布了一份关于此问题的错误报告。还没有回音。不过,事实上,我不想让这个“虫子”消失

10/20/15;更新:苹果似乎已经解决了这个“漏洞”。现在,当我使用
SKReceiptRefreshRequest
进行恢复时(这似乎是苹果公司推荐的恢复方法,请参阅),我现在没有收到收据中显示的非续费订阅购买。我只获得非耗材(我的应用程序只有非续费订阅和非耗材购买)。在我写了这篇文章之后,我会立即向苹果提交一份bug报告,因为至少他们的文档在预期行为上是模棱两可的

到目前为止,我的测试包括我的应用程序在iOS 8.4和iOS9上运行(实际上是9.1测试版,因为我没有合适的设备运行生产版本),因此这似乎是苹果的服务器端更改,而不是严格意义上的iOS/设备端更改。还请注意,到目前为止,我所有的测试都是在我的应用程序的开发版本上进行的,在应用程序内购买沙箱中也是如此。我很快就会进行生产测试


12/3/15;更新在苹果技术支持的提示下,我又进行了一些测试。这一次,在运行iOS9.2beta4(13C75)的iPad上。我们现在似乎恢复了“正常”,不再续费订阅。也就是说,当我进行恢复时,我再次在收据中看到未续订的订阅。

这也让我感到困惑。在多次查看文档后,我终于在收据字段中看到了以下内容:

消耗品的应用内采购收据添加到 购买时的收据。它保存在收据中,直到 你的应用程序完成该事务。在该点之后,它将被移除 例如,下次更新收据时从收据开始, 当用户再次购买时,或者如果您的应用程序 刷新收据

非消耗性产品的应用内采购收据, 自动续费订阅、非续费订阅或免费订阅 订阅将无限期保留在收据中

然而,中关于“持续使用应用程序收据”的部分仍然表明耗材和非续费订阅被视为相同的


我是从我们观察到的IAP文件过时的行为中猜出来的?我希望如此。

请小心,在应用程序收据中保留非续费订阅不会保证被应用程序商店的审阅者接受。成功取决于特定的评论者。我最近从苹果收到了这样一条信息:

我们发现您的应用程序包含一个以前要还原的功能 通过输入用户的Apple ID和 密码。但是,应用程序内购买的非续费订阅不能 以这种方式恢复

修改二进制文件以删除此功能是合适的。 如果您希望用户能够恢复非续订 订阅应用内购买产品时,您需要实施 自己的恢复机制

因此,上次提交应用程序的尝试是不幸运的。与前几次不同

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

对于非续费订阅,请使用iCloud或您自己的服务器保留 持久的记录。 (c) 存储工具包编程指南

以下是为这些目的提供的苹果代码:

#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];

苹果公司建议如下(阅读概述)

。。。 自动续期认购收据