booboom
booboom
  • 发布:2026-02-19 16:18
  • 更新:2026-02-19 16:18
  • 阅读:36

【报Bug】在IOS中一键登录uniCloud.getPhoneNumber函数报错

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 15.7.3

HBuilderX类型: 正式

HBuilderX版本号: 4.87

手机系统: iOS

手机系统版本号: iOS 18

手机厂商: 苹果

手机机型: iphone13 pro

页面类型: vue

vue版本: vue3

打包方式: 云端

项目创建方式: HBuilderX

示例代码:
{  
    "name": "uni-phone-number-get",  
    "dependencies": {},  
    "extensions": {  
        "uni-cloud-jql": {},  
        "uni-cloud-verify": {}  
    }  
}
'use strict'  
exports.main = async (event, context) => {  
    // 检查必要参数  
    if (!event.access_token || !event.openid) {  
        console.error('缺少参数:', {  
            access_token: !!event.access_token,  
            openid: !!event.openid  
        })  
        return {  
            code: -1,  
            message: '缺少必要参数: access_token 或 openid',  
            errCode: 'MISSING_PARAMS'  
        }  
    }  

    try {  
        console.log('开始调用 uniCloud.getPhoneNumber', event.access_token, event.openid)  
        const res = await uniCloud.getPhoneNumber({  
            appid: '__UNI__11111', // (这里用的应用的appid)  
            provider: 'univerify',  
            access_token: event.access_token,  
            openid: event.openid  
        })  
        console.log('getPhoneNumber响应:', JSON.stringify(res)) // res里包含手机号  
        // 执行用户信息入库等操作,正常情况下不要把完整手机号返回给前端  
        // 如果数据库在uniCloud上,可以直接入库  
        // 如果数据库不在uniCloud上,可以通过 uniCloud.httpclient  
        // API, 将手机号通过http方式传递给其他服务器的接口, 详见: https: //doc.dcloud.net.cn/uniCloud/cf-functions?id=httpclient  
        return {  
            ...res,  
            message: res.code === 0 ? '获取手机号成功' : '获取手机号失败'  
        }  
    } catch (error) {  
        console.error('云函数获取手机号详细错误:', {  
            name: error.name,  
            message: error.message,  
            stack: error.stack,  
            code: error.code,  
            errCode: error.errCode  
        })  
        return {  
            code: -1,  
            message: '云函数执行失败: ' + error.message,  
            errCode: 'CLOUD_FUNCTION_ERROR',  
            details: {  
                name: error.name,  
                code: error.code,  
                stack: error.stack  
            }  
        }  
    }  
}

操作步骤:

1.执行一键登录成功获取手机号 2.点击一键登录按钮报错

预期结果:

登录成功

实际结果:

登录失败uniCloud.getPhoneNumber报错

bug描述:

uniCloud.getPhoneNumber在ios真机上报错,安卓上正常,找了个推反馈那边服务没有报错显示登录正常。
access_token/openid获取成功并确认已传入uniCloud.getPhoneNumber方法中。

{"code":-1,"message":"云函数执行失败: 获取手机号失败,请稍后重试。","errCode":"CLOUD_FUNCTION_ERROR","details":{"name":"Error","code":5000,"stack":"Error: 获取手机号失败,请稍后重试。\n at fA (/Applications/HBuilderX.app/Contents/HBuilderX/plugins/unicloud/internal-functions/common/uni-cloud-verify/index.js:1:758211)\n at Object.gA [as univerify] (/Applications/HBuilderX.app/Contents/HBuilderX/plugins/unicloud/internal-functions/common/uni-cloud-verify/index.js:1:759616)\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async Ls.AA [as getPhoneNumber] (/Applications/HBuilderX.app/Contents/HBuilderX/plugins/unicloud/internal-functions/common/uni-cloud-verify/index.js:1:759788)\n at async global.__tempModuleExports.exports.main (/Users/boom/Documents/yct/shop-app/uniCloud-aliyun/cloudfunctions/uni-phone-number-get/index.js:18:21)\n at async Ee (/Applications/HBuilderX.app/Contents/HBuilderX/plugins/unicloud/aliyun/serve.js:1:15540)\n at async _e (/Applications/HBuilderX.app/Contents/HBuilderX/plugins/unicloud/aliyun/serve.js:1:15853)\n at async userAgent (/Applications/HBuilderX.app/Contents/HBuilderX/plugins/unicloud/aliyun/serve.js:1:18240)\n at async global.__tempModuleExports.module.exports (/Applications/HBuilderX.app/Contents/HBuilderX/plugins/unicloud/aliyun/serve.js:1:17361)\n at async VmWorker.exec (/Applications/HBuilderX.app/Contents/HBuilderX/plugins/unicloud/server/utils/vm.js:1:3296)"}}

2026-02-19 16:18 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uniCloud 官方技术交流群 ) 咨询,群中有相关专业的管理员和群友。

作为 DCloud 官方人员,对该 bug 反馈进行评审如下:

  1. 反馈完整性评估

    • 标题、描述、代码、复现步骤、预期/实际结果、环境信息都已提供,基本完整。
    • 代码可直接运行,但缺少云函数 package.json 中是否关联 uni-cloud-verify 扩展库的说明,需补充。
    • 复现步骤较简略,仅写“执行一键登录→点击按钮报错”,未给出客户端一键登录(uni.login)的调用代码及返回结果,官方人员无法 100 % 复现,需补充客户端完整调用链。
    • 已确认 access_token / openid 已拿到,排除了最常见的参数缺失问题,描述清晰。
  2. bug 是否成立
    根据知识库:

    • 自 HBuilderX 3.4.0 起,云函数必须显式在 package.json 中启用扩展库 "uni-cloud-verify",否则 uniCloud.getPhoneNumber 会调用失败。
    • 报错堆栈中路径 /uni-cloud-verify/index.js 证明已走到扩展库内部,但返回 5000 “获取手机号失败” 多为苹果侧网关超时或 token 失效。
    • 对话知识库中已有同类线上案例:iOS 18 真机偶发超时,官方建议把云函数单实例并发度调回 1,并在云函数前后打日志确认耗时。
      因此 bug 成立,属于“iOS 18 特定环境下偶发超时 + 扩展库配置需再次确认”的组合问题,而非代码逻辑错误。
  3. 需补充/纠正的关键信息

    • 请补充云函数根目录的 package.json,确认已包含
      {  
      "name": "uni-phone-number-get",  
      "extensions": {  
      "uni-cloud-verify": {}  
      }  
      }

      并重新上传云函数。

    • 请补充客户端一键登录完整代码(uni.login 调用及 success 回调里取 access_token、openid 的片段)。
    • 请在云函数里按官方示例加日志:
      const start = Date.now()  
      try {  
      const res = await uniCloud.getPhoneNumber({...})  
      console.log('succ', res, '耗时', Date.now() - start, 'ms')  
      } catch (e) {  
      console.log('fail', e, '耗时', Date.now() - start, 'ms')  
      }

      上传后复现一次,把云后台日志(含 requestId)贴出来,方便官方进一步排查。

    • 若仍超时,可临时把云函数“单实例并发度”设为 1(阿里云控制台-函数配置-基础配置里修改),观察是否恢复。
  4. 结论
    该反馈有效,但需用户按上述三点补充信息后才能定位根因并给出最终修复方案。

内容为 AI 生成,仅供参考

要回复问题请先登录注册