这个问题让我头疼了一段时间。
我的应用程序在自动更新订阅模型上运行。我有一个 SKPaymentQueue transactionObserver,当通过 Apple 成功完成购买时会收到通知,此时我将 Apple 收据发送到我的服务器以进行验证。一旦我验证了它,我就会向我的应用程序发送一个成功调用,该应用程序向用户提供内容,然后在事务上调用 finishTransaction: (根据文档,这是正确的操作过程)。
问题是,恐怕要等这么久才能调用finishTransaction:在Apple 期望它被调用(3-4 秒)之后,它会禁止事务实际上“完成”。如果我在我的应用程序中成功购买(并且完成交易:已被调用),然后终止我的应用程序(在 Xcode 中“停止”)并再次运行它,在启动时将立即有一个、两个、三个,有时是四个或者在 UI 加载之前 SKPaymentQueue 中的五个交易。
这是在与 Apple 的交易完成后对我的服务器的调用:
-(void)completeTransaction:(SKPaymentTransaction *)transaction
{
NSLog(@"complete transaction");
[self sendReceiptToServer:transaction];
}
-(void)sendReceiptToServer:(SKPaymentTransaction*)transaction
{
NSString *rawReceiptData = [[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:rawReceiptData, @"receipt", [[UserSingleton sharedInstance] memberID], @"member", nil];
NSMutableURLRequest *request = [[HTTPRequestSingleton sharedClient] requestWithMethod:@"POST" path:cFunctionAddCredits parameters:params];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"%@", JSON);
NSString *creditsString = [JSON valueForKey:@"limit"];
int numberOfCredits = [creditsString intValue];
[self provideContent:transaction.payment.productIdentifier withNumberOfCredits:numberOfCredits];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"failed to send receipt to server");
[[NSNotificationCenter defaultCenter] postNotificationName:cFailedToSendReceiptToServer object:transaction];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}];
[operation start];
}
如您所见,[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
在对我的服务器的请求的成功或失败块内被调用。这会以某种方式出现问题吗?
*编辑*
如果我在将收据发送到我的服务器进行验证之前调用它似乎不会发生此问题SKPaymentQueue:finishTransaction:
,这使我相信在网络请求块内调用它确实会导致问题。但这不是处理事情的正确方法,所以我仍然卡住了。
*编辑 2 *
事实证明,在启动应用程序时,交易有时仍然会“恢复”,即使我finishTransaction:
在将收据发送到我的服务器之前拨打电话也是如此。这是怎么回事?