yandexmobile / yandex-ads-sdk-ios

Yandex Mobile Ads SDK iOS
https://yandex.com/dev/mobile-ads/
Other
40 stars 8 forks source link

YandexMobileAds 5.9.1 -[UIImage(YMA_Scale) yma_scaledToSize:] iOS 17 crash #186

Closed Algashev closed 8 months ago

Algashev commented 10 months ago

YandexMobileAds 5.9.1

Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0xec870 __exceptionPreprocess
1  libobjc.A.dylib                0x2bc00 objc_exception_throw
2  Foundation                     0x6b6e54 -[NSMutableDictionary(NSMutableDictionary) initWithContentsOfFile:]
3  UIKitCore                      0xf43a4 _UIGraphicsBeginImageContextWithOptions
4  MY_APP_NAME                    0x67cc8c -[UIImage(YMA_Scale) yma_scaledToSize:]
5  MY_APP_NAME                    0x67ce78 __65+[YMA_SLColorArt processImage:scaledToSize:threshold:onComplete:]_block_invoke
6  libdispatch.dylib              0x26a8 _dispatch_call_block_and_release
7  libdispatch.dylib              0x4300 _dispatch_client_callout
8  libdispatch.dylib              0x744c _dispatch_queue_override_invoke
9  libdispatch.dylib              0x15be4 _dispatch_root_queue_drain
10 libdispatch.dylib              0x163ec _dispatch_worker_thread2
11 libsystem_pthread.dylib        0x1928 _pthread_wqthread
12 libsystem_pthread.dylib        0x1a04 start_wqthread

Большое количество сбоев на iOS 17 / iPadOS 17

mobile-ads-github commented 10 months ago

Спасибо за Ваше обращение, для разбора создана задача с номером PCODESUP-2667. Мы ознакомимся и вернемся с ответом в течение 2 дней, возможно запросим дополнительную информацию.

Thank you for your message, a task with the number PCODESUP-2667 has been created for analysis. We will get acquainted and return with the answer within 2 days, we may request additional information.

mobile-ads-github commented 10 months ago

Здравствуйте! К сожалению, у нас не получилось воспроизвести проблему. Пришлите пожалуйста следующую информацию:

REXDEVRU commented 10 months ago

Подтверждаю. SDK 5.9.1, все крэши iOS 17.x

Fatal Exception: NSInternalInconsistencyException UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size={0, 0}, scale=1.000000, bitmapInfo=0x2002. Use UIGraphicsImageRenderer to avoid this assert.

Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0xec870 __exceptionPreprocess
1  libobjc.A.dylib                0x2bc00 objc_exception_throw
2  Foundation                     0x6b6e54 -[NSMutableDictionary(NSMutableDictionary) initWithContentsOfFile:]
3  UIKitCore                      0xf43a4 _UIGraphicsBeginImageContextWithOptions
4  ssApp                          0x923f40 -[UIImage(YMA_Scale) yma_scaledToSize:]
5  ssApp                          0x92412c __65+[YMA_SLColorArt processImage:scaledToSize:threshold:onComplete:]_block_invoke
6  libdispatch.dylib              0x26a8 _dispatch_call_block_and_release
7  libdispatch.dylib              0x4300 _dispatch_client_callout
8  libdispatch.dylib              0x744c _dispatch_queue_override_invoke
9  libdispatch.dylib              0x15be4 _dispatch_root_queue_drain
10 libdispatch.dylib              0x163ec _dispatch_worker_thread2
11 libsystem_pthread.dylib        0x1928 _pthread_wqthread
12 libsystem_pthread.dylib        0x1a04 start_wqthread
mobile-ads-github commented 10 months ago

Здравствуйте, такое может возникать на iOS 17, если вы запрашиваете inline баннер с высотой или/и шириной равной 0. Или sticky - с шириной равной 0. Мы исправим это в следующем релизе. Также, рекомендуем вам использовать корректные размеры при запросе баннеров, для того чтобы повысить количество показываемой рекламы.

REXDEVRU commented 10 months ago

Здравствуйте, такое может возникать на iOS 17, если вы запрашиваете inline баннер с высотой или/и шириной равной 0. Или sticky - с шириной равной 0.

Добрый день! Это sticky баннер.

