Сбой iOS в UIViewController.presentViewController - PullRequest
1 голос
/ 24 сентября 2019

У меня есть периодический (редко встречающийся) сбой, который до сих пор происходил только в дикой природе с отчетами из AppStore.Из-за ограниченного журнала сбоев мне не удалось решить эту проблему.

Я пытаюсь отобразить представление страницы продукта App Store.Вот код

The enclosing class includes the SKStoreProductViewControllerDelegate  and
the delegate is set to self.

@objc func adTap(sender: UITapGestureRecognizer? = nil) -> Void {
    if  adAppID.isEmpty {return}
    let paramDict = [SKStoreProductParameterITunesItemIdentifier: adAppID]
    storeProductViewController.loadProduct(withParameters: paramDict, completionBlock: { (status: Bool, error: Error?) -> Void in
        if status {
            self.storeProductViewController.view.frame.origin.y = 0
            let eventParams = ["AppID": self.adAppID]
            self.present(self.storeProductViewController, animated: true, completion: nil)
        }
        else {
            if let error = error {
                print("Error: \(error.localizedDescription)")
            }
        }})
}

Ошибка при self.present:

#8  (null) in thunk for @escaping @callee_guaranteed (@unowned Bool, @guaranteed Error?) -> () ()

#7  0x100b68350 in closure #1 in ViewController.adTap(sender:)

#6  (null) in -[UIViewController presentViewController:animated:completion:] ()

#0  (null) in __exceptionPreprocess ()

Вывод файла фактической наличности показывает SIGABRT:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x1ad1db278 __exceptionPreprocess + 220 (NSException.m:199)
1   libobjc.A.dylib                 0x1acf040a4 objc_exception_throw + 56 (objc-exception.mm:565)
2   UIKitCore                       0x1b0bcbe0c -[UIViewController _presentViewController:withAnimationController:completion:] + 4880 (UIViewController.m:7185)
3   UIKitCore                       0x1b0bce074 __63-[UIViewController _presentViewController:animated:completion:]_block_invoke + 104 (UIViewController.m:7671)
4   UIKitCore                       0x1b0bce570 -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 508 (UIViewController.m:7772)
5   UIKitCore                       0x1b0bcdfc4 -[UIViewController _presentViewController:animated:completion:] + 196 (UIViewController.m:7678)
6   UIKitCore                       0x1b0bce22c -[UIViewController presentViewController:animated:completion:] + 160 (UIViewController.m:7716)
7   MyAppName                       0x100b68350 closure #1 in ViewController.adTap(sender:) + 1016 (ViewController.swift:991)
8   MyAppName                       0x100b68580 thunk for @escaping @callee_guaranteed (@unowned Bool, @guaranteed Error?) -> () + 60 (<compiler-generated>:0)
9   StoreKit                        0x1bba3c1e8 -[SKStoreProductViewController _loadDidFinishWithResult:error:] + 48 (SKStoreProductViewController.m:425)
10  StoreKit                        0x1bba3e624 -[SKRemoteProductViewController loadDidFinishWithResult:error:] + 128 (SKRemoteProductViewController.m:61)

///////

Я понимаю, что блок завершения является неявно экранирующим блоком, но я не вижу, как он не соответствует спецификации блока (аргументы, если это действительно проблема).Опять же, это случайное событие.Никогда не видел его на устройстве, привязанном к Xcode или на одном из наших отвязанных устройств.Недавно это произошло в полевых условиях, один раз на iPhone 7 под управлением iOS 13 и один раз на X под управлением 12.3.1

/////

Любые мысли приветствуются

1 Ответ

2 голосов
/ 24 сентября 2019

Позвольте мне написать это как ответ, поскольку теперь я вижу, что мой комментарий может быть неясным.Блок

if status {
        self.storeProductViewController.view.frame.origin.y = 0
        let eventParams = ["AppID": self.adAppID]
        self.present(self.storeProductViewController, animated: true, completion: nil)
    }

обращается к некоторым элементам пользовательского интерфейса, но может не работать в основном потоке (так как он находится внутри обратного вызова).Итак, во-первых, я бы заподозрил, что происходит сбой, если он вызывается вне основного потока.Поэтому я бы попробовал это:

if status {
    DispatchQueue.main.async {
        self.storeProductViewController.view.frame.origin.y = 0
        let eventParams = ["AppID": self.adAppID]
        self.present(self.storeProductViewController, animated: true, completion: nil) 
    }
}

Если это поможет, возможно, подумайте о лучшем разделении MVC ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...