app.js 7.22 KB
import wx from './utils/wx';
import udid from './common/udid';
import event from './common/event';
import {
  verify
} from './common/api';
import Promise from './vendors/es6-promise';
import {
  wechatAuthLogin,
  verifySessionKey
} from './common/login';
import {
  MD5
} from './vendors/crypto';
import config from './common/config';
import Yas from './common/yas';
import './router/index'; // 新增的router
import {
  stringify
} from './vendors/query-stringify';

let yas;

// app.js
App({
  globalData: {
    userInfo: {},
    unionID: '',
    sessionKey: '',
    thirdSession: '',
    udid: '',
    unionType: '',
    systemInfo: {}
  },
  reportData: {
    awakeReported: false
  },
  onLaunch: function(options) {
    this.globalData.udid = udid.get(); // 生成 UDID

    verify.gen(); // 此处返回是是 Promise,需要调用接口的业务,最好在 then 里边执行

    let sysInfo = wx.getSystemInfoSync();

    if (!sysInfo.screenHeight) {
      sysInfo.screenHeight = sysInfo.windowHeight;
    }
    if (!sysInfo.screenWidth) {
      sysInfo.screenWidth = sysInfo.windowWidth;
    }
    this.globalData.systemInfo = sysInfo;

    this.globalData.unionType = options.query.union_type || options.scene;
    let timestamp = new Date().getTime() + '';

    this.globalData.sid = MD5(timestamp);
    yas = new Yas(this);
    yas.report('YB_LAUNCH_APP');
  },
  onShow: function(options) {
    udid.get(); // 生成 UDID
    verify.gen(); // 此处返回是是 Promise,需要调用接口的业务,最好在 then 里边执行

    wx.getLocation({});
    wx.checkSession().then(() => { // 微信登录未过期
      this.getWechatThirdSession();
      this.getUserInfo();
      this.getUnionID();
      this.doLogin();
    }).catch(() => { // 微信登录过期
      wx.setStorage({
        key: 'thirdSession',
        data: ''
      });
      wx.setStorage({
        key: 'userInfo',
        data: {}
      });

      wx.setStorage({
        key: 'unionID',
        data: ''
      });
      this.setUserInfo({});
      this.setSessionKey('');

      this.doLogin();
    });

    // yas 登录成功回调上报
    event.on('yas-login-type-report', params => {
      yas.report('YB_MY_LOGIN', params);
    });

    // yas  注册成功后上报
    event.on('yas-user-register-success', params => {
      yas.report('YB_REGISTER_SUCCESS', params);
    });


    yas.report('YB_ENTER_FOREGROUND'); // 系统-程序切换置前台上报
    if (this.reportData.awakeReported === false) {
      let path = options.path || ' ';

      if (Object.keys(options.query).length) {
        path = `${path}?${stringify(options.query)}`;
      }

      yas.report('YB_AWAKE_MP', {
        PAGE_PATH: path
      }); // 唤起事件,即每次启动后获取到原始的推广路径时上报该事件,以对推广渠道数据进行监测;

      this.reportData.awakeReported = true;
    }
  },
  onHide: function() {
    yas.report('YB_ENTER_BACKGROUND'); // 系统 - 程序切换置后台上报
  },
  doLogin: function() {
    // 默认自动登录,退出不走自动登录
    if (!this._getSync('disableAutoLogin')) {
      this.getSessionKey();
      return Promise.resolve(this.wechatAuthLogin());
    }
  },
  _getSync: function(key) {
    try {
      return wx.getStorageSync(key);
    } catch (e) {
      console.log(`wx.getStorageSync get ${key} failed.`);
      return {};
    }
  },
  _setSync: function(key, value) {
    try {
      wx.setStorageSync(key, value);
    } catch (e) {
      console.log(`wx.setStorageSync set ${key} failed.`);
    }
  },
  _removeSync: function(key) {
    try {
      wx.removeStorageSync(key);
    } catch (e) {
      console.log(`wx.removeStorageSync del ${key} failed.`);
    }
  },
  getWechatThirdSession: function() {
    this.globalData.thirdSession = this._getSync('thirdSession');
    return this.globalData.thirdSession;
  },
  setWechatThirdSession: function(session) {
    this.globalData.thirdSession = session;
    wx.setStorage({
      key: 'thirdSession',
      data: this.globalData.thirdSession
    });
  },
  getUid: function() {
    return this.globalData.userInfo.uid || 0;
  },
  getUserInfo: function() {
    this.globalData.userInfo = this._getSync('userInfo');
    return this.globalData.userInfo;
  },
  getUnionID: function() {
    this.globalData.unionID = this._getSync('unionID');
    return this.globalData.unionID;
  },
  getSessionKey: function() {
    this.globalData.sessionKey = this._getSync('sessionKey');
    return this.globalData.sessionKey;
  },
  getOpenID: function() {
    let openid;

    if (this.globalData.openID) {
      return this.globalData.openID;
    }

    openid = wx.getStorageSync('openID');
    this.globalData.openID = openid;
    return openid;
  },
  setOpenID: function(openID) {
    if (openID) {
      this.globalData.openID = openID;
      wx.setStorage({
        key: 'openID',
        data: openID
      });
    }
  },
  setUnionID: function(unionID) {
    this.globalData.unionID = unionID;
    wx.setStorage({
      key: 'unionID',
      data: unionID
    });
    event.emit('wx-union-id-update');
  },
  setUserInfo: function(user) {
    this.globalData.userInfo = user;
    wx.setStorage({
      key: 'userInfo',
      data: this.globalData.userInfo
    });
  },
  setSessionKey: function(sessionKey) {
    this.globalData.sessionKey = sessionKey;
    this._setSync('sessionKey', sessionKey);
  },
  resumeUserInfo: function() {
    this.globalData.userInfo = this._getSync('userInfo');
  },
  resumeSessionKey: function() {
    this.globalData.sessionKey = this._getSync('sessionKey');
  },
  wechatAuthLogin: function() {
    if (!this.globalData.userInfo.uid || !this.globalData.sessionKey) {
      return wechatAuthLogin().then(res => {
        if (res.code === 10003) { // 微信号已绑定手机号
          this.setUserInfo(res.data);
          this.setSessionKey(res.data.sessionKey);
          event.emit('user-login-success');
        }

        if (res.code === 10004) { // 微信号未绑定手机号
          // 自动登录未绑定静默处理、不强制绑定
        }
      }).catch(() => {});
    }

    return verifySessionKey().then(ves => {
      if (ves.code !== 200) { // sessionKey已过期

        // 清理原存储的用户信息
        this.clearUserSession();
        return wechatAuthLogin();
      } else {
        this.resumeUserInfo();
        this.resumeSessionKey();
        event.emit('user-login-success');
        return Promise.resolve({});
      }
    }).then(res => {
      if (res.code === 10003) { // 微信号已绑定手机号
        this.setUserInfo(res.data);
        this.setSessionKey(res.data.sessionKey);
        event.emit('user-login-success');
      }

      if (res.code === 10004) { // 微信号未绑定手机号
        // 自动登录未绑定静默处理、不强制绑定
      }
      event.emit('enable-tap-login');
    }).catch(() => {
      event.emit('enable-tap-login');
    });
  },
  clearUserSession: function() {
    this.setUserInfo({});
    this.setSessionKey('');
  },
  getReportUid() {
    return this.globalData.userInfo.uid || this._getSync('userInfo').uid || '';
  },
  getAppId() {
    return config.appid;
  },
  getPvid() {
    return MD5(`${new Date().getTime()}${udid.get()}`).toString();
  },
  getSystemInfo() {
    return this.globalData.systemInfo;
  }
});