React Native+Expo Dev Client+Realm iPhone真机登录异常
问题根因
两个报错同源:真机运行时Realm的JS桥接/JSI绑定未正确初始化,RPC调用传参格式不符合原生层预期。
- 匿名登录返回
[json.exception.type_error.302] type must be array, but is object,是因为_anonymousRPC方法传入{ arguments: undefined },原生层要求arguments字段必须为数组,绑定失效时JS层未做参数兜底转换,undefined被序列化后传入原生层被识别为对象类型,触发类型错误。 - 邮箱密码登录后续返回
TypeError: app.currentUser.mongoClient is not a function,是因为前置RPC调用失败导致登录流程中断,currentUser为未初始化的空对象,没有挂载对应方法。
iOS模拟器运行正常是因为模拟器会复用Metro缓存的JS bundle和预构建原生模拟层代码,真机安装的dev client如果构建版本和当前JS侧依赖的Realm版本不匹配,就会出现绑定错位问题。
排查与修复步骤
- 校验依赖版本匹配性
彻底终止Metro服务,删除项目根目录下.expo、node_modules/.cache缓存文件夹,执行npx expo install realm安装和当前Expo SDK版本严格匹配的Realm版本。Expo对Realm有严格的版本绑定,手动通过npm/yarn安装的版本号不匹配时,必然出现原生绑定异常。 - 重新构建真机端dev client
卸载真机上已安装的旧版dev client,不要复用旧安装包。如果用EAS构建,执行eas build --profile development --platform ios重新打签名开发包安装;如果是本地Xcode联调,先执行npx expo prebuild --clean清除所有原生模板缓存,再构建安装到真机。注意:Realm的JSI绑定不支持远程JS调试模式,真机首次启动新客户端时先关闭远程调试,否则必然触发参数序列化错误 - RPC参数临时兼容修复
如果重新构建后匿名登录仍报错,可手动修改node_modules/realm/dist/rpc.js中_anonymousRPC方法的传参,和其他登录方法保持一致,传入空数组替代undefined:
修改完成后用export function _anonymousRPC() { const result = sendRequest("_anonymous", { arguments: [] }); return deserialize(undefined, result); }patch-package生成依赖补丁,避免后续安装依赖覆盖修改。 - 登录逻辑增加兜底判断
所有调用app.currentUser.mongoClient的逻辑前增加类型校验,登录状态异常时先触发重登逻辑,避免直接抛出未捕获的Promise错误:if (!app.currentUser || typeof app.currentUser.mongoClient !== 'function') { // 执行重登逻辑 return }
内容的提问来源于stack exchange,提问作者Jacob Olson
相关产品推荐
相关产品推荐

