Приложение React-Native iOS аварийно завершает работу сразу после запуска при создании сборки для разработки

Я создал приложение для iOS, используя React Native. Я довел приложение до такой степени, что оно работает на симуляторе iPhone через приложение Expo. Это работает даже при создании сборки приложения для распространения с помощью TestFlight. Теперь я хочу добавить Google Ads в приложение. Однако я узнал, что Google Ads не будет работать через сборку Expo. Вместо этого нужно создать сборку для разработки, чтобы протестировать рекламу в приложении и посмотреть, как она выглядит.

Мне также наконец удалось скомпилировать успешную сборку для разработки с использованием eas (службы выставочных приложений). Однако когда я устанавливаю приложение на симулятор и пытаюсь его открыть, приложение почти сразу же вылетает, и я не знаю почему. Я попытался расшифровать символизированный отчет о сбое, но мне не удалось выяснить, что может быть причиной ошибки. Похоже, это как-то связано с пользовательским интерфейсом.

Ниже приведена тема, где приложение вылетает:

Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib                 0x11324a14a __pthread_kill + 10
1   libsystem_pthread.dylib                0x1132abebd pthread_kill + 262
2   libsystem_c.dylib                   0x7ff80016dd1c abort + 133
3   libc++abi.dylib                     0x7ff8002c6d12 abort_message + 241
4   libc++abi.dylib                     0x7ff8002b951a demangling_terminate_handler() + 266
5   libobjc.A.dylib                     0x7ff800061fba _objc_terminate() + 96
6   libc++abi.dylib                     0x7ff8002c616b std::__terminate(void (*)()) + 6
7   libc++abi.dylib                     0x7ff8002c6126 std::terminate() + 54
8   libdispatch.dylib                   0x7ff8001796ec _dispatch_client_callout + 28
9   libdispatch.dylib                   0x7ff80017d1e2 _dispatch_block_invoke_direct + 508
10  FrontBoardServices                  0x7ff807a8b3a7 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 30
11  FrontBoardServices                  0x7ff807a8b281 -[FBSMainRunLoopSerialQueue _targetQueue_performNextIfPossible] + 188
12  FrontBoardServices                  0x7ff807a8b3cf -[FBSMainRunLoopSerialQueue _performNextFromRunLoopSource] + 19
13  CoreFoundation                      0x7ff800429ff3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
14  CoreFoundation                      0x7ff800429f35 __CFRunLoopDoSource0 + 157
15  CoreFoundation                      0x7ff800429732 __CFRunLoopDoSources0 + 215
16  CoreFoundation                      0x7ff800423e67 __CFRunLoopRun + 919
17  CoreFoundation                      0x7ff8004236ed CFRunLoopRunSpecific + 557
18  GraphicsServices                    0x7ff8103ba08f GSEventRunModal + 137
19  UIKitCore                           0x7ff805cdf6ee -[UIApplication _run] + 972
20  UIKitCore                           0x7ff805ce416e UIApplicationMain + 123
21  LeftOff                                0x10f870380 main + 96
22  dyld_sim                               0x112d3a3e0 start_sim + 10
23  dyld                                   0x113d57366 start + 1942

Я пытаюсь решить эту проблему уже несколько дней, и мне действительно нужна помощь. Я также пробовал менять версии зависимостей в своем приложении, уделяя особое внимание тем, которые управляют пользовательским интерфейсом. Например, я изменил такие пакеты, как React-native-ranimated, React-navigation/stack, React-native-gesture-handler и React-native-screens, и это лишь некоторые из них. Пока ничего не помогло. Пожалуйста помоги.

Для большего контекста я использую

eas build --profile development-simulator --platform ios --local

в терминале, чтобы создать сборку для разработки. Это позволяет мне создать файл .tar.gz, который я могу разархивировать и затем установить на симуляторе.

Это мой файл eas.json:

{
  "cli": {
    "version": ">= 7.6.0"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {
      "ios": {
        "image": "latest"
      }
    },
    "development-simulator": {
      "developmentClient": true,
      "distribution": "internal",
      "ios": {
        "simulator": true
      }
    }
  },
  "submit": {
    "production": {}
  }
}

Вот мой файл package.json:

{
  "name": "mycoolapp",
  "version": "1.0.0",
  "scripts": {
    "start": "expo start --dev-client",
    "android": "expo run:android",
    "ios": "expo run:ios",
    "web": "expo start --web"
  },
  "dependencies": {
    "@babel/preset-env": "^7.24.5",
    "@babel/runtime": "^7.24.5",
    "@expo/config-plugins": "^8.0.4",
    "@expo/prebuild-config": "^7.0.4",
    "@react-native-community/masked-view": "^0.1.11",
    "@react-native-masked-view/masked-view": "^0.2.9",
    "@react-navigation/bottom-tabs": "^6.5.11",
    "@react-navigation/native": "^6.1.9",
    "@react-navigation/native-stack": "^6.9.17",
    "@react-navigation/stack": "^6.3.20",
    "apisauce": "^3.0.1",
    "core-js": "^3.35.1",
    "expo": "^51.0.8",
    "expo-build-properties": "~0.12.1",
    "expo-constants": "~16.0.2",
    "expo-dev-client": "~4.0.15",
    "expo-font": "~12.0.6",
    "expo-modules-core": "^1.12.12",
    "expo-secure-store": "~13.0.1",
    "expo-splash-screen": "^0.20.5",
    "expo-status-bar": "~1.12.1",
    "firebase": "^10.7.1",
    "formik": "^2.4.5",
    "hermes-engine": "^0.11.0",
    "jwt-decode": "^4.0.0",
    "postinstall": "^0.10.3",
    "react": "18.2.0",
    "react-inspector": "^6.0.2",
    "react-native": "^0.74.2",
    "react-native-device-info": "^10.12.0",
    "react-native-gesture-handler": "^2.16.2",
    "react-native-google-mobile-ads": "^13.3.0",
    "react-native-reanimated": "^3.12.0",
    "react-native-safe-area-context": "^4.10.4",
    "react-native-screens": "^3.31.1",
    "react-native-svg": "^15.3.0",
    "yup": "^1.3.3"
  },
  "devDependencies": {
    "@babel/core": "^7.24.0",
    "react-native-dotenv": "^3.4.11"
  },
  "private": true
}

