React Native iOS端WebSocket连刷卡设备遇1006及OSStatus -9807错误
问题分析与解决方案
错误码OSStatus error -9807对应SSL证书域名不匹配或证书未被iOS信任,结合Postman能正常连接的情况,核心原因是iOS的ATS(App Transport Security)策略严格验证SSL证书,而Postman默认跳过了部分证书校验。以下是具体解决步骤:
1. 确认证书域名匹配
你使用的是IP地址wss://192.168.1.2:8443,但刷卡设备的SSL证书中绑定的域名可能是其他值(比如localhost或自定义域名),导致iOS验证域名不匹配触发错误。
- 解决:要么重新生成包含该IP的SSL证书,要么在iOS端配置ATS例外允许该IP的证书校验。
2. 配置iOS ATS例外
修改项目的ios/[你的项目名]/Info.plist文件,添加针对目标IP的ATS例外规则:
<key>NSAppTransportSecurity</key> <dict> <!-- 允许本地网络访问(局域网IP需要) --> <key>NSAllowsLocalNetworking</key> <true/> <key>NSExceptionDomains</key> <dict> <key>192.168.1.2</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSExceptionAllowsArbitraryLoads</key> <true/> </dict> </dict> </dict>
- 注意:全局开启
NSAllowsArbitraryLoads(设为YES)虽然能快速解决问题,但不符合App Store审核规范,建议仅针对特定IP配置例外。
3. 手动信任自签名证书(如果是自签证书)
如果刷卡设备使用的是自签名SSL证书,需要将证书安装到iPad并手动信任:
- 将证书文件发送到iPad(比如通过邮件),打开后按照提示安装到设备的「设置-通用-VPN与设备管理」中。
- 安装完成后,进入「设置-通用-关于本机-证书信任设置」,开启该证书的信任开关。
4. 代码层面的小调整
确保WebSocket实例的生命周期管理正确,避免重复创建连接。另外,可以在onerror中打印更详细的错误信息:
const ws = new WebSocket('wss://192.168.1.2:8443'); ws.onopen = () => { console.log("Connection Established") ws.send('Initiate Payment'); }; ws.onmessage = e => { console.log(e.data) } ws.onerror = e => { // 打印完整错误对象 console.error('WebSocket Error:', JSON.stringify(e)); } ws.onclose = e => { console.log('Connection Closed:', e.code, e.reason); }
内容的提问来源于stack exchange,提问作者Carl Johnson
相关产品推荐
相关产品推荐

