加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – SKPaymentQueue finishTransaction:在网络完成

发布时间:2020-12-14 17:30:37 所属栏目:百科 来源:网络整理
导读:这个问题让我头疼了一段时间. 我的应用程序采用自动更新的订阅模式.我有一个SKPaymentQueue transactionObserver,当通过Apple成功完成购买时会通知我,此时我将Apple收据发送到我的服务器以验证我的结果.一旦我验证它,我就会向我的应用程序发送一个成功回调,
这个问题让我头疼了一段时间.

我的应用程序采用自动更新的订阅模式.我有一个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:调用.这是怎么回事?

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读