You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React Native 0.74 Android物理设备(USB调试)强制使用HTTPS连接Metro开发服务器的问题求助

React Native 0.74 Android物理设备(USB调试)强制使用HTTPS连接Metro开发服务器的问题求助

我现在在开发一个基于React Native 0.74.1的App,因为第三方SDK要求Metro必须走HTTPS而不是HTTP。我更倾向于用USB调试而不是Wi-Fi,目前的环境和基础配置如下:

  • 物理设备:三星Galaxy A22 5G(Android)
  • 开发机器:macOS
  • 证书生成:用mkcert生成了包含SAN(localhost、127.0.0.1、::1、我的局域网IP)的证书
  • 安卓设备:已经把mkcert的根CA安装为系统CA证书
  • 网络安全配置:添加了debug版的network_security_config.xml,配置允许<certificates src="user"/>

本地已经验证Metro的HTTPS服务是正常的:

  • curl -vk https://localhost:8081/status 能正常返回结果
  • curl -v http://localhost:8081/status 连接失败(符合预期,因为Metro只开启了HTTPS)

我已经尝试过的方案

  1. 配置Metro启用HTTPS
    metro.config.js中添加HTTPS相关配置:

    const fs = require('fs');
    
    module.exports = {
      // 其他原有配置...
      server: {
        secureServerOptions: {
          key: fs.readFileSync('./certs/key.pem'),
          cert: fs.readFileSync('./certs/cert.pem'),
        },
      },
    };
    

    启动Metro时使用以下命令:

    npx react-native start --https --port 8081 \
    --key ./certs/key.pem --cert ./certs/cert.pem --reset-cache
    
  2. USB调试 + adb反向代理
    执行端口反向代理命令:

    adb reverse tcp:8081 tcp:8081
    

    然后在设备的Dev Menu中设置「Debug server host & port for device」为localhost:8081
    我也试过换成其他端口(比如localhost:9091),但问题依旧。另外如果我在Dev Menu里输入https://localhost:8081,地址会被自动拼写成http://https://localhost:8081,完全不符合预期。

  3. Wi-Fi调试方案
    在设备的Dev Menu中设置「Debug server host & port for device」为我的局域网IP:8081,这个方案能正常工作,但这不是我想要的USB调试方式。

  4. 通过SharedPreferences强制覆盖配置
    尝试将以下XML内容推送到设备的shared_prefs/ReactNativeDevPrefs.xmlcom.facebook.react.packager_preferences.xml文件中:

    <map>
      <string name="debug_http_host">localhost:8081</string>
      <boolean name="dev_server_https" value="true" />
    </map>
    

    同时也在MainApplication.ktonCreate方法中添加了代码,确保App启动时自动写入这些SharedPreferences配置。

  5. 确认证书和CA安装有效性
    反复验证了安卓设备上已经正确安装mkcert的根CA,且生成的服务端证书包含了所有需要的SAN字段(局域网IP、localhost等)。


当前遇到的核心问题

不管我尝试以上哪一种方案,App始终会尝试用HTTP连接Metro服务器。在红色错误页面上显示的连接URL是:

URL: http://localhost:8081/index.bundle?platform=android...

而不是我期望的HTTPS地址:

URL: https://localhost:8081/index.bundle?platform=android...

即使已经通过SharedPreferences明确设置了dev_server_https=true,React Native 0.74似乎还是会强制回退到HTTP协议。


我想请教的问题

  1. 怎么才能强制React Native 0.74使用HTTPS连接开发服务器?
  2. 有没有可靠的方法确保Metro只监听HTTPS,完全禁用HTTP fallback?
  3. React Native 0.74在HTTPS开发服务器的支持上有没有已知的限制?

如果有可用的配置示例(优先USB调试的方案),那对我来说帮助会非常大,感谢各位!

内容来源于stack exchange

火山引擎 最新活动