このチュートリアルを使用して、いくつかの IAP に取り組んでいます。
まず、これで製品を取得します:
-(void)fetchAvailableProductsFirstLoad:(BOOL)firstTimeLoading {
[[IAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) { ...
ヘルパーは以下を実行します。
- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
@synchronized(self) {
// 1
_completionHandler = [completionHandler copy];
// 2
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];
}
}
製品が返品または失敗した場合、以下が呼び出されます。
#pragma mark - SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSLog(@"Loaded list of products...");
_productsRequest = nil;
NSArray * skProducts = response.products;
for (SKProduct * skProduct in skProducts) {
NSLog(@"Found product: %@ %@ %0.2f",
skProduct.productIdentifier,
skProduct.localizedTitle,
skProduct.price.floatValue);
}
_completionHandler(YES, skProducts);
_completionHandler = nil;
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
NSLog(@"Failed to load list of products.");
NSLog(@"Error: %@",error);
_productsRequest = nil;
_completionHandler(NO, nil);
_completionHandler = nil;
}
問題
問題は、ユーザーがフェッチまたは製品を 2 回開始した場合です。たとえば、フェッチ製品はviewDidLoadで呼び出されますが、ユーザーの接続が悪い/遅い場合は、コントローラーから離れてからコントローラーに戻ります。初期フェッチはキャンセルされないため、2 つ実行されています。
問題は、秒が返され、ポインターが変更された/存在しない/破損した場合だと思います。
関連する行で EXC_BAD_ACCESS コード 2 エラーが発生します。
_completionHandler(YES, skProducts);
また
_completionHandler(NO, nil);