/** * 极光一键登录封装 * 功能:1. 判断登录态 2. 未登录则弹出极光一键登录界面 3. 登录成功后执行自定义回调 */ import { isProduction } from '@/common/config' import HttpRequest from '@/common/httpRequest' // 1. 引入极光插件 const jv = uni.requireNativePlugin('JG-JVerification'); // 2. 全局状态(避免重复初始化、保存协议勾选状态) const jvState = { isInit: false, // SDK 是否已初始化 }; const isIOS = uni.getSystemInfoSync().platform == "ios" /** * 初始化极光 SDK(仅初始化一次) */ function initJVerification() { return new Promise((resolve, reject) => { // 已初始化,直接返回成功 if (jvState.isInit) { resolve(true); return; } // 初始化 SDK jv.init({ timeout: 7000, isProduction: isProduction // 生产环境改为 true }, (result) => { if (result.code === 8000) { // 初始化成功(极光返回 code=0 为成功) jvState.isInit = true; console.log('极光 SDK 初始化成功'); resolve(true); } else { reject(new Error(result.content || '初始化失败')); } }); }); } /** * 配置极光一键登录自定义 UI */ function configJVerificationUI() { if (isIOS) { // iOS平台 jv.setCustomUIWithConfigiOS({ logoImg: 'static/invite.png', logoWidth: 200, logoHeight: 200, navColor: 0xffffff, navReturnImg: 'static/close-iOS.png', numberColor: 0xff333333, numberSize: 28, numFieldOffsetY: 340, sloganOffsetY: 380, logBtnText: '一键登录', logBtnOffsetY: 418, logBtnImgs: ['static/login-btn-iOS.png', 'static/login-btn-iOS.png', 'static/login-btn-iOS.png'], uncheckedImg: 'static/unchecked-iOS.png', checkedImg: 'static/checked-iOS.png', privacyCheckToastMessage: '请点击同意协议', privacyShowBookSymbol: true, privacyTextFontSize: 12, appPrivacyColor: [0xff605D67, 0xff016BF6], appPrivacys:[ "已阅读并同意", ["、","《亿职赞用户协议》","https://h5.bosszan.com/my/setting/xieyi","亿职赞用户协议"], ["和","《隐私协议》","https://h5.bosszan.com/my/setting/mimi","隐私协议"], ",允许亿职赞统一管理本人账号信息"], agreementNavBackgroundColor: 0xffffff, agreementNavReturnImage: 'static/close-iOS.png' }) } else { // Android平台 jv.setCustomUIWithConfigAndroid({ setLogoImgPath: 'static/invite.png', setLogoWidth: 200, setLogoHeight: 200, setNumFieldOffsetY: 340, setSloganOffsetY: 380, setLogBtnText: '一键登录', setLogBtnImgPath: 'static/login-btn.png', setLogBtnHeight: 40, setLogBtnOffsetY: 418, setNavReturnImgPath: 'static/close.png', setNavReturnBtnWidth: 20, setNavReturnBtnHeight: 20, setNavReturnBtnOffsetX: 20, setNavReturnBtnOffsetY: 18, setNavTransparent: true, setNumberColor: 0xff333333, setNumberSize: 28, setPrivacyOffsetX: 30, setPrivacyTextSize: 12, setCheckedImgPathFromJs: 'static/checked.png', setUncheckedImgPathFromJs: 'static/unchecked.png', setPrivacyCheckboxSize: 12, setPrivacyWithBookTitleMark: true, setAppPrivacyColor: [0xff605D67, 0xff016BF6], enableHintToast: true, enableHintToastText: '请点击同意协议', setPrivacyNameAndUrlBeanList: [{ name: '亿职赞用户协议', url: 'https://h5.bosszan.com/my/setting/xieyi', beforeName: '、' }, { name: '隐私协议', url: 'https://h5.bosszan.com/my/setting/mimi', beforeName: '和' }, ], setPrivacyNavColor: 0xff016BF6, }); } } /** * 执行极光一键登录核心逻辑 */ function doJVerificationLogin(callback) { return new Promise((resolve, reject) => { // 预登录(提升登录速度,极光推荐) jv.preLogin(7000, (preResult) => { if (preResult.code !== 7000) { // 预取号失败 plus.nativeUI.toast('一键登录失败') reject(new Error(preResult.content || '预取号失败')); return; } // 配置自定义 UI configJVerificationUI(); // 显示一键登录界面 jv.loginAuth({ autoFinish: isIOS ? true : false, timeout: 5000 }, (loginRes) => { uni.showLoading({ title: '登录中' }) if (loginRes.code == 6000) { // 成功获取运营商的loginToken // 请求后端接口进行登录 const params = { ...loginRes, platform: 'app' } HttpRequest .postJson('/app/Login/jpushLogin', params) .then((response) => { if (response.code === 0) { if (typeof callback === 'function') { callback(response); } // 返回 accessToken,供调用方后续换取手机号 resolve(true); return } plus.nativeUI.toast('登录失败:', response.msg) }) .finally(() => { uni.hideLoading() }) } else if (loginRes.code == 6002) { // 用户取消了一键登录 uni.hideLoading() } else { // 其他情况则跳转到手机验证码登录 uni.hideLoading() plus.nativeUI.toast('一键登录失败') } }, (event) => { // 监听协议勾选/取消事件 }); }); }); } /** * 关闭授权弹窗 */ export function closeVerifyView() { // #ifdef APP-PLUS if (!isIOS) { jv.dismissLoginAuth(true); } // #endif } /** * 对外暴露的核心方法:极光一键登录入口 * @param {Function} callback // 成功后执行 */ export function jVerificationLogin(callback) { initJVerification() .then(() => doJVerificationLogin(callback)) .catch((err) => { console.error('极光一键登录失败:', err.message); }); }