1.问题描述:
退出登录之后需要手动清空页面栈和 storage 吗?
解决方案:
当点击退出登录或 Token 过期跳转至登录页时都需要显式清空路由栈,HarmonyOS 路由栈(通过 NavDestination 组件管理)默认不会自动清空历史页面,即使调用 logout 接口跳转到登录页,原栈中的页面实例(如多个首页)依然存在。不清空路由栈,可能会导致以下问题:
内存泄漏:未销毁的页面可能持续占用资源。
接口重复调用:若栈中存在多个首页实例,每个实例的 aboutToAppear 生命周期都可能触发接口请求,导致多次调用(如用户遇到的首页接口请求数十次的问题)。除了路由栈,和用户信息相关的 storage 也需要进行清除,建议储存的时候就根据用户分类,并做区分。"
2.问题描述:
服务端暂未开发,用户点击华为账号一键登录后,客户端 APP 如何通过 ArkTS 直接获取华为账号绑定的手机号?
解决方案:
如果服务器暂未开发,可临时在客户端 APP 内通过 rcp 模块向华为账号服务器发送请求,获取手机号。示例代码如下:
/*** 通过rcp向华为账号服务器发送请求,获取华为账号绑定的手机号* @param authCode 授权码,用户点击华为账号一键登录后返回授权码* @returns*/async getPhoneNumberFromHWAccountServer(authCode: string): Promise<hwphoneinfo> {let hwPhoneInfo = new HWPhoneInfo();// 在创建应用后,由华为开发者联盟为应用分配的唯一标识const clientId = '123456789';// 在创建应用后,由华为开发者联盟为应用分配的密钥(Client Secret)const clientSecret = 'abcdefghijk';const url = 'https://account-api.cloud.huawei.com/oauth2/v6/quickLogin/getPhoneNumber';const headers: rcp.RequestHeaders = {""Content-Type"": ""application/json;charset=UTF-8""}// 为了更安全的网络访问,请务必升级到TLS1.2版本。若使用协议是TLS1.0、TLS1.1或规定外的加密套件,可能无法正常访问华为账号服务。const securityConfig: rcp.SecurityConfiguration = {tlsOptions: {tlsVersion: 'TlsV1.2'}};let session: rcp.Session | undefined = undefined;try {const request = new rcp.Request(url, 'POST');request.headers = headers;request.content = { ""code"": authCode, ""clientId"": clientId, ""clientSecret"": clientSecret };session = rcp.createSession({ requestConfiguration: { security: securityConfig } });let rsp = await session.fetch(request);hilog.info(this.domainId, this.logTag, `rsp : ${rsp.statusCode}, ${rsp.toString()}`);const body: ArrayBuffer | undefined = rsp.body;if (!body) {hilog.warn(this.domainId, this.logTag, `rsp.body is undefined, return`);return hwPhoneInfo;}const textDecoder = util.TextDecoder.create('utf-8');const bodyStr = textDecoder.decodeToString(new Uint8Array(body));hwPhoneInfo = JSON.parse(bodyStr) as HWPhoneInfo;hilog.info(this.domainId, this.logTag, `hwPhoneInfo: ${JSON.stringify(hwPhoneInfo)}`);} catch (error) {hilog.error(this.domainId, this.logTag, `getPhoneNumberFromHWAccountServer err : ${JSON.stringify(error)}`);} finally {if (session) {session.close();}}return hwPhoneInfo;}
class HWPhoneInfo {openId: string = '';unionId: string = '';phoneNumber: string = '';phoneNumberValid: string = '';purePhoneNumber: string = '';phoneCountryCode: string = '';}
复制代码
3.问题描述:
华为账号一键登录的场景下,获取匿名手机号和获取手机号有什么区别?
解决方案:
1、获取匿名手机号
在用户首次登录应用时,应用 scope 传 quickLoginAnonymousPhone 调用AuthorizationWithHuaweiIDRequest授权请求获取匿名手机号,不展示手机号明文。
获取匿名手机号是华为账号登录客户端的行为。
待用户同意协议后,点击华为账号一键登录按钮,应用可以通过 HuaweiIDCredential 获取到 Authorization Code 等数据。
2、获取手机号
在应用获取手机号之前,需要完成“华为账号一键登录”或者“获取您的手机号”的scope权限申请
将获取的 Authorization Code 数据传给应用服务端,应用服务端通过 Authorization Code 调用/oauth2/v6/quickLogin/getPhoneNumber接口(通过 phone scope 权限)获取用户完整手机号和 UnionID、OpenID。
获取手机号是服务端开发过程中,三方服务器和华为账号服务器的交互过程的行为,前提是用户已授权。
之后应用通过关联用户手机号(用户选择的华为账号绑定的手机号或者新增的手机号,而非当前 SIM 卡所对应运营商手机号)和 UnionID、OpenID 完成用户登录。
如果已经申请了一键登录手机号权限,对用户选择的华为账号绑定的手机号或者新增的手机号,(而非当前 SIM 卡所对应运营商手机号)进行验证,不保证是实时的验证,仅首次需要用户授权。但是 Account Kit 调用系统能力将获取华为账号登录设备上的 SIM 卡手机号码,与华为账号绑定的手机号进行校验(有网络即可,无需使用 SIM 卡移动数据)。 用户点击一键登录按钮后,结合华为账号使用过程中账号所绑定的手机号短信验证记录,90 天内有验证通过的记录,则返回该华为账号绑定的手机号;若 90 天内没有验证通过的记录,则触发 Account Kit 默认提供的短信验证流程(Account Kit 提供的验证页,暂不可自定义),确保返回的手机号经过验证。
评论