在应用程序内购买的iOS 6(In-app purchase iOS 6)

2019-10-17 06:28发布

我想在应用程序内购买,以实现对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];
}

Answer 1:

问题出现,如果

-(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是零,如果不是因为处理程序正在使用,则它忽略了请求。



Answer 2:

(我愿把这个作为一个评论,但我是新来的)嗨,我对工作压力太大,善良做你想要什么。 你已经解决了这个问题? 我希望如此,但以防万一!

您已实现SKProductsRequestDelegate协议?

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response


Answer 3:

我决定发布一个答案,而不是对未来的读者评论。 我当时也是继雷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

因为其他方法释放的对象。 或者,你可以声明在声明属性,然后使用该对象的自动释放版本。

我希望这可以帮助别人,我花了一段时间来弄明白(可能是因为我只是下面的教程)。



Answer 4:

我希望这份文件会帮助你。



文章来源: In-app purchase iOS 6