Вы уверены, что нет ошибок Javascript в чем-то, что включается только в определенных средах? По моему опыту работы с RN, это была наиболее распространенная проблема с сбоем приложения (например, попробуйте получить доступ к свойству объекта, который undefined при запуске в симуляторе).

pasine 27.06.2024 10:31

Возможно, произошла ошибка (или ошибки). Однако я не знаю, как определить, какая часть кода JavaScript может вызывать ошибку, если это происходит. Я знаю, что могу начать с нуля и добавлять по одной строке кода за раз, но думаю, что в отчете о сбое может быть подсказка, которая может сузить проблему. На самом деле я начал проект с нуля, чтобы попробовать добавлять по одной строке за раз, но, к сожалению, этот проект тоже потерпел крах при запуске.

Jaylen J 27.06.2024 23:32

Действительно сложно отлаживать, не видя кода. Я бы попытался запустить новое RN-приложение «hello world», чтобы понять, в чем проблема: в коде или в среде. Затем я бы попытался добавить те же зависимости в приложение «Привет, мир», чтобы увидеть, не связана ли проблема с одной из зависимостей.

pasine 28.06.2024 11:49

В качестве альтернативы я бы попробовал установить Sentry с очень мощной системой отчетов о сбоях, способной выявить проблему даже на уровне Javascript.

pasine 28.06.2024 11:51

Спасибо! Однако возникает настоящий вопрос: как я могу эффективно показать больше кода? Приложение состоит из множества файлов. Кроме того, это интересно. Я не слышал о Сентри. Я посмотрю на это.

Jaylen J 02.07.2024 23:28

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

pasine 03.07.2024 10:40

Еще раз спасибо за помощь @pasine! Мне удалось подключить Sentry к новому приложению RN «Hello World». Sentry не совсем помог мне ответить на этот конкретный вопрос, однако теперь я знаю, насколько полезен Sentry, и могу использовать его в своем полном приложении!

Jaylen J 07.07.2024 20:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, мне нужно было использовать

Предварительная сборка npx expo --clean

чтобы очистить информацию, связанную с предыдущими сборками, которые я создал. Я также удалил все предыдущие zip-файлы и сборки из корневого каталога моего приложения. После этого я мог бы использовать

eas build --profile dev-sim --platform ios --local

и сборка заработала!

Это фрагмент из моего полного отчета о сбое Apple. Показываем это для большего контекста:

Last Exception Backtrace:
0   CoreFoundation  … __exceptionPreprocess + 226
1   libobjc.A.dylib … objc_exception_throw + 48
2   CoreFoundation  … -[NSException initWithCoder:] + 0
3   LlllOoo         … -[RCTAppDelegate bundleURL] + 52
4   LlllOoo         … -[EXAppDelegateWrapper createRCTRootViewFactory] + 65
5   LlllOoo         … -[RCTAppDelegate application:didFinishLaunchingWithOptions:] + 223
6   LlllOoo         … -[EXAppDelegateWrapper application:didFinishLaunchingWithOptions:] + 112
7   LlllOoo         … -[AppDelegate application:didFinishLaunchingWithOptions:] + 176
8   UIKitCore       … -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 297
…

Я узнал, что RCTAppDelegate (который, как мне кажется, означает React App Delegate) вызывает появление NSException (или NeXTSTEP Exception). Мне было интересно, почему RCTAppDelegate вызывает исключение. После нескольких часов поиска и изучения RN, отчетов о сбоях Apple и т. д. я подумал про себя: возможно, BundleURL неправильный или отсутствует, что приводит к исключению синтаксиса или языка. Я думаю, что RCTAppDelegate пытался найти правильный BundleURL, но запутался, когда обнаружил несколько BundleURL в корневом каталоге.

В Google Ads произошла еще одна ошибка, о которой я не осознавал, пока не протестировал новое приложение, созданное с нуля. В дополнение к этому

"expo": {
...
},
 "react-native-google-mobile-ads":{
     "android_app_id": "ca-app-pub-456456...",
     "ios_app_id": "ca-app-pub-789789..."
 }
}

в нижней части моего app.json мне также нужен идентификатор приложения Google Mobile Ads в моем ключе iOS выше, вот так

"expo":{    
 ...
 "ios":{
   ...
   "config":{
    "googleMobileAdsAppId": "ca-app-pub-1231231213..."
   }
 },
 ...
 }
...

Другие вопросы по теме