簡體   English   中英

應用程序與UITabBarController和In App Purchases崩潰

[英]App crashed with UITabBarController and In App Purchases

在應用內購買和我的引用中使用我的應用在這里

當我通過塊從服務器加載產品時,同時我切換到UITabBarController內的其他選項卡,當應用程序加載時應用程序崩潰

這是我的代碼

//Load products from server
[[LAInAppHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) {
    if (success) {
        // even i do nothing in here app till crashed
    }
}];

如果我刪除這行,我可以在任何標簽之間切換。 崩潰時沒有任何東西被應用程序拋出,即使我啟用了Zombie對象。 只是訪問不好

您鏈接教程中 LAInAppHelper的實現存在問題:幫助程序將您的應用程序視為非並發。

以下是正在發生的事情: LAInAppHelper的共享實例有一個sharedInstance ,它擁有_completionHandler (以及其他內容)。

requestProductsWithCompletionHandler:方法為_completionHandler分配已傳入的塊的副本。對於第一個請求,這是可以的,但如果另一個請求是“在飛行中”,那么另一個請求的完成塊將由ARC釋放重新分配。 如果您切換到的選項卡啟動並發請求,則初始請求將返回到已釋放的塊,從而導致未定義的行為,並可能導致崩潰。

要解決此問題,您需要將類拆分為兩個 - 一個部分包含所有請求共有的項(即_productIdentifiers_purchasedProductIdentifiers )和特定於請求的項( _productsRequest_completionHandler )。

第一個類的實例(讓我們稱之為LAInAppHelper )仍然是共享的; requestProductsWithCompletionHandler:方法中,每個請求創建第二個類的實例(讓我們稱之為LAInAppHelperRequest )。

-(id)initWithHelper:(LAInAppHelper*)helper
    andCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
    if (self = [super init]) {
        _completionHandler = [completionHandler copy];
        _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:helper.productIdentifiers]; // You will need to make productIdentifiers a property
        _productsRequest.delegate = self;
        [_productsRequest start];
    }
    return self;
}

您還需要創建一個包裝_completionHandler的塊,如下所示:

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
    __block LAInAppHelperRequest *req = [[LAInAppHelperRequest alloc] initWithHelper:self andCompletionHandler:^(BOOL success, NSArray *products) {
         completionHandler(success, products);
         req = nil;
    }];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM