AutoRenewable In-Appurchase 中的 Completion Handler 崩溃

Posted

技术标签:

【中文标题】AutoRenewable In-Appurchase 中的 Completion Handler 崩溃【英文标题】:Completion Handler crash in AutoRenewable In-Appurchase 【发布时间】:2013-11-18 09:06:32 【问题描述】:

我正在做一个应用程序,我必须让我的 Inappurchase 产品自动更新,为此,在阅读 Apple 文件后,我知道在每次自动更新产品交易后,我们的应用程序都会收到每次购买的交易收据在验证我的交易收据应用程序必须保存该交易日期后,我需要验证来自 Apple 服务器的收据。 但是在购买产品后,当我尝试通过 Apple 类 - 验证控制器验证来自 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);
    
    

【问题讨论】:

【参考方案1】:

我也遇到了这个问题我用这种方式解决了这个问题 主要问题是当您在 verifyPurchase 方法中为完成处理程序设置值时,它正在设置 nil 值,因此在 verifyPurchase 方法中找到此行

_completionHandlers[[NSValue valueWithNonretainedObject:conn]] = completionHandler;

替换成

[_completionHandlers setObject:[completionHandler copy] forKey:[NSValue valueWithNonretainedObject:conn]];

更改这两行将解决您的崩溃问题,但请确保也执行这些步骤

并找到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]];
   

【讨论】:

以上是关于AutoRenewable In-Appurchase 中的 Completion Handler 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iTunes 中没有 AutoRenewable In-App Purchases 选项