-(YMAAdView *)adView {
    if (!_adView) {
        CGFloat width = UIScreen.mainScreen.bounds.size.width;
        YMAAdSize *adSize = [YMAAdSize stickySizeWithContainerWidth:width];
        _adView = [[YMAAdView alloc] initWithAdUnitID:AdYandexBannerUnitID adSize:adSize];
        _adView.delegate = self;
        _adView.translatesAutoresizingMaskIntoConstraints = NO;
    }
    return _adView;
}

Мы исправим это в следующем релизе. Также, рекомендуем вам использовать корректные размеры при запросе баннеров, для того чтобы повысить количество показываемой рекламы.

Релиз будет с минимальным таргетом iOS 13.0?

REXDEVRU commented 10 months ago
Снимок экрана 2023-12-06 в 21 57 47

это норма, что [YMAAdSize stickySizeWithContainerWidth:width] возвращает такое?

mobile-ads-github commented 10 months ago
Снимок экрана 2023-12-06 в 21 57 47

это норма, что [YMAAdSize stickySizeWithContainerWidth:width] возвращает такое?

Здравствуйте,

  1. Да это норма
  2. Да, версия SDK 6 требует поднятия минимального таргета на iOS13

Код со скриншота выше вызывает краш, при каждом показе рекламы?

REXDEVRU commented 10 months ago

Код со скриншота выше вызывает краш, при каждом показе рекламы?

Нет, код не вызывает постоянных крашей. Более того, при многократных тестах (в дебаг режиме), добиться хотя бы одного падения - не удалось. Краши появились с выходом iOS 17.

Для понимания, статистика в абсолютных значениях за прошедшие 30 дней:

Да, версия SDK 6 требует поднятия минимального таргета на iOS13

Печально, к сожалению, достаточно приличное количество пользователе сидит на 12.x и я не готов ими пожертвовать, тем более, что среди них есть платящие. =[

mobile-ads-github commented 10 months ago

Как временную меру, для iOS 17 можно использовать fixed баннер. Есть ли вероятность того что ваш код может вызываться во время инициализации приложения? Например, до/во время выполнения метода application:didFinishLaunchingWithOptions ?

REXDEVRU commented 10 months ago

Есть ли вероятность того что ваш код может вызываться во время инициализации приложения? Например, до/во время выполнения метода application:didFinishLaunchingWithOptions ?

Да, YMAAdView создается из viewDidLoad rootViewController'a, который инициализируется в процессе выполнения application:didFinishLaunchingWithOptions

Отложенное создание YMAAdView может решить проблему?

mobile-ads-github commented 10 months ago

Покажите пожалуйста место, где вы первый раз обращаетесь к adView

REXDEVRU commented 10 months ago

Покажите пожалуйста место, где вы первый раз обращаетесь к adView

Снимок экрана 2023-12-07 в 16 43 30
mobile-ads-github commented 10 months ago

В данной конфигурации, можно вынести конфигурацию adView во ViewDidAppear, или попробовать 40 строку перенести после 46.

REXDEVRU commented 10 months ago

В данной конфигурации, можно вынести конфигурацию adView во ViewDidAppear, или попробовать 40 строку перенести после 46.

Ок, т.е. я правильно понял, что проблема в том, что инициализация YMAAdView происходит до того как у приложения появился keyWindow с присвоенным rootViewController?

Правда перенос строк в данном случае не поможет =) т.к. в строке 45 будет точно такой же стэк вызова потому как, точно так же произойдет инициализация SSTabBarController при обращении к self.rootViewContoller, да и viewDidAppear имхо не лучшее место для одноразовой инициализации вьюх, но не суть. Если проблема именно в этом то это легко решаемо, но было бы здорово если бы это было отражено в документации (а в идеале assert срабатывал на это дело=) ибо не совсем очевидно.

mobile-ads-github commented 10 months ago

Проблема в том что в AdView передается некорректный размер. Также это видно из стактрейса который вы приложили. Обычно UIScreen.mainScreen.bounds.size всегда валидный, но такое поведение может происходить если к нему обращаются либо до application:didFinishLaunchingWithOptions, либо в application:didFinishLaunchingWithOptions. Вероятнее всего, когда вы будете инициализировать YMAAdView, после появления keyWindow с присвоенным rootViewController, - UIScreen.mainScreen.bounds.size будет всегда валидный.