You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:48:22