Я создал приложение для 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-приложение «hello world», чтобы понять, в чем проблема: в коде или в среде. Затем я бы попытался добавить те же зависимости в приложение «Привет, мир», чтобы увидеть, не связана ли проблема с одной из зависимостей.
В качестве альтернативы я бы попробовал установить Sentry с очень мощной системой отчетов о сбоях, способной выявить проблему даже на уровне Javascript.
Спасибо! Однако возникает настоящий вопрос: как я могу эффективно показать больше кода? Приложение состоит из множества файлов. Кроме того, это интересно. Я не слышал о Сентри. Я посмотрю на это.
Понятно, что не зная, где приложение дает сбой, вы не можете поделиться каким-либо кодом. Я бы посоветовал вам выполнить рекомендуемые действия по максимально возможной отладке приложения, пока не обнаружите проблему.
Еще раз спасибо за помощь @pasine! Мне удалось подключить Sentry к новому приложению RN «Hello World». Sentry не совсем помог мне ответить на этот конкретный вопрос, однако теперь я знаю, насколько полезен Sentry, и могу использовать его в своем полном приложении!
Оказывается, мне нужно было использовать
Предварительная сборка 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..."
}
},
...
}
...
Вы уверены, что нет ошибок Javascript в чем-то, что включается только в определенных средах? По моему опыту работы с RN, это была наиболее распространенная проблема с сбоем приложения (например, попробуйте получить доступ к свойству объекта, который
undefined
при запуске в симуляторе).