我想在应用程序内购买,以实现对iOS 6的和我下面雷Wenderlich的iOS 6应用程序内的教程为我的参考点。 我从雷的代码做一个大的变化是,我有一个按钮(只有1应用程序内购买),该用户点击购买反对做了定制表视图。 我似乎无法得到它的工作,我不断收到
-[__NSMallocBlock__ allObjects]: unrecognized selector sent to instance 0x1d5846d0
2012-10-03 00:03:25.715 myapp[752:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSMallocBlock__ allObjects]: unrecognized selector sent to instance 0x1d5846d0'
我相信这个问题是内发生的事情
- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler
有迹象表明,光线已实施和已实施了2辅助类。 所有我改变了这是应用程序ID号。 这些类被称为IAPHelper.h / m和RageIAPHelper.h /米
我已经发布,我认为错误是发生(这是不长)的代码。 如果有人能帮我,我一直在这个约4小时了。 先感谢您
里面purchaseViewController
-(void) viewDidLoad
{
[super viewDidLoad];
[self reload]; //Customized for my own needs compared to what Ray had
}
-(void)reload {
_products = nil;
[[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) {
if (success) {
_products = products;
//[self.tableView reloadData];
}
//[self.refreshControl endRefreshing];
}];
}
所谓IAPHelper.m内部helper方法
- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
// 1
_completionHandler = [completionHandler copy];
// 2
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers]; // This is where I think the crash is
_productsRequest.delegate = self;
[_productsRequest start];
}
问题出现,如果
-(void)requestProdcutsWithCompletionHandler:(RequestProductsCompletionHandler)
completionHandler{
....
{
在第一次调用完成之前被调用了两次。 其原因是由于使用SKProductsRequestDelegate并且当它接收到一个响应调用以下功能:
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:
(SKProductsResponse *)response{
...
_completionHandler(YES, availableProducts)
_completionHandler = nil;
}
请注意如何响应处理后_completionHandler设为零。 那么,当下一个响应从重复调用“requestProductsWithCompletionHandler”来通过,_completionHandler是零,并抛出异常。 你可以解决这个问题的方式有两种确保你不调用该函数多次(坏的方式),或者把一些逻辑,以确保completionHandler不使用:
-(void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler{
NSLog(@"Request Products");
if (!_completionHandler) {
NSLog(@"CompletionHandler called, new one was made");
_completionHandler = [completionHandler copy];
NSMutableSet * productIdentifiers = [NSMutableSet setWithCapacity:_products.count];
for (IAPProduct * product in _products.allValues) {
product.availableForPurchase = NO;
[productIdentifiers addObject:product.productIdentifier];
}
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
_productsRequest.delegate=self;
[_productsRequest start];
}else{
NSLog(@"Duplicate call!");
}
}
productRequest首先检查以确保_completionHanlder是零,如果不是因为处理程序正在使用,则它忽略了请求。
(我愿把这个作为一个评论,但我是新来的)嗨,我对工作压力太大,善良做你想要什么。 你已经解决了这个问题? 我希望如此,但以防万一!
您已实现SKProductsRequestDelegate协议?
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
我决定发布一个答案,而不是对未来的读者评论。 我当时也是继雷Wenderlich教程但在执行中发现的问题,这是导致飞机失事的原因我。
他宣称几两个问题的实例变量(对我来说,至少):
_productIdentifiers
和_purchasedProductIdentifiers
因为单身的初始化他指派他们将被释放的对象。 也许这是因为我的项目未使用ARC,但我不这么认为。 在任何情况下,如果你改变他的教程这样的代码:
// Store product identifiers
/*_productIdentifiers = productIdentifiers; ----> This is the original code */
_productIdentifiers = [[NSSet alloc]initWithSet:productIdentifiers]; // Replace with this
// Check for previously purchased products
/*_purchasedProductIdentifiers = [NSMutableSet set]; ----> This is the original code*/
_purchasedProductsIdentifiers = [[NSMutableSet alloc]init]; //Replace with this
因为其他方法释放的对象。 或者,你可以声明在声明属性,然后使用该对象的自动释放版本。
我希望这可以帮助别人,我花了一段时间来弄明白(可能是因为我只是下面的教程)。