我希望实现新的自动可更新订阅在应用程序购买中使用,但我不确定如何或何时检查用户是否当前订阅。我的理解是,当用户最初订阅时,应用程序可以使用购买日期和订阅日期来计算他们的订阅将持续多长时间。此日期过后会发生什么?如何查看用户是否已自动续费或已取消?
如果我使用restoreCompletedTransactions
获取每次续订的交易和收据,系统将提示用户输入其iTunes密码。这是否意味着,如果他们购买了7天的订阅,当应用程序检查订阅是否仍然有效时,他们必须每7天输入一次密码?
发布于 2011-03-20 03:05:22
如果你想从网络服务器上查看它,你可以ping他们的API,它会返回自动续订的状态和关于最后一次付款的信息。link
如果你使用的是这台设备,那么你可能需要调用restoreCompletedTransactions,我猜它会要求你提供密码。
我看不到任何其他的方法。我想你可以从设备上通过联系服务器端使用的相同的web服务来验证订阅?我不知道这样做的利弊。
发布于 2016-09-16 18:11:39
今天,我遇到了这个问题。
在这里关注Apple doc,我用这种方式来检查订阅是否过期。我的想法:用户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;
}
}
希望这能有所帮助。
发布于 2017-01-24 12:19:37
在调用Apple API之前,最好在本地验证收据。每次应用程序运行时,验证本地收据是一个很好的做法,如果你需要检查用户是否有任何活跃的订阅,你可以从本地收据中检索所有购买,并查看是否有仍然活跃的购买。
我已经实现了一个用Swift
编写的小型库,以简化在本地使用应用内回执。您可以轻松地获取表示收据的对象(InAppReceipt
)并检索活动购买/所有购买。
请随意使用。Github link
下面是一个解决问题的示例:
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)
}
https://stackoverflow.com/questions/5120177
复制相似问题