React Native WebSocket调试模式正常但打包APK后无法工作求助
解决React Native打包APK后WebSocket失效的问题
1. 确认WebSocket服务端URL与证书配置
- Android 9及以上版本的生产APK默认拦截HTTP请求,调试模式下的
ws://协议在打包后会失效,必须切换为wss://(HTTPS)协议。 - 若使用自签名HTTPS证书,调试时DevSettings的"Allow Insecure HTTP"会跳过证书验证,但打包后需配置网络安全策略信任该证书:
在android/app/src/main/res/xml/network_security_config.xml中添加:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">你的WebSocket服务域名</domain> <trust-anchors> <certificates src="@raw/你的自签名证书文件名"/> </trust-anchors> </domain-config> </network-security-config>AndroidManifest.xml的<application>标签中添加android:networkSecurityConfig="@xml/network_security_config",并将证书文件放入android/app/src/main/res/raw目录。
2. 检查ProGuard混淆规则
打包APK时开启混淆可能破坏WebSocket相关代码,在android/app/proguard-rules.pro中添加保留规则:
# 保留OkHttp相关类(React Native默认依赖OkHttp处理网络) -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; } # 保留React Native WebSocket模块 -keep class com.facebook.react.modules.websocket.** { *; } -keep class okio.** { *; }
3. 验证生产环境URL是否正确
调试时可能使用测试环境地址,打包前需确认代码中生产环境的WebSocket URL是否正确:
const WS_URL = __DEV__ ? 'ws://localhost:8080' : 'wss://prod.yourdomain.com/ws';
检查生产URL是否存在拼写错误、端口不匹配或域名无法访问的情况。
4. 确认Android权限配置
确保AndroidManifest.xml中添加了必要的网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
5. 抓取日志定位具体错误
用Android Studio的Logcat打包后的APK日志,过滤WebSocket相关关键词(如WebSocket、OkHttp、SSL),查看是否有连接错误码、证书验证失败或网络拦截的提示,这些日志能精准定位问题根源。
内容的提问来源于stack exchange,提问作者Irtiza Atiq
相关产品推荐
相关产品推荐

