javascript - 如何使用 EAS BUILD 解决 IOS 应用启动时崩溃的问题

标签 javascript ios react-native expo ipa

背景

我一直在使用 Expo 管理工作流程使用 React-Native 开发一个应用程序。使用 expo start 进行本地开发时,该应用程序运行良好。在本地工作时,我在日志中没有看到任何错误。

问题

运行并配置 Eas Build 后,我发现我的构建成功了(全面勾选标记)。但是,当我在 IOS 模拟器上查看 .IPA 或通过“Transporter”将其发送到 Apple 帐户以便在 TestFlight 中使用时;应用程序在加载时崩溃。我只看到启动画面,然后崩溃。

崩溃日志(片段)

我检查了 IOS 设备上的日志,发现崩溃原因如下。

Thread 1 name:   Dispatch queue: com.facebook.react.ExceptionsManagerQueue
Thread 1 Crashed:
0   libsystem_kernel.dylib                 0x1de9f7160 __pthread_kill + 8
1   libsystem_pthread.dylib                0x1ef1141ac pthread_kill + 268
2   libsystem_c.dylib                      0x1a86fcc8c abort + 180
3   libc++abi.dylib                        0x1ef053b8c abort_message + 132
4   libc++abi.dylib                        0x1ef043a80 demangling_terminate_handler() + 336
5   libobjc.A.dylib                        0x19a355d3c _objc_terminate() + 144
6   libc++abi.dylib                        0x1ef052f28 std::__terminate(void (*)()) + 20
7   libc++abi.dylib                        0x1ef052ec4 std::terminate() + 56
8   libdispatch.dylib                      0x1a8698ff0 _dispatch_client_callout + 40
9   libdispatch.dylib                      0x1a86a0694 _dispatch_lane_serial_drain + 672
10  libdispatch.dylib                      0x1a86a11e0 _dispatch_lane_invoke + 384
11  libdispatch.dylib                      0x1a86abe10 _dispatch_workloop_worker_thread + 652
12  libsystem_pthread.dylib                0x1ef10ddf8 _pthread_wqthread + 288
13  libsystem_pthread.dylib                0x1ef10db98 start_wqthread + 8

一些谷歌搜索暗示我的堆栈导航器依赖项并未全部安装,这是事实。我已经安装了它们,但得到了相同的结果。我认为这要么是我的 app.json 的问题,要么是我的依赖项不匹配。

这是我的 package.json:

Package.json

{
  "name": "app name",
  "version": "1.0.0",
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web"
  },
  "dependencies": {
    "@react-native-async-storage/async-storage": "1.17.11",
    "@react-navigation/bottom-tabs": "6.5.7",
    "@react-navigation/native": "6.1.6",
    "@react-navigation/native-stack": "6.9.12",
    "@stripe/stripe-react-native": "0.23.3",
    "expo": "48.0.9",
    "expo-firebase": "0.0.0-alpha.0",
    "expo-status-bar": "1.4.4",
    "firebase": "9.18.0",
    "formik": "2.2.9",
    "lottie-react-native": "5.1.4",
    "openai": "3.2.1",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "react-native": "0.71.8",
    "react-native-dotenv": "3.4.8",
    "react-native-element-dropdown": "2.9.0",
    "react-native-gesture-handler": "2.12.0",
    "react-native-vector-icons": "9.2.0",
    "react-native-web": "0.18.11",
    "yup": "1.0.2",
    "react-native-screens": "3.20.0",
    "react-native-safe-area-context": "4.5.0"
  },
  "private": true,
  "devDependencies": {
    "@babel/core": "7.21.3"
  }
}

这是我的 app.json:

应用程序.json

{
  "expo": {
    "name": "name",
    "slug": "slug",
    "version": "1.0.1",
    "orientation": "portrait",
    "icon": "./assets/Icon.png",
    "userInterfaceStyle": "light",
    "splash": {
      "image": "./assets/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    },
    "assetBundlePatterns": [
      "**/*"
    ],
    "ios": {
      "infoPlist": {
        "NSCameraUsageDescription": "This app supports use of camera for scanning",
        "UIAppFonts": [
          "LucidaGrande.ttf",
          "LucidaGrandeBold.ttf",
          "Luminari.ttf"
        ]
      },
      "config": {
        "usesNonExemptEncryption": false
      },
      "supportsTablet": true,
      "bundleIdentifier": "id",
      "buildNumber": "10"
    },
    "android": {
      "adaptiveIcon": {
        "foregroundImage": "./assets/adaptive-icon.png",
        "backgroundColor": "#ffffff"
      },
      "package": "id"
    },
    "web": {
      "favicon": "./assets/favicon.png"
    },
    "extra": {
      "eas": {
        "projectId": "uid"
      }
    },
    "owner": "owner"
  }
}

问题

有人从我的场景和/或配置文件中看到可能导致崩溃的原因吗?我的下一个方法是系统地将每个依赖项安装到新的代码库中,并与每个依赖项一起发布以识别问题包。希望避免这种情况,因为这需要几天的时间。

最佳答案

看来我的上述问题是由多个问题造成的,因此我将概述每个问题,以防其他人将来遇到此问题。

问题 1

当使用@react-navigation/native时,你将需要多个包。我在阅读 documentation 时错过了这一点。您需要确保安装:

npx expo 安装 react native 屏幕 react native 安全区域上下文@react-native-community/masked-view react native 手势处理程序 react native 安全区域上下文 react -native-reanimated

I doubt you need all these packages but I ran out of time testing them all since each build took over 20 minutes.

确保按照文档在使用导航时导入手势

问题 2

我的环境变量设置不正确。我使用了库@react-native-dotenv,然后按照documentation 导入每个库。 。但是,expo 希望您通过 process.env 访问环境变量,该变量可以通过多种方式填充。供引用;只要您按照react-native-dotenv的文档导入环境变量,您仍然可以通过process.env访问它们,这将允许您的代码同时工作本地和建成时。

问题 3

Expo-Font 软件包尚未安装,但由于某种原因此功能仍然有效。请确保安装此依赖项,因为它在发布后将不起作用。

第 4 期

一些依赖项受到了expo的支持,并且仅在构建时成为问题。确保运行npm expo install --check。然后它将允许您安装正确的依赖项。

摘要

您可能会收到此错误,但不会出现上面列出的任何问题。这一切都归结于您的本地行为与构建环境不同和/或不匹配的依赖项。确保您的依赖项全部存在并正确使用,即使它确实适用于您的本地构建。

为了找到所有这些问题,我从一个新的博览会项目开始,并慢慢添加了每个功能。我希望你不必这样做,但如果你遇到困难,这对我有用。

关于javascript - 如何使用 EAS BUILD 解决 IOS 应用启动时崩溃的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76502514/

相关文章:

javascript - 有没有办法让 keydown 监听器即使在关注外部 iframe 时也能工作?

javascript - react native : filtering props?

ios - 使用自定义后退按钮后导航标题消失

javascript - 如何能够在函数 React Native 中使用其类之外的方法

react-native - 我一直收到 [RCTCxxBridge jsContextRef] 无法识别的选择器发送到实例 0x7f8af262f4f0' 是从 JS 线程抛出的

ios - iOS音量仅在播放时可调

javascript - 如何删除 Mongoose 中带有引用集合的集合?

javascript - 解释 Javascript 文件 Laravel 中的变量

iphone - IOS 5 核心数据,如何让 NSFetchedResultsController 返回匹配父一对多关系的结果?

ios - xcode - 大写标签输出