我的应用程序采用自动更新的订阅模式.我有一个SKPaymentQueue transactionObserver,当通过Apple成功完成购买时会通知我,此时我将Apple收据发送到我的服务器以验证我的结果.一旦我验证它,我就会向我的应用程序发送一个成功回调,该应用程序向用户提供内容,然后在事务上调用finishTransaction:according to the docs是正确的操作过程.
问题是,我害怕等待这么长时间才能调用finishTransaction:Apple预计它被调用(3-4秒)后禁止交易实际上“完成”.如果我在我的应用程序中成功购买(并且已经调用了completeTransaction:),然后终止我的应用程序(在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,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:调用.这是怎么回事?
解决方法
应用程序启动时发生的交易实际上是Apple正在执行的自动续订过程的一部分. life of a 1 month subscription in the Apple Sandbox is 5 minutes,所以我在启动我的应用程序时会在队列中有1,2或3个事务,具体取决于自上次启动它以来它是5分钟,10分钟还是15分钟.
我不得不调整一些服务器端设置,以确保续订不被视为与新订阅相同.