现在App注册登录流程越来越简化,手机号一键登录已经成为主流方案。相比传统短信验证码登录,一键登录的优势非常明显:用户无需手动输入手机号,无需等待短信接收,点击按钮即可完成验证。实测下来,这种方案能将注册转化率提升30%以上。
在uniapp中实现这个功能,主要依赖uniCloud提供的univerify服务。不过很多开发者在接入过程中会遇到各种坑,比如云空间配置不对、自定义基座无效、部分机型不兼容等问题。我自己在项目中就踩过不少坑,最惨的一次因为包名不一致的问题卡了整整三天。
首先需要登录uniCloud官网开通服务空间。这里有个关键点:免费版的服务空间是无法使用一键登录功能的,必须升级到付费套餐。建议选择按量付费,实测下来一个中小型App每月费用不会超过50元。
开通后需要特别注意服务空间的几个核心参数:
这些参数后面在代码中都会用到,建议先保存好。我习惯把这些参数放在项目的config.js文件中统一管理。
这是最容易出问题的地方!必须确保以下四个地方的包名完全一致:
我曾经因为manifest.json中的包名多了一个空格,导致功能完全无法使用。建议使用这个命令检查包名是否一致:
javascript复制console.log(plus.runtime.appid);
开发阶段如果每次都打正式包测试,效率太低。自定义基座可以让我们在开发时就能调试一键登录功能。但是这里有几个大坑需要注意:
首先,部分机型(特别是某些华为和小米机型)对自定义基座支持不好,可能会出现无法弹出登录框的情况。遇到这种情况不要慌,先试试以下解决方案:
正确的打包步骤应该是:
这里有个小技巧:打包前先运行一次普通基座,然后再打自定义基座,成功率会高很多。
在uniCloud/cloudfunctions目录下新建loginByUniverify云函数,index.js内容如下:
javascript复制'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
const res = await uniCloud.getPhoneNumber({
appid: '__UNI__xxxxxx', // 替换成你的DCloud AppID
provider: 'univerify',
apiKey: '你的APIKey',
apiSecret: '你的APISecret',
access_token: event.access_token,
openid: event.openid
});
// 将手机号存入数据库
return await db.collection('users').add({
openid: event.openid,
phone: res.phoneNumber,
registerTime: Date.now()
});
};
html复制<template>
<view>
<button @click="handleLogin">本机号码一键登录</button>
</view>
</template>
<script>
export default {
methods: {
async handleLogin() {
try {
// 预登录检查
await this.preLogin();
// 弹出登录窗口
const loginRes = await uni.login({
provider: 'univerify',
univerifyStyle: {
fullScreen: true,
authButton: {
title: '一键登录'
}
}
});
// 调用云函数
const callRes = await uniCloud.callFunction({
name: 'loginByUniverify',
data: {
access_token: loginRes.authResult.access_token,
openid: loginRes.authResult.openid
}
});
console.log('登录成功', callRes.result);
} catch (err) {
console.error('登录失败', err);
} finally {
uni.closeAuthView();
}
},
preLogin() {
return new Promise((resolve, reject) => {
uni.preLogin({
provider: 'univerify',
success: resolve,
fail: reject
});
});
}
}
}
</script>
如果遇到点击登录按钮没反应,可以按照以下步骤排查:
云函数调用失败最常见的原因是参数不对。建议在云函数中加入日志:
javascript复制console.log('入参:', event);
然后在uniCloud控制台的日志中查看具体错误信息。常见错误包括:
不同厂商手机对一键登录的支持程度不同。如果遇到特定机型问题,可以尝试:
在实际项目中,我发现以下几个优化点可以显著提升用户体验:
最后提醒一点:上线前一定要在各种真机上测试,特别是低端机型。我在Redmi Note系列上就遇到过不少奇怪的问题,后来发现是内存不足导致的。