import uniStarterConfig from '@/uni-starter.config.js'; import store from '@/store' //应用初始化页 // #ifdef APP-PLUS import checkUpdate from '@/uni_modules/uni-upgrade-center-app/utils/check-update'; import callCheckVersion from '@/uni_modules/uni-upgrade-center-app/utils/call-check-version'; import interceptorChooseImage from '@/uni_modules/json-interceptor-chooseImage/js_sdk/main.js'; // #endif const db = uniCloud.database() export default async function() { let loginConfig = uniStarterConfig.router.login //清除有配置但设备环境不支持的登陆项 // #ifdef APP-PLUS await new Promise((callBack)=>{ plus.oauth.getServices(oauthServices => { loginConfig = loginConfig.filter(item=>{ if(["univerify", "weixin", "apple"].includes(item)){ let index = oauthServices.findIndex(e=>e.id==item) if(index==-1){ return false }else{ return oauthServices[index].nativeClient } }else{ return true } }) if(loginConfig.includes('univerify')){ //一键登录 功能预登录 uni.preLogin({ provider:'univerify', complete: e => { console.log(e); } }) } callBack() }, err => { console.error('获取服务供应商失败:' + JSON.stringify(err)); }) }) // #endif //非app移除:一键登录、苹果登陆;h5移除微信登陆,如果你做微信公众号登陆需要将此行移除 // #ifndef APP-PLUS loginConfig = loginConfig.filter(item=>{ return ![ 'univerify', 'apple', // #ifdef H5 'weixin' // #endif ].includes(item) }) // #endif uniStarterConfig.router.login = loginConfig // uniStarterConfig挂载到getApp().globalData.config setTimeout(()=>{ getApp({allowDefault: true}).globalData.config = uniStarterConfig; },1) // 初始化appVersion(仅app生效) initAppVersion(); // #ifdef APP-PLUS // 实现,路由拦截。当应用无访问摄像头/相册权限,引导跳到设置界面 interceptorChooseImage() // #endif //clientDB的错误提示 function onDBError({ code, // 错误码详见https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=returnvalue message }) { console.log('onDBError'); // 处理错误 console.log(code,message); if([ 'TOKEN_INVALID_INVALID_CLIENTID', 'TOKEN_INVALID', 'TOKEN_INVALID_TOKEN_EXPIRED', 'TOKEN_INVALID_WRONG_TOKEN', 'TOKEN_INVALID_ANONYMOUS_USER', ].includes(code)){ uni.navigateTo({ url:'/pages/ucenter/login-page/index/index' }) } } // 绑定clientDB错误事件 db.on('error', onDBError) // 解绑clientDB错误事件 //db.off('error', onDBError) db.on('refreshToken', function({ token, tokenExpired }) { console.log('监听到clientDB的refreshToken',{token,tokenExpired}); store.commit('user/login', { token, tokenExpired }) }) const Debug = true; //拦截器封装callFunction let callFunctionOption; uniCloud.addInterceptor('callFunction',{ async invoke(option){ // #ifdef APP-PLUS // 判断如果是执行登陆(无论是哪种登陆方式),就记录用户的相关设备id if(option.name == 'uni-id-cf'&&(option.data.action == 'register' || option.data.action.slice(0,5) =='login')){ let oaid = await new Promise((callBack,fail)=>{ if (uni.getSystemInfoSync().platform == "android") { plus.device.getOAID({ success:function(e){ callBack(e.oaid) // console.log('getOAID success: '+JSON.stringify(e)); }, fail:function(e){ callBack() console.log('getOAID failed: '+JSON.stringify(e)); } }); }else{ callBack() } }) let imei = await new Promise((callBack,fail)=>{ if (uni.getSystemInfoSync().platform == "android") { plus.device.getInfo({ success:function(e){ callBack(e.imei) // console.log('getOAID success: '+JSON.stringify(e)); }, fail:function(e){ callBack() console.log('getOAID failed: '+JSON.stringify(e)); } }); }else{ callBack() } }) let push_clientid = '', idfa = plus.storage.getItem('idfa')||'';//idfa有需要的用户在应用首次启动时自己获取存储到storage中 try{ push_clientid = plus.push.getClientInfo().clientid }catch(e){ uni.showModal({ content: '获取推送标识失败。如果你的应用不需要推送功能,请注释掉本代码块', showCancel: false, confirmText:"好的" }); console.log(e) } let deviceInfo = { push_clientid,// 获取匿名设备标识符 imei,oaid,idfa } console.log("重新登陆/注册,获取设备id",deviceInfo); option.data.deviceInfo = deviceInfo // #ifndef H5 //注册可能不仅仅走register接口,还有登陆并注册的接口 option.data.inviteCode = await new Promise((callBack)=>{ uni.getClipboardData({ success: function (res) { if(res.data.slice(0,18) =='uniInvitationCode:'){ let uniInvitationCode = res.data.slice(18,38) console.log('当前用户是其他用户推荐下载的,推荐者的code是:'+uniInvitationCode); // uni.showModal({ // content: '当前用户是其他用户推荐下载的,推荐者的code是:'+uniInvitationCode, // showCancel: false // }); callBack(uniInvitationCode) //当前用户是其他用户推荐下载的。这里登记他的推荐者id 为当前用户的myInviteCode。判断如果是注册 }else{ callBack(false) } }, fail() { callBack(false) } }); }) // #endif } // #endif // console.log(JSON.stringify(option)); callFunctionOption = option }, complete(e){ // console.log(JSON.stringify(e)); }, fail(e) { // 失败回调拦截 if(Debug){ uni.showModal({ content:JSON.stringify(e), showCancel: false }); console.error(e); }else{ uni.showModal({ content: "系统错误请稍后再试!", showCancel: false, confirmText:"知道了" }); } //如果执行错误,检查是否断网 uni.getNetworkType({ complete:res => { // console.log(res); if (res.networkType == 'none') { uni.showToast({ title: '手机网络异常', icon: 'none' }); console.log('手机网络异常'); let callBack = res=>{ console.log(res); if (res.isConnected) { uni.showToast({ title: '恢复联网自动重新执行', icon: 'none' }); console.log(res.networkType,"恢复联网自动重新执行"); uni.offNetworkStatusChange(e=>{ console.log("移除监听成功",e); }) //恢复联网自动重新执行 uniCloud.callFunction(callFunctionOption) uni.offNetworkStatusChange(callBack); } } uni.onNetworkStatusChange(callBack); } } }); }, success:(e)=>{ console.log(e); const {token,tokenExpired} = e.result if (token && tokenExpired) { store.commit('user/login', { token, tokenExpired }) } switch (e.result.code){ case 403: uni.navigateTo({ url: "/pages/ucenter/login-page/index/index" }) break; case 30203: uni.navigateTo({ url: "/pages/ucenter/login-page/index/index" }) break; case 50101: uni.showToast({ title: e.result.msg, icon: 'none', duration:2000 }); break; default: console.log('code的值是:'+e.result.code,'可以在这里插入,自动处理响应体'); break; } } }) //自定义路由拦截 const {"router": {needLogin,login} } = uniStarterConfig //需要登录的页面 let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]; list.forEach(item => { //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器 uni.addInterceptor(item, { invoke(e) { // 调用前拦截 // console.log(e); //获取用户的token const token = uni.getStorageSync('uni_id_token') //token是否已失效 const tokenExpired = uni.getStorageSync('uni_id_token_expired') < Date.now() //获取当前页面路径(即url去掉"?"和"?"后的参数) const url = e.url.split('?')[0] //控制登录优先级 let pages = getCurrentPages(); if ( //判断当前窗口是否为登陆页面,如果是则不重定向路由 url == '/pages/ucenter/login-page/index/index' && pages[pages.length - 1].route.split('/')[2]!='login-page' ) { console.log(9527777,login); //一键登录(univerify)、账号(username)、验证码登录(短信smsCode) if (login[0] == 'username') { e.url = "/pages/ucenter/login-page/pwd-login/pwd-login" }else{ if(e.url == url) { e.url += '?' } //添加参数之前判断是否带了`?`号如果没有就补上,因为当开发场景本身有参数的情况下是已经带了`?`号 e.url += "type="+login[0] } }else{ //拦截强制登录页面 if (needLogin.includes(url) && (token == ''||tokenExpired)) { uni.showToast({ title: '请先登录', icon: 'none' }) uni.navigateTo({ url: "/pages/ucenter/login-page/index/index" }) return false } } }, fail(err) { // 失败回调拦截 console.log(err); if(Debug){ console.log(err); uni.showModal({ content: JSON.stringify(err), showCancel: false }); } }, }) }) // #ifdef APP-PLUS // 监听并提示设备网络状态变化 uni.onNetworkStatusChange(res=> { console.log(res.isConnected); console.log(res.networkType); if(res.networkType!='none'){ uni.showToast({ title:'当前网络类型:'+res.networkType, icon:'none', duration:3000 }) }else{ uni.showToast({ title:'网络类型:'+res.networkType, icon:'none', duration:3000 }) } }); // #endif } /** * // 初始化appVersion */ function initAppVersion() { // #ifdef APP-PLUS let appid = plus.runtime.appid; plus.runtime.getProperty(appid, (wgtInfo) => { let appVersion = plus.runtime; let currentVersion = appVersion.versionCode > wgtInfo.versionCode ? appVersion : wgtInfo; getApp({ allowDefault: true }).appVersion = { ...currentVersion, appid, hasNew: false } // 检查更新小红点 callCheckVersion().then(res => { // console.log('检查是否有可以更新的版本', res); if (res.result.code > 0) { // 有新版本 getApp({ allowDefault: true }).appVersion.hasNew = true; } }) }); // 检查更新 checkUpdate(); // #endif }