AutoRenewable In-Appurchase中的完成处理程序崩溃

1 iphone crash transactions ios completionhandler

我正在制作一个应用程序,其中,我必须使我的Inappurchase产品自动更新,为此,在阅读Apple文档后我才知道,在每次自动更新产品交易后,我们的应用程序收到每次购买的交易收据,我需要在验证我的交易收据应用程序之后验证来自Apple服务器的收据是否必须保存该交易日期.但在购买产品后,当我试图通过Apple Classes -Verification Controller验证Apple服务器的交易收据时,我的应用程序在完成处理程序时崩溃,其显示完成处理程序NIL.

当执行到达任何这些方法时,我的_completionHandlers被释放了什么?请指导我解决这个问题

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  {
    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    // So we got some receipt data. Now does it all check out?
    BOOL isOk = [self doesTransactionInfoMatchReceipt:responseString];

    VerifyCompletionHandler completionHandler = _completionHandlers[[NSValue valueWithNonretainedObject:connection]];

    NSValue *key = [NSValue valueWithNonretainedObject:connection];

    NSLog(@"%@",_completionHandlers);
    [_completionHandlers removeObjectForKey:key];
    if (isOk)
    {
    //Validation suceeded. Unlock content here.
    NSLog(@"Validation successful");
    completionHandler(TRUE);
    } else {
    NSLog(@"Validation failed");
    completionHandler(FALSE);
    }
    }
Run Code Online (Sandbox Code Playgroud)

Adi*_*wal 5

我也遇到了这个问题,我解决了这个问题,这个问题是当你在verifyPurchase方法中设置值为完成处理程序时,它设置为nil值,所以在verifyPurchase方法中找到这一行

_completionHandlers[[NSValue valueWithNonretainedObject:conn]] = completionHandler;
Run Code Online (Sandbox Code Playgroud)

并替换它

[_completionHandlers setObject:[completionHandler copy] forKey:[NSValue valueWithNonretainedObject:conn]];
Run Code Online (Sandbox Code Playgroud)

更改这两行将解决您的崩溃,但双重确定也执行这些步骤

并找到connectionDidReceivedata方法并将其替换为

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    // So we got some receipt data. Now does it all check out?
    BOOL isOk = [self doesTransactionInfoMatchReceipt:responseString];


    if (_completionHandlers && [_completionHandlers respondsToSelector:@selector(removeObjectForKey:)])
    {
        VerifyCompletionHandler completionHandler = _completionHandlers[[NSValue valueWithNonretainedObject:connection]];
        [_completionHandlers removeObjectForKey:[NSValue valueWithNonretainedObject:connection]];
        if (isOk)
        {
            //Validation suceeded. Unlock content here.
            NSLog(@"Validation successful");
            completionHandler(TRUE);

        } else {
            NSLog(@"Validation failed");
            completionHandler(FALSE);
        }

    }
    //[_completionHandlers removeObjectForKey:[NSValue valueWithNonretainedObject:connection]];
   }
Run Code Online (Sandbox Code Playgroud)