如何检查在应用程序购买自动更新订阅有效

我正在寻找实施新的自动更新订阅使用在应用程序购买,但我不确定如何或何时检查用户当前订阅。 我的理解是,当用户最初订阅应用程序时,可以使用购买date和订阅date来计算订阅的持续时间。 这个date过后会发生什么? 我们如何检查用户是否自动续订或取消?

如果我使用restoreCompletedTransactions获取每次续订的交易和收据,系统将提示用户input他们的iTunes密码。 这是否意味着,如果他们已经购买了7天的订阅,他们将不得不在7天内input密码,当应用程序检查订阅是否仍然有效?

看到这个文档:

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/uid/TP40008267-CH104-SW1

如果您想从Web服务器上检查它,您可以ping他们的API,并返回自动更新订阅的状态以及有关上次付款的信息。

如果你是在设备上,那么你可能不得不打电话restoreCompletedTransactions,我猜想要求input密码。

我没有看到其他方法。 我想从设备上,你可以通过联系服务器端使用的相同的Web服务来validation订阅? 我不知道如何利弊。

今天,我遇到了这个问题。

按照苹果的文档在这里,我用这种方式来检查订阅是否过期。 我的想法:用户APPLE REST API响应:(请求时间+过期时间)来检查过期与否

 + (BOOL)checkInAppPurchaseStatus { // Load the receipt from the app bundle. NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; if (receipt) { BOOL sandbox = [[receiptURL lastPathComponent] isEqualToString:@"sandboxReceipt"]; // Create the JSON object that describes the request NSError *error; NSDictionary *requestContents = @{ @"receipt-data": [receipt base64EncodedStringWithOptions:0],@"password":@"SHARE_SECRET_CODE" }; NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error]; if (requestData) { // Create a POST request with the receipt data. NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; if (sandbox) { storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; } NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; [storeRequest setHTTPMethod:@"POST"]; [storeRequest setHTTPBody:requestData]; BOOL rs = NO; //Can use sendAsynchronousRequest to request to Apple API, here I use sendSynchronousRequest NSError *error; NSURLResponse *response; NSData *resData = [NSURLConnection sendSynchronousRequest:storeRequest returningResponse:&response error:&error]; if (error) { rs = NO; } else { NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:resData options:0 error:&error]; if (!jsonResponse) { rs = NO; } else { NSLog(@"jsonResponse:%@", jsonResponse); NSDictionary *dictLatestReceiptsInfo = jsonResponse[@"latest_receipt_info"]; long long int expirationDateMs = [[dictLatestReceiptsInfo valueForKeyPath:@"@max.expires_date_ms"] longLongValue]; long long requestDateMs = [jsonResponse[@"receipt"][@"request_date_ms"] longLongValue]; NSLog(@"%lld--%lld", expirationDateMs, requestDateMs); rs = [[jsonResponse objectForKey:@"status"] integerValue] == 0 && (expirationDateMs > requestDateMs); } } return rs; } else { return NO; } } else { return NO; } } 

希望这个帮助。

在打电话给Apple api之前最好使用本地解决scheme。 每次运行应用程序时,validation本地收据是一种很好的做法,如果您需要检查用户是否拥有有效订阅,则可以先从当地收据中检索购买,并确定购买对于今天仍处于活动状态。

我已经实现了一个用Swift编写的小型库,以简化在本地处理应用内收据。 您可以轻松获取表示收据的对象( InAppReceipt )并检索活动购买/所有购买。

随意使用。 Github链接

这是解决你的问题的一个例子:

 import TPInAppReceipt do { let receipt = try InAppReceiptManager.shared.receipt() //retrive active auto renewable subscription for a specific product and date let purchase = receipt.activeAutoRenewableSubscriptionPurchases(ofProductIdentifier: "ProductName", forDate: Date()) //retrive all auto renewable subscription purchases for a specific product let allAutoRenewableSubscriptionPurchases = receipt.purchases(ofProductIdentifier: "productName").filter({ return $0.isRenewableSubscription }) } catch { print(error) } 

我正在围绕这个问题开展一场运动。 这是我的观察和运动:

自动更新后,App Store会调用paymentQueue并发送一个事务。 该事务与transaction.transactionState==SKPaymentTransactionStateRestored一起发布。

问题是,不幸的是这只会发布到一个设备。 第二个设备没有获得发布。 因此,要检测自动更新,或者更确切地说,检测到缺less自动更新并拒绝设备持续订阅,则必须执行restoreCompletedTransaction或“http发布包含最后事务的64位编码的JSON”。 如果前者,用户需要input密码; 这是侵入性的 – 正如你在上面指出的那样。 如果是后者,则需要大量额外的编码。 所以,我的问题是…为什么不StoreKit有一个命令:

(不存在) - [[SKPaymentQueue defaultQueue] restoreAttachedTransactions:(NSArray *)transactions];

这个命令将像restoreCompletedTransactions一样stream动,但是它只能恢复附加的事务,最重要的是,它不需要用户login。 它具有与“http发布包含最后一笔交易的64位编码JSON”相同的安全保护,它允许在StoreKit完成整个In App Purchase过程,而不需要Web发布代码。

如果这对你有意义,请build议如何把这个给苹果….谢谢。