![](/img/trans.png)
[英]Rejected app because App crashed when attempted to download one of the 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.