自动续订订阅和应用程序收据

11
我想知道当IAP自动续订订阅自动续订时,应用程序收据是否会自动刷新。文件说明暗示应用程序收据在进行购买(续订?)时更新,但我在IAP沙盒中没有看到这种行为:
关于消耗品和非续订订阅的信息将在支付时添加到收据中,并保留在交易完成之前。 完成交易后,此信息将在下次更新收据时删除,例如用户进行下次购买。除此以外,有关所有其他类型购买的信息将在支付时添加到收据中,并一直保留在收据中。
此外,文档指出:
成功续订订阅后,Store Kit会向交易队列中添加一个续订的事务。您的应用程序在启动时检查交易队列并像处理任何其他事务一样处理续订。请注意,如果您的应用程序在订阅续订时已在运行,则不会调用事务观察器;下次启动应用程序时才能了解续订情况。
对我来说,这意味着我可以监视SKPaymentQueue中的已完成事务,然后检查应用程序收据以找到它们的记录。但是,在IAP沙盒中我没有看到这种实践。我在IAP沙箱中拥有一个自动续订订阅,它是自动续订的(每个用户/购买6次,正常沙盒行为),但是要发现续订,我需要手动刷新应用程序收据。
假设这确实按照我的期望工作,那么在IAP沙箱中触发此行为的最佳实践是什么?

你是直接验证收据还是依赖第三方(不透明)代码?我有几个具有自动续订订阅的应用程序,没有任何问题显示在收据中的项目。当然,我会在每次应用程序启动时验证收据... - Brad Brighton
好的,很酷。我不知道RMStore的细节;你是在遍历整个条目列表还是它会自动处理?你应该为每次续订设置一个订阅条目。 - Brad Brighton
是的,一旦收据被手动刷新,它会找到续订交易。但在此之前不会。 - TomSwift
猜测:您的应用程序在续订会话之间是否没有终止?从文档中可以看出,“下次启动应用程序时,应用程序将了解有关续订的信息”……如果您只是回到前台,我很确定这不算。 (顺便说一句,我不仅仅是在猜测,我正在尝试查看您的情况与我的情况有何不同。严格来说,每当验证失败时,我都会使用基本上来自https://github.com/rmaddy/VerifyStoreReceiptiOS的代码进行刷新-ohai @rmaddy) - Brad Brighton
肯定会终止并重新启动。话虽如此,我很想了解在这种情况下“启动”的定义。 - TomSwift
显示剩余2条评论
1个回答

6
作为一个附注,文件不一致的购买类型和其在收据中的持久性 - 参见我对这个问题的回答
当自动续订开始时,服务器端会更新收据 - 您可以通过调用服务器端的validateReceipt方法进行确认。
更新:看到您正在使用RMStore,我模拟了一些东西,以便我可以查看行为。
在我的情况下,客户端收据被更新。我的场景:一个月的AR订阅(因此在沙盒中每5分钟更新一次)。我在viewDidLoad中放置了一些诊断代码:
RMAppReceipt *receipt = [RMAppReceipt bundleReceipt];
if (receipt != nil) {
    NSDateFormatter* localDateTime = [[NSDateFormatter alloc] init];
    [localDateTime setTimeZone:[NSTimeZone timeZoneWithName:@"PST"]];
    [localDateTime setDateFormat:@"yyyy.MM.dd HH:mm:ss zzz"];

    for (RMAppReceiptIAP* purchase in receipt.inAppPurchases) {
        NSString* cancellationDate = nil;
        if (purchase.cancellationDate) {
            cancellationDate = [localDateTime stringFromDate:purchase.cancellationDate];
        }
        NSLog(@"Transaction: %@: product %@, original purchase date: %@, expiration date: %@, cancellation date: %@",
              purchase.originalTransactionIdentifier,
              purchase.productIdentifier,
              [localDateTime stringFromDate:purchase.originalPurchaseDate],
              [localDateTime stringFromDate:purchase.subscriptionExpirationDate],
              cancellationDate);
    }

我还在RMStore的paymentQueue:updatedTransactions:中设置了断点,以查看队列是否更新了后续的AR购买。
然后我购买了一个月的测试产品,验证了交易,然后退出了应用程序。
在随后每5分钟重新启动应用程序时,我看到SKPaymentTransactionObserver方法中的断点被触发,其transactionSate为SKPaymentTransactionStatePurchased。日志显示购买的次数不断增加(仅显示最新版本)。
2015-05-27 14:27:32.828 StoreKitSandbox[5803:1054853] Transaction: 1000000156919353: product com.foo.StoreKitSandbox.1_month_autorenew_foo, original purchase date: 2015.05.27 14:02:59 GMT-7, expiration date: 2015.05.27 14:07:58 GMT-7, cancellation date: (null)
2015-05-27 14:27:33.350 StoreKitSandbox[5803:1054853] Transaction: 1000000156919353: product com.foo.StoreKitSandbox.1_month_autorenew_foo, original purchase date: 2015.05.27 14:06:02 GMT-7, expiration date: 2015.05.27 14:12:58 GMT-7, cancellation date: (null)
2015-05-27 14:27:33.774 StoreKitSandbox[5803:1054853] Transaction: 1000000156919353: product com.foo.StoreKitSandbox.1_month_autorenew_foo, original purchase date: 2015.05.27 14:11:07 GMT-7, expiration date: 2015.05.27 14:17:58 GMT-7, cancellation date: (null)
2015-05-27 14:27:34.174 StoreKitSandbox[5803:1054853] Transaction: 1000000156919353: product com.foo.StoreKitSandbox.1_month_autorenew_foo, original purchase date: 2015.05.27 14:16:00 GMT-7, expiration date: 2015.05.27 14:22:58 GMT-7, cancellation date: (null)
2015-05-27 14:27:34.637 StoreKitSandbox[5803:1054853] Transaction: 1000000156919353: product com.foo.StoreKitSandbox.1_month_autorenew_foo, original purchase date: 2015.05.27 14:21:04 GMT-7, expiration date: 2015.05.27 14:27:58 GMT-7, cancellation date: (null)
2015-05-27 14:27:35.069 StoreKitSandbox[5803:1054853] Transaction: 1000000156919353: product com.foo.StoreKitSandbox.1_month_autorenew_foo, original purchase date: 2015.05.27 14:26:15 GMT-7, expiration date: 2015.05.27 14:32:58 GMT-7, cancellation date: (null)

你能使用这种诊断方法来重现吗?


我知道收据是在服务器端更新的 - 如果我手动刷新收据(提示用户),它也会在应用程序中更新。 我想知道应用程序绑定收据是否会在自动续订时更新(就像在第一次购买时一样)。 至于监视已完成的交易,这是通过添加addTransactionObserver:到默认的SKPaymentQueue来完成的。 调用restoreCompletedTransactions或refreshReceipt应该仅在响应用户输入时进行 - 我希望避免这种情况。 - TomSwift
感谢您的所有努力-我非常感激。而且,它也开始为我工作了。我不知道这是沙盒小妖精还是我的问题-昨晚在它不工作时我很累。 - TomSwift

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接