reactnativecn / react-native-website

React Native 中文网
https://reactnative.cn
MIT License
219 stars 328 forks source link

ios设备在更新17.6.1后闪退 #870

Open gongml123 opened 2 months ago

gongml123 commented 2 months ago

在iOS更新了最新系统17.6.1后,点击路由跳转应用就会闪退安卓与之前的版本不会。 我的版本 "@react-navigation/native": "^6.1.18", "@react -navigation/native-stack": "^6.11.0", "@react-navigation/stack": "^6.0.11", "react": "17.0.2", "react-native": "0.67. 2》, 跳转方式 import { createRef } from 'react'; const navigationRef:any = createRef();

navigationRef?.current?.resetRoot({ index: 0, routes: [{ name: 'Root' }] }); navigationRef?.current?.navigate这些方式都会闪退

sunnylqm commented 2 months ago

参考下 https://github.com/react-navigation/react-navigation/issues/11549

gongml123 commented 2 months ago

参考下 react-navigation/react-navigation#11549

我也是使用的xcode 15,但是只是在ios最新17.6版本上会闪退。17.5就不会

ry-krystal commented 2 months ago

这可能是由于 iOS 系统更新导致 React Navigation 相关的 API 和行为出现不兼容问题。你的 React Native 和 React Navigation 版本较老,可能存在一些在新系统中无法适配的情况。

问题排查与解决步骤:

  1. 更新 React Navigation 和 React Native 你的 React Native 版本是 0.67.2,而最新的 React Native 已经是 0.7x.x。iOS 17 系统可能在底层行为上与这些旧版本的库不兼容。 解决方案: 尝试升级 react-native 和 react-navigation 到较新的版本。可以先升级到最新的 React Native 版本,并同步更新 React Navigation 依赖。 执行以下命令更新 React Navigation 相关的库: yarn add @react-navigation/native@latest yarn add @react-navigation/native-stack@latest yarn add @react-navigation/stack@latest yarn add react-native-screens react-native-safe-area-context 然后升级 React Native,查看官方迁移指南并按照步骤进行版本升级: npx react-native upgrade

  2. 检查 navigationRef 的使用 你提到使用 navigationRef 的 resetRoot 和 navigate 会导致闪退。问题可能与 navigationRef 的实例化或使用方式有关。 建议修正的写法: 确保 navigationRef 在应用初始化时被正确传递给 NavigationContainer。 resetRoot 和 navigate 都是在 navigationRef 的 current 不为 null 的情况下调用。 示例: import { createNavigationContainerRef } from '@react-navigation/native'; const navigationRef = createNavigationContainerRef();

// 跳转之前检查 navigationRef 是否已初始化 if (navigationRef.isReady()) { navigationRef.resetRoot({ index: 0, routes: [{ name: 'Root' }], });

navigationRef.navigate('SomeScreen'); } 注意:确保在 NavigationContainer 中传递了 navigationRef:

{/* App navigators */}
  1. 检查 resetRoot 使用 在较新的版本中,resetRoot 方法可以用来重置导航栈。要确保该方法的使用符合 React Navigation 的版本文档,特别是当你使用多个堆栈或复杂的嵌套路由时。 建议: 确保 resetRoot 的 routes 数组结构正确,且目标路由的名称正确。 如果跳转目标的 name 不存在或路由栈定义错误,可能会导致闪退。 检查一下是否有路由定义如下:

  2. 检查崩溃日志 对于 iOS 闪退,查看 Xcode 的崩溃日志可以帮助确定问题的根源。 打开 Xcode,连接你的设备。 在 Xcode 的 “Devices and Simulators” 中,找到你的设备。 点击应用,然后查看崩溃日志,看看是否有具体的错误信息提示。

  3. 更新 iOS Pod 依赖 在升级 React Native 和 React Navigation 之后,确保你的 iOS 依赖项已更新。可以通过以下命令更新 iOS 相关依赖: cd ios pod install --repo-update

  4. 排查特定 iOS 版本的兼容性 如果升级库后问题依然存在,可能是 iOS 17.6.1 和 React Native 或 React Navigation 存在特定兼容性问题。可以尝试检查是否有关于 iOS 17 相关问题的已知问题和修复。 检查 React Native 和 React Navigation 的 GitHub Issue 页面,是否有类似的问题报告。 如果问题没有立即解决,可以考虑降级到 iOS 17 之前的版本以继续开发,等待官方修复。