4

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

我的应用程序在自动更新订阅模型上运行。我有一个 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:在将收据发送到我的服务器之前拨打电话也是如此。这是怎么回事?

4

2 回答 2

3

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

应用程序启动时发生的交易实际上是 Apple 执行的自动更新过程的一部分。Apple Sandbox 中 1 个月订阅的生命周期为 5 分钟,因此在启动我的应用程序时,我的队列中会有 1、2 或 3 个事务,具体取决于我启动应用程序后是 5、10 还是 15 分钟最后的。

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

于 2012-06-01T13:42:48.313 回答
0

完成交易需要多长时间都没关系..您需要打电话[[SKPaymentQueue defaultQueue] finishTransaction:transaction];以防万一您将内容交付给用户(在您成功完成订阅的情况下)。

于 2012-05-23T15:09:43.550 回答