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)
我也遇到了这个问题,我解决了这个问题,这个问题是当你在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)