| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /**
- * 极光一键登录封装
- * 功能:1. 判断登录态 2. 未登录则弹出极光一键登录界面 3. 登录成功后执行自定义回调
- */
- import { isProduction } from '@/common/config'
- import HttpRequest from '@/common/httpRequest'
- import { getJPLoginParams } from './login'
- // 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,
- ...getJPLoginParams(),
- 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);
- });
- }
|