ReactNative 修复启动白屏

Native端开发的小伙伴都知道,应用在启动时会有短暂的白屏现象,我们可以利用插件解决此问题,这里我们主要讲ReactNative在启动时,借助react-native-splash-screen修复这个问题的方法。

安装

# 在项目中安装插件
npm install react-native-splash-screen --save
   
cd ios && pod install

Android 配置

首先在 anroid/app/build.gradle 中添加下面的配置

dependencies {
     implementation project(':react-native-splash-screen') // import splash 
}

android/res/* 下面添加 layout 文件夹, 在里面添加 launch_screen.xml,其次在 android/res/* 下面添加 drawable 文件夹📂,这里存放你的启动页(注意📢,这里可以根据像素设置文件夹, 例如drawable-hdpi)会按照设备大小适配。 drawable/launch_screen.png

<!-- launch_screen.xml -->
 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/launch_screen" android:scaleType="centerCrop" />
</RelativeLayout>

上面的配置好以后, 在android/values文件夹📂下新建 colors.xmnl

<!-- colors.xml 这里用来设置配色 -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="primary_dark">#000000</color>
</resources>

修改 values/styles.xml

<!-- 设置背景透明 -->
<item name="android:windowIsTranslucent">true</item>

上面的配置文件修改好后, 我们来写java代码, 在项目 android/app/scr/main/res/*, 来修改

// MainActivity.java
import com.facebook.react.ReactActivity;
import org.devio.rn.splashscreen.SplashScreen;


@Override
protected void onCreate(Bundle savedInstanceState) {
// this add line
    SplashScreen.show(this);
    super.onCreate(savedInstanceState);
}

在这里插入图片描述

IOS 配置

#import "RNSplashScreen.h"

[RNSplashScreen show];

在这里插入图片描述

打开 Xcode, 进行下图的配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用

import SplashScreen from 'react-native-splash-screen';

setTimeout(() => {
  SplashScreen.hide();
}, 2500);
<think>我们正在处理一个React NativeExpo项目在iOS模拟器上运行出现黑屏的问题。根据经验,这类问题可能由多种原因导致,包括但不限于:JavaScript代码错误、原生模块兼容性问题、模拟器设置问题、ExpoSDK版本问题等。下面将逐步分析并提供解决方案。###1. **检查JavaScript代码错误**黑屏最常见的原因是JavaScript代码执行出错导致应用崩溃。请检查终端中是否有报错信息:-在项目根目录运行`exporun:ios`后,终端会显示构建日志和运行时日志。-如果存在JavaScript错误,终端会输出红色错误堆栈信息。**解决方法**:-根据错误信息修复代码。-如果错误信息不明确,可以尝试在`App.js`中简化代码,例如只显示一个文本组件,逐步排查。###2.**检查iOS模拟器日志**如果终端没有明显错误,可以查看模拟器的系统日志:-打开macOS的`控制台`应用,在设备列表中选择你的模拟器。-过滤日志,搜索你的应用包名(默认是`host.exp.Exponent`)或关键词`Expo`、`Error`。###3. **重置模拟器**模拟器可能出现临时状态错误:-在模拟器菜单栏选择`Device` ->`Erase AllContent andSettings...`。-重置后重新运行`exporun:ios`。 ###4. **更新Expo和相关依赖**版本不兼容可能导致黑屏:-确保使用的Expo SDK版本与依赖兼容。检查`package.json`中的`expo`版本和`react-native`版本。-运行以下命令更新:```bashexpo update```-或者手动更新到最新版本(注意版本兼容性):```bashnpminstall expo@latest```###5.**检查自定义原生模块**如果项目使用了自定义原生模块(通过`expo eject`暴露了原生代码),则可能是原生模块的问题:-确保所有原生模块都兼容当前的ExpoSDK版本。-检查`ios`目录下的原生代码,特别是`AppDelegate.m`文件。###6.**尝试使用Expo Go**如果使用`expo run:ios`构建自定义客户端,可以尝试改用Expo Go客户端:-在模拟器中安装Expo Go(通过App Store)。-运行`expostart`启动开发服务器。-在模拟器中打开ExpoGo,扫描终端显示的二维码或从开发服务器列表中选择项目。如果Expo Go可以正常运行,则问题可能出在自定义客户端的构建过程。###7.**重新安装node_modules**依赖包可能损坏:```bashrm-rfnode_modulesnpm install``` ###8. **清除Expo缓存**运行以下命令清除Expo缓存:```bashexpostart --clear```###9.**检查Xcode和模拟器版本**确保Xcode和模拟器是最新版本:-打开Xcode,选择`Checkfor Updates`。-确保模拟器版本与Xcode匹配。 ###10. **查看已知问题**查看ExpoGitHub仓库的Issue,搜索是否有类似问题报告。如果以上步骤仍无法解决,请提供更多信息,例如:-终端输出的完整日志-使用的ExpoSDK版本-是否使用了自定义原生模块§§相关问题§§1. ReactNative Expo项目在Android模拟器上运行出现白屏如何解决?2.如何调试React Native应用崩溃问题? 3. Expo项目中如何正确使用原生模块?</think>### React Native Expo `run:ios` iOS 模拟器黑屏问题解决方案 #### 1. **检查基础环境** - **Node.js与npm版本**: ```bash node -v # 推荐 v16~v20 npm -v # 推荐 v8+ ``` - **重置模拟器**: 在模拟器菜单选择 `Hardware → Erase All Content and Settings` 清除缓存。 #### 2. **关键修复步骤 **a. 升级依赖** ```bash expo upgrade # 更新Expo SDK rm -rf node_modules package-lock.json npm install ``` **b. 启用Hermes引擎** 在 `app.json` 中添加配置: ```json { "expo": { "ios": { "jsEngine": "hermes" } } } ``` **c. 清除构建缓存** ```bash expo start --clear # 同时删除iOS构建缓存: rm -rf ios/build ``` **d. 端口冲突解决** ```bash lsof -i :8081 # 检查Metro端口占用 kill -9 <PID> # 结束占用进程 ``` #### 3. **特定场景修复 - **自定义原生模块问题**: 若使用了类似`react-native-splash-screen`的模块,需在`AppDelegate.m`添加启动延迟: ```objective-c #import <React/RCTRootView.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // ...原有代码 [NSThread sleepForTimeInterval:1.0]; // 添加1秒延迟 return YES; } ``` [^2] - **Firebase冲突**: 在 `Podfile` 中添加: ```ruby target 'YourApp' do # ...其他配置 pod 'Firebase/Core', :modular_headers => true end ``` #### 4. **调试工具 - **查看设备日志**: ```bash expo logs ``` - **Xcode调试**: 打开 `ios/YourProject.xcworkspace`,通过Xcode直接运行可获取详细崩溃日志。 #### 5. **替代启动方案 使用Expo Go客户端测试: ```bash expo start ``` 在模拟器中用Expo Go扫描二维码运行,可快速验证是否为主工程问题。 > **原理说明**:黑屏通常由JS引擎初始化失败、原生模块冲突或资源加载超时引起。Hermes引擎可显著提升启动可靠性,而端口冲突则是Metro服务无法连接的热门原因[^1]。启动延迟给原生组件预留了初始化时间窗口[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执念1012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值