Вопрос или проблема
Нестандартное исключение C++ сообщается Crashlytics для 5% пользователей после миграции приложения на новую архитектуру. Обратите внимание, что это невозможно воспроизвести на отладочных сборках, и это происходит редко в нижних средах. Проблема возникает при загрузке приложения и повторяется для одного и того же пользователя в приложении, загруженном из App Store. Проблема сообщается только в сборках для iOS. Ниже приводится стек вызовов ошибки.
Фатальное исключение: RCTFatalException: нестандартное исключение C++
0 CoreFoundation 0x9e88 __exceptionPreprocess
1 libobjc.A.dylib 0x178d8 objc_exception_throw
2 TSC 0x6b2f88 RCTFormatError + 167 (RCTAssert.m:167)
3 TSC 0x6ca740 -[RCTCxxBridge handleError:] + 1123 (RCTCxxBridge.mm:1123)
4 TSC 0x6c90a0 __34-[RCTCxxBridge _initializeBridge:]_block_invoke + 668 (RCTCxxBridge.mm:668)
5 TSC 0x6dd080 facebook::react::RCTMessageThread::tryFunc(std::__1::function<void ()> const&) + 72 (RCTMessageThread.mm:72)
6 TSC 0x6dce2c invocation function for block in facebook::react::RCTMessageThread::runAsync(std::__1::function<void ()>) + 45 (RCTMessageThread.mm:45)
7 CoreFoundation 0x43564 CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK
8 CoreFoundation 0xabd9c __CFRunLoopDoBlocks
9 CoreFoundation 0x7bb98 __CFRunLoopRun
10 CoreFoundation 0x80ed4 CFRunLoopRunSpecific
11 TSC 0x6c6e30 +[RCTCxxBridge runRunLoop] + 332 (RCTCxxBridge.mm:332)
12 Foundation 0x5b808 NSThread__start
13 libsystem_pthread.dylib 0x16cc _pthread_start
14 libsystem_pthread.dylib 0xba4 thread_start
Обратите внимание, что проблема не часто воспроизводится и сообщается Crashlytics примерно для 5% от общего числа пользователей. Будет полезно, если мы получим какие-либо подсказки по устранению проблемы, так как это снижает наш процент безаварийности.
Ответ или решение
Ваша проблема с "Fatal Exception in RCTCxxBridge.mm" после миграции на новую архитектуру React-Native представляет собой сложный случай, который, безусловно, требует внимательного анализа и систематического подхода к поиску решений. Давайте разберём причину и возможные пути устранения данной неисправности.
Проблема
Вы наблюдаете не стандартное исключение C++ от Crashlytics у 5% пользователей после перехода на новую архитектуру React-Native, что приводит к падениям приложения на загрузке на iOS. Это исключение не воспроизводится в отладочных сборках и возникает исключительно на сборках из App Store. Сужение проблемы до iOS сборок также указывает на возможные платформенные особенности или проблемы в кодовой базе, связанные с взаимодействием C++ и Objective-C.
Краткий анализ стек-трейса
Из стек-трейса видим:
RCTFormatError
указывает на отсутствие некоторого требуемого значения или неправильно заданный формат данных.handleError:
и_initializeBridge:
предполагают, что ошибка происходит во время инициализации моста (Bridge) между JavaScript и нативным кодом.
Возможные причины неисправности
-
Асинхронные операции: Ошибка могла быть вызвана временной несогласованностью данных или асинхронностью, когда JavaScript пытается обращаться к нативным методам до их полной инициализации.
-
Проблемы с конфигурацией: При миграции могут возникать проблемы с конфигурацией по умолчанию, что может привести к неинициализированным полям или отсутствию необходимых данных на этапе инициализации.
-
Версии библиотек: Убедитесь, что вы используете совместимые с новой архитектурой версии библиотек, связанных с React-Native, для iOS.
-
Инициализация модулей: Посмотрите на модули, которые инициализируются в вашем приложении. Возможно, есть зависимость между модулями, которые не учитываются в новом архитектурном подходе.
Рекомендации по устранению неисправности
-
Логирование и трассировка: Улучшите логирование, чтобы отследить состояние данных и процесс инициализации. Это позволит лучше понять, в каком конкретно месте происходит сбой.
-
Обработка исключений: Внедрите более детальную обработку исключений вокруг кода, который инициирует модули на JavaScript и нативной части, чтобы вы могли точно определить, какое исключение вызывается.
-
Тестирование в реальных условиях: Попробуйте воспроизвести проблему, используя устройства с аналогичной конфигурацией, как у пользователей, у которых возникла ошибка.
-
Обновление зависимостей: Убедитесь, что у вас установлены последние версии React-Native и связанных библиотек. Проверьте changelog для известных проблем в версиях.
-
Проверка конфигурации проекта: Пересмотрите настройки вашего проекта Xcode для наличия несоответствий или идей о том, что могло уйти не так в процессе миграции.
Заключение
Данная ошибка, вызванная миграцией на новую архитектуру React-Native, может быть результатом множества факторов. Высокая сложность, а также отсутствие возможности воспроизведения проблемы усложняет поиск решения, однако применяя предложенные стратегии, вы сможете значительно сократить количество сбоев и повысить уровень стабильности вашего приложения. Рекомендуется также наладить коллективное обсуждение и анализ отзывов пользователей для выявления новых кейсов.
Если у вас есть доступ к профессиональным разработчикам, работающим с React-Native, можно рассмотреть возможность создания временной группы по расследованию проблем, связанных с переходом на новую архитектуру.