gpt4 book ai didi

objective-c - SKPaymentQueue finishTransaction : within network completion block?

转载 作者:可可西里 更新时间:2023-11-01 05:46:48 27 4
gpt4 key购买 nike

这个问题让我头疼了一段时间。

我的应用采用自动续订订阅模式。我有一个 SKPaymentQueue transactionObserver,当通过 Apple 成功完成购买时会收到通知,此时我将 Apple 收据发送到我的服务器以在我这边进行验证。验证后,我会向我的应用程序发送成功调用,该应用程序会向用户提供内容,然后调用 finishTransaction: 交易(according to the docs 是正确的操作过程)。

问题是,我担心要等这么长时间才能调用 finishTransaction:在 Apple 期望它被调用之后(3-4 秒)禁止事务实际“完成”。如果我成功地在我的应用程序中进行了购买(并且已调用 finishTransaction:),然后终止我的应用程序(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]; 在对我的服务器的请求的成功或失败 block 中被调用。这会不会有问题?

*编辑*如果我在将收据发送到我的服务器进行验证之前调用 SKPaymentQueue:finishTransaction: 似乎不会发生此问题,这让我相信在网络请求 block 中调用它确实是导致问题的原因。但这不是处理事情的正确方法,所以我仍然卡住了。

*编辑 2*事实证明,在启动应用程序时,交易有时仍会“恢复”,即使我在将收据发送到我的服务器之前调用了 finishTransaction: 也是如此。怎么回事?

最佳答案

经过几周的“幻影”购买,我终于意识到发生了什么。这不是 finishTransaction: 或 AFNetworking 的错。

应用启动时发生的交易实际上是 Apple 执行的自动续订流程的一部分。 life of a 1 month subscription in the Apple Sandbox is 5 minutes ,因此在启动我的应用程序时,队列中会有 1、2 或 3 个事务,具体取决于自上次启动它后是 5、10 还是 15 分钟。

我不得不调整一些服务器端设置,以确保续订不会被视为与新订阅相同。

关于objective-c - SKPaymentQueue finishTransaction : within network completion block?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10722630/

27 4 0