UNPKG

@sinosun/lib

Version:

sinosun jsbridge and net toolkit

641 lines (508 loc) 20.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof")); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/es.string.split.js"); require("core-js/modules/es.array.join.js"); require("core-js/modules/es.string.match.js"); require("core-js/modules/es.string.replace.js"); require("core-js/modules/es.date.to-string.js"); var _setPrototypeOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/set-prototype-of")); var _create = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/create")); var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property")); var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise")); var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice")); var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of")); var _startsWith = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/starts-with")); var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each")); var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify")); var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind")); var __extends = void 0 && (void 0).__extends || function () { var _extendStatics = function extendStatics(d, b) { _extendStatics = _setPrototypeOf["default"] || { __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; } || function (d, b) { for (var p in b) { if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; } }; return _extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); _extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? (0, _create["default"])(b) : (__.prototype = b.prototype, new __()); }; }(); var __importDefault = void 0 && (void 0).__importDefault || function (mod) { return mod && mod.__esModule ? mod : { "default": mod }; }; (0, _defineProperty["default"])(exports, "__esModule", { value: true }); exports.PromiseJSBridgeReady = void 0; var IJsBridge_1 = __importDefault(require("../IJsBridge")); var _ALI_JS_BRIDGE = 'AlipayJSBridge'; var AlipayJSBridge; function PromiseJSBridgeReady(callback) { // 如果 jsbridge 已经注入则直接调用 if (window[_ALI_JS_BRIDGE]) { AlipayJSBridge = window.AlipayJSBridge; callback && callback(); } else { // 如果没有注入则监听注入的事件 document.addEventListener('AlipayJSBridgeReady', function () { AlipayJSBridge = window.AlipayJSBridge; callback && callback(); }, false); } } exports.PromiseJSBridgeReady = PromiseJSBridgeReady; // mPaaS页面回退 function mPaasPopTo(backSteps, loadData) { backSteps -= 1; if (backSteps < 0) { return; } window.AlipayJSBridge.call('popWindow', { data: { backSteps: backSteps, loadData: loadData, refreshData: loadData } }); } //兼容安卓升级之后的参数获取 function changehash() { return new _promise["default"](function (resolve, reject) { PromiseJSBridgeReady(function () { //如果是ali mPaaS环境,需要从启动参数内获取完整url if (!window.AlipayJSBridge || !window.AlipayJSBridge.startupParams || !window.AlipayJSBridge.startupParams.passData) { reject({ message: "(<any>window).AlipayJSBridge \u672A\u521D\u59CB\u5316" }); return; } var currentUrl = window.location.href; var serverUrl = JSON.parse(window.AlipayJSBridge.startupParams.passData).homeAddr || ''; //当前页面实际线上地址 console.log("(<any>window).location.href_PromiseJSBridgeReady ------>", currentUrl, "(<any>window).AlipayJSBridge.startupParams.passData.homeAddr ------>", serverUrl); var serverUrlList = serverUrl.split('.html'); var isOnlyHtml = !serverUrlList[1]; var serverUrlRoute = (0, _slice["default"])(serverUrlList).call(serverUrlList, 1).join('.html'); //当前访问页面参数和路由 var currentPath = currentUrl.match(/^http.*:\/\/.+?\//); //获取离线资源包入口页面path长度 var pathLen = currentUrl.split(currentPath[0])[1].split('/').length; var serverPath = serverUrlList[0].split('/'); if (serverPath.length >= pathLen) { //根据离线资源包入口页面path长度,从线上地址上 匹配出同样长度的path var path = (0, _slice["default"])(serverPath).call(serverPath, -pathLen).join('/') + '.html'; var routeUrl = ''; if (serverUrlRoute) { // 线上地址html后面如果不是参数而是锚点,则不要将锚点移动到最后 if ((0, _indexOf["default"])(serverUrlRoute).call(serverUrlRoute, "?") !== -1 && serverUrlRoute[0] !== "?") { var serverUrlRouteList = serverUrlRoute.split('?'); routeUrl = "" + currentPath[0] + path + "?" + (0, _slice["default"])(serverUrlRouteList).call(serverUrlRouteList, 1).join('?') + serverUrlRouteList[0]; } else if ((0, _indexOf["default"])(serverUrlRoute).call(serverUrlRoute, "?") === -1) { // 如果不加这个问号 只有hash时页面不会刷新 相当于页面锚点 routeUrl = "" + currentPath[0] + path + "?" + serverUrlRoute; } else { // 已有问号不处理 routeUrl = "" + currentPath[0] + path + "?" + serverUrlRoute; } // 没有参数 得到地址和线上地址不同/相同 需要加?#/保证页面刷新 } else { routeUrl = "" + currentPath[0] + path + "?#/"; } // 使用url替换,防止访问栈多一层,回退异常 if (routeUrl !== '') { window.location.replace(routeUrl); resolve({ routeUrl: routeUrl }); } } else { // 如果启动参数里面拿不到path长度不对 reject({ message: "\u65E0\u9700\u4ECE\u542F\u52A8\u53C2\u6570\u83B7\u53D6\u5730\u5740" }); return; } }); }); } // 发送数据 var uniqueId = 1; var u = navigator.userAgent; var isAndroid = (0, _indexOf["default"])(u).call(u, 'Android') > -1 || (0, _indexOf["default"])(u).call(u, 'Linux') > -1; //g var mPaaSAddEventMap = {}; var appletCallbackEventMap = {}; // 监听页面恢复运行 document.addEventListener('resume', function (event) { console.log('5页面是否关闭,注册事件:resume -----------------返回的数据是:', event); var backSteps = event.data && event.data.backSteps || 0; var loadData = event.data && event.data.loadData || ''; if (backSteps > 0) { mPaasPopTo(backSteps, loadData); } }); var MPaaSJsBridgeImpl = /** @class */ function (_super) { __extends(MPaaSJsBridgeImpl, _super); function MPaaSJsBridgeImpl() { return _super !== null && _super.apply(this, arguments) || this; } //通用JSBridgeReady事件 Promise 版, MPaaSJsBridgeImpl.prototype.PromiseJSBridgeReady = function (callback) { // 如果 jsbridge 已经注入则直接调用 if (window.AlipayJSBridge) { callback && callback(); } else { // 如果没有注入则监听注入的事件 document.addEventListener('AlipayJSBridgeReady', function () { callback && callback(); }, false); } }; /** * @description: 获取实际域名 * @param {*} key 域名在passData 中的key * @param {*} flag 是否从passData 中取 */ MPaaSJsBridgeImpl.prototype.getRealHost = function (key) { //通用JSBridgeReady事件 Promise 版, return new _promise["default"](function (resolve) { PromiseJSBridgeReady(function () { // 页面实际地址对象 var appPassData = {}; // 启动参数 var startupParams = {}; var alipayInfo = window.AlipayJSBridge; // 阿里mpass存在 if (alipayInfo) { startupParams = alipayInfo.startupParams; // 有启动参数 if (startupParams && startupParams.passData) { //如果是ali mPaaS环境,需要从启动参数内获取完整url, 2019-09-29 zw try { appPassData = JSON.parse(startupParams.passData); } catch (err) { console.log("mpaas jsBridge getRealHost", err); } } } // 获取启动参数 if (key === "startupParams") { resolve({ startupParams: startupParams, appPassData: appPassData }); } else { // 获取值 if (key) { resolve(appPassData[key] || ''); } else { // 获取实际地址数据 resolve(appPassData); } } }); }); }; /** * 获取url中参数 * @param {*} key * @param {*} urlParams */ MPaaSJsBridgeImpl.prototype.getUrlParam = function (key, urlParams) { if (urlParams === void 0) { urlParams = {}; } var url = window.location.href; var regexP = /[^#&\?]+=[^#&\?]*/gi; var ms = url.match(regexP); if (!ms && window.AlipayJSBridge && window.AlipayJSBridge.startupParams && window.AlipayJSBridge.startupParams.passData) { //如果是ali mPaaS环境,需要从启动参数内获取完整url, 2019-09-29 zw url = JSON.parse(window.AlipayJSBridge.startupParams.passData).homeAddr || url; ms = url.match(regexP); } if (ms) { for (var i = 0; i < ms.length; i++) { var arr = ms[i].split('='); try { arr[1] = decodeURI(decodeURIComponent(arr[1])); } catch (e) { arr[1] = decodeURIComponent(arr[1]); } urlParams[arr[0]] = arr[1]; } } if (key) { return urlParams[key]; } else { return urlParams; } }; // 兼容mPaaS离线包,打开单页小应用对应的路由地址 // 从其他应用跳转的应用需要在入口页面做处理,这里不处理 MPaaSJsBridgeImpl.prototype.openAppRoute = function () { // 非mPaaS 跳转的页面必须在html后面加上hash 根据hash 区分是不是从mPaaS配置打开首页(mPaaS离线包的html后面不允许加参数) // 不是从mPaaS 打开首页不用处理 var curUrl = window.location.href; console.log("(<any>window).location.href_curUrl ------>", curUrl); var curUrlList = curUrl.split('.html'); var curUrlRoute = (0, _slice["default"])(curUrlList).call(curUrlList, 1).join('.html'); // 不是从mPaaS离线配置进入 直接返回 if (curUrlRoute) { if ((0, _indexOf["default"])(curUrlRoute).call(curUrlRoute, "?") !== -1 && curUrlRoute[0] !== "?") { var replaceUrl = ''; var curUrlRouteList = curUrlRoute.split('?'); replaceUrl = curUrlList[0] + ".html?" + (0, _slice["default"])(curUrlRouteList).call(curUrlRouteList, 1).join('?') + curUrlRouteList[0]; window.location.replace(replaceUrl); // 重定向后面不在执行 return "change"; } return; } return changehash(); }; /** * 调用app的接口 * @param {*} method * @param {*} data */ MPaaSJsBridgeImpl.prototype.callHandler = function (method, data) { return new _promise["default"](function (resolve) { PromiseJSBridgeReady(function () { var sendData = { handlerName: method, data: data }; console.log('sendData = ', sendData); if (isAndroid) { sendData.callbackId = 'cb_' + uniqueId++ + '_' + new Date().getTime(); } // if (method == 'OpenAppletFunction') { // // 是否需要返回 回调参数 // if (!this.needCallbackData(data.url)) { // this.appletCallback(data, resolve) // return // } // } window.AlipayJSBridge.call('mPaaSAdapterEvent', sendData, function (result) { console.log('3调用的方法名是:' + method + '-----------------3返回的数据是:', result); try { if (result.mPaaSAdapterEvent && result.mPaaSAdapterEvent.responseData) { resolve(JSON.parse(result.mPaaSAdapterEvent.responseData)); } else { resolve(result); } } catch (e) { resolve(result.mPaaSAdapterEvent && result.mPaaSAdapterEvent.responseData); } }); }); }); }; //小应用间跳转传输数据 MPaaSJsBridgeImpl.prototype.appletCallback = function (data, resolve) { var _this = this; var method = 'resume'; var toUrl = ''; document.removeEventListener(method, appletCallbackEventMap[method] || {}); var appletCallbackEventListener = function appletCallbackEventListener(event) { console.log('5主动注册时间:' + method + '-----------------5主动返回的数据是:', event); event.preventDefault && event.preventDefault(); var params = _this.getParams(data.url); var loadData = event.data && event.data.loadData && JSON.parse(event.data.loadData); if (params.uniqueId == (loadData || {}).uniqueId) { var res = { responseData: event.data.loadData, ret: 0 }; resolve(res); } }; document.addEventListener(method, appletCallbackEventListener); appletCallbackEventMap[method] = appletCallbackEventListener; var curUrl = data.url; // 如果传入url包含http 或者我么自己的通配符 $****$ 直接跳过 if ((0, _startsWith["default"])(curUrl).call(curUrl, 'http') || (0, _startsWith["default"])(curUrl).call(curUrl, "$")) { toUrl = curUrl; } else { // TODO 现在只能补充Bizmate的域名 有二级域名需要带上 后续改成重app读取 toUrl = window.Common_Config.originUrl + curUrl; } this.openPage(toUrl); }; //获取url参数 MPaaSJsBridgeImpl.prototype.getParams = function (url) { var _context; var param = url.split('?')[1]; var params = {}; param && (0, _forEach["default"])(_context = param.split('&')).call(_context, function (item) { var arr = item.split('='); params["" + arr[0]] = arr[1]; }); return params; }; // 判断openPage 是否需要回调参数。 MPaaSJsBridgeImpl.prototype.needCallbackData = function (url) { var isNeed = true; var params = this.getParams(url); if ('uniqueId' in params) { isNeed = false; } return isNeed; }; /** * 注册监听app的事件 * @param {*} method * @param {*} callback */ MPaaSJsBridgeImpl.prototype.registerHandler = function (method, callback) { PromiseJSBridgeReady(function () { // 兼容处理back和resume事件;notifyAppBack、refreshPage是兆日接口的名称 if (method === 'notifyAppBack') { method = 'back'; } if (method === 'refreshPage') { method = 'resume'; } document.removeEventListener(method, mPaaSAddEventMap[method] || {}); var mPaaSAddEventListener = function mPaaSAddEventListener(event) { console.log('4主动注册时间:' + method + '-----------------4主动返回的数据是:', event); event.preventDefault && event.preventDefault(); var eventData = (event || {}).data || {}; if (method === 'resume') { var loadData = eventData.loadData; if (typeof loadData !== 'undefined') { eventData.refreshData = loadData || ''; } eventData = (0, _stringify["default"])(eventData); } callback && callback(eventData); }; document.addEventListener(method, mPaaSAddEventListener); mPaaSAddEventMap[method] = mPaaSAddEventListener; }); }; /** * 打开页面 * @param {*} url */ MPaaSJsBridgeImpl.prototype.openPage = function (url) { PromiseJSBridgeReady(function () { var _a; //url中参数sswbv_multipage=false,当前页面重定向,其它新开页面 var sswbv_multipage = true; var sswbvMultiPageRegRes = url.match(/[?|&]sswbv_multipage=([^&]*)(&|$)/); if (sswbvMultiPageRegRes) { sswbv_multipage = sswbvMultiPageRegRes[1]; } // let redirectionCnt = getRedirectionCnt((<any>window).location.href) if (sswbv_multipage === false) { window.open(url); } else { // mPaas平台新开页面 window.AlipayJSBridge.call('pushWindow', { url: encodeURI(url), param: { readTitle: true, showOptionMenu: false, appletUAId: (_a = window.AlipayJSBridge.startupParams) === null || _a === void 0 ? void 0 : _a.appletUAId //将当前小应用id带入下一个页面 } }); } }); }; /** * 注册title栏菜单 * @param {*} menuList */ MPaaSJsBridgeImpl.prototype.registerMenu = function (menuList) { var _context2; this.callHandler('RegisterMenuFunction', menuList); this.registerHandler('clickMenuCallBack', (0, _bind["default"])(_context2 = function _context2(data) { var dataJson = data; if ((0, _typeof2["default"])(data) !== 'object') { dataJson = JSON.parse(data); } // 找出menuList中的与注册事件对应的函数并且执行 if (menuList) { //取对应的func执行 for (var i = 0; i < menuList.length; i++) { if (dataJson.menuId === menuList[i].menuId && menuList[i].func) { menuList[i].func(); break; } } } }).call(_context2, this)); }; /** * 回退页面 * @param {Object} url //目标页面url */ MPaaSJsBridgeImpl.prototype.goBack = function (url, backSteps, loadData) { var _this_1 = this; PromiseJSBridgeReady(function () { //如果通过APP打开的页面,关闭时的数据需要通过APP回传回去 _this_1.callHandler('goBackFunction', (0, _stringify["default"])({ loadData: loadData })); if (backSteps) { mPaasPopTo(backSteps, loadData); } else if (url) { window.AlipayJSBridge.call('popTo', { urlPattern: url }); } else { mPaasPopTo(1, loadData); } }); }; MPaaSJsBridgeImpl.prototype.fileUploadFunction = function (data) { if (data === void 0) { data = {}; } return this.callHandler('FileUploadFunction', data); }; //选择联系人 MPaaSJsBridgeImpl.prototype.selectContact = function (data) { var selectType = data.selectType, selectId = data.selectId; var dataList = [{ key: 'from_key', value: 9, type: 'int' }, { key: 'select_model', value: selectType + '', type: 'string' }, { key: 'selected_list_tpay', value: (0, _stringify["default"])(selectId), type: 'string' }]; var selectJson = { action: 'IntentAction_SelectContactWithOrgListActivity', dataList: dataList, responseKeyList: [{ key: 'addusers_tpay', value: '', type: 'string' }] }; return this.callHandler('OpenActionFunction', selectJson); }; //扫描二维码 MPaaSJsBridgeImpl.prototype.scanQrcode = function () { var Json = { action: 'action_common_qrcode_scan', dataList: [{ key: 'userid', value: 'abc1', type: 'string' }, { key: 'userid', value: 'abc2', type: 'string' }, { key: 'userid', value: 'abc3', type: 'string' }], responseKeyList: [{ key: 'qrcode', value: '', type: 'string' }] }; return this.callHandler('OpenActionFunction', Json); }; return MPaaSJsBridgeImpl; }(IJsBridge_1["default"]); exports["default"] = MPaaSJsBridgeImpl;