fastman3-dfyjapp-callapp
Version:
h5 call app
390 lines • 16.4 kB
JavaScript
/*
* @Author: zhangkunjie
* @Date: 2021-10-22 16:00:05
* @Company: orientsec.com.cn
* @Description: callapp基础库
*/
import { isFromWeiBo, isFromApp, getQueryString, isFromWeiXin, detect } from "./utils";
import CallApp from "callapp-lib";
var g_Transfer_URLS = {};
var newCallLib = new CallApp({
scheme: {
protocol: "dfyj20170811"
},
appstore: "https://itunes.apple.com/cn/app/id961539789",
yingyongbao: "//a.app.qq.com/o/simple.jsp?pkgname=com.dfzq.winner",
fallback: "https://cfyjh5-v3.dfzq.com.cn/html5-marketing/marketing-install/index.html",
timeout: 3000,
// Universal Link,该配置仅用于iOS平台使用
universal: {
// 生产环境
host: "appullinks.dfzq.com.cn"
// // 测试环境
// host: "h5itest1.dfzq.com.cn"
}
});
// 非app展示
var openButtonHtml = function openButtonHtml() {
var footer = document.createElement("div");
footer.className = "shareNavigation-footer";
document.body.appendChild(footer);
var html = document.createElement("div");
html.className = "ui-row-flex shareNavigation";
html.id = "wraper";
document.body.appendChild(html);
var iconTtml = document.createElement("div");
var span1 = document.createElement("span");
span1.innerText = "东方证券";
var span2 = document.createElement("span");
span2.innerText = "悦享投资之美";
iconTtml.className = "logoImage";
var iconWraperhtml = document.createElement("div");
iconWraperhtml.className = "ui-col-2";
var logoTextHtml = document.createElement("div");
logoTextHtml.className = "logoText";
logoTextHtml.appendChild(span1);
logoTextHtml.appendChild(span2);
var buttonWraperhtml = document.createElement("div");
var buttonHtml = document.createElement("button");
buttonHtml.innerText = "立即打开";
buttonWraperhtml.className = "open";
buttonWraperhtml.id = "btn";
iconWraperhtml.appendChild(iconTtml);
iconWraperhtml.appendChild(logoTextHtml);
buttonWraperhtml.appendChild(buttonHtml);
html.appendChild(iconWraperhtml);
html.appendChild(buttonWraperhtml);
};
// 微信展示
var weiXinPanel = function weiXinPanel() {
var bottomText = detect.os.ios ? "在默认浏览器中打开" : "在浏览器中打开";
var weixinPanelHtml = document.createElement("div");
weixinPanelHtml.id = "weixinPanel";
document.body.appendChild(weixinPanelHtml);
var imgWraperTtml = document.createElement("div");
imgWraperTtml.id = "arraw";
var imgHtml = document.createElement("div");
imgHtml.className = "img";
imgWraperTtml.appendChild(imgHtml);
var pHtml = document.createElement("p");
pHtml.innerText = "\u8BF7\u70B9\u51FB\u53F3\u4E0A\u89D2\u6309\u94AE\uFF0C\u9009\u62E9".concat(bottomText);
weixinPanelHtml.appendChild(imgWraperTtml);
weixinPanelHtml.appendChild(pHtml);
};
// const alertPannel=(params:AlertParams)=>{
// const wraperPananelHtml=document.createElement('div');
// wraperPananelHtml.id="wraper_pannel"
// const alertWraperHtml=document.createElement('div');
// alertWraperHtml.id="alert_id";
// document.body.appendChild(wraperPananelHtml);
// const alertMainHtml=document.createElement('div');
// alertMainHtml.id="alert_main"
// const alertContentHtml=document.createElement('p');
// const alertTitleHtml=document.createElement('p')
// alertTitleHtml.id='alert_title_id';
// alertContentHtml.id='alert_conten';
// alertContentHtml.innerText="您还未下载东方赢家APP,您可以先开立账户,后续下载APP进行交易"
// alertMainHtml.append(alertContentHtml,alertTitleHtml);
// const alertButtonHtml=document.createElement('div');
// alertButtonHtml.id="btn_wraper"
// const cancelButtonHtml=document.createElement("button");
// cancelButtonHtml.id='cancel_id';
// cancelButtonHtml.innerText="取消";
// const confirmButtonHtml=document.createElement("button");
// confirmButtonHtml.id='confirm_id';
// confirmButtonHtml.innerText="立即开户";
// alertButtonHtml.append(cancelButtonHtml,confirmButtonHtml)
// alertWraperHtml.append(alertMainHtml,alertButtonHtml)
// wraperPananelHtml.append(alertWraperHtml)
// }
var callBack = function callBack(params) {
if (params === void 0) {
params = {};
}
var configuration = params.configuration;
// 要跳转的地址和配置的中转页集合
var router_url, transerUrls;
// 当前地址是否带有渠道号 且渠道号有值
if (location.href.indexOf("trackChannel") !== -1 && getQueryString("trackChannel")) {
// 判断是v1,v2和v3
if (configuration) {
transerUrls = configuration === null || configuration === void 0 ? void 0 : configuration.callAppPluginConfig.Transfer_URLS;
} else {
transerUrls = g_Transfer_URLS;
}
for (var i in transerUrls) {
if (i.replace(/\"/g, "") === getQueryString("trackChannel")) {
router_url = transerUrls[i];
} else {
alert("未找到对应地址");
router_url = getDefaulturl(configuration);
}
}
} else {
router_url = getDefaulturl(configuration);
}
return router_url.replace(/\"/g, "");
};
var getDefaulturl = function getDefaulturl(configuration) {
var default_route_url;
if (detect.os.ios) {
if (configuration) {
default_route_url = configuration === null || configuration === void 0 ? void 0 : configuration.callAppPluginConfig.DEFAULT_DOWNLOAD_IOS_URL;
} else {
default_route_url = "https://cfyjh5-v3.dfzq.com.cn/html5-marketing/marketing-install/index.html";
}
} else {
if (configuration) {
default_route_url = configuration === null || configuration === void 0 ? void 0 : configuration.callAppPluginConfig.DEFAULT_DOWNLOAD_URL;
} else {
default_route_url = "https://cfyjh5-v3.dfzq.com.cn/html5-marketing/marketing-install/index.html";
}
}
return default_route_url.replace(/\"/g, "");
};
/**
* 基础唤起app函数
* @param params
* @param path 唤起app的路径
*/
var baseCallApp = function baseCallApp(params, path) {
if (params === void 0) {
params = {};
}
if (isFromWeiBo()) {
weiXinPanel();
var weixinAllHtml_1 = document.getElementById("weixinPanel");
weixinAllHtml_1 === null || weixinAllHtml_1 === void 0 ? void 0 : weixinAllHtml_1.addEventListener("click", function () {
document.body.removeChild(weixinAllHtml_1);
});
} else if (isFromWeiXin()) {
weiXinPanel();
var weixinAllHtml_2 = document.getElementById("weixinPanel");
weixinAllHtml_2 === null || weixinAllHtml_2 === void 0 ? void 0 : weixinAllHtml_2.addEventListener("click", function () {
document.body.removeChild(weixinAllHtml_2);
});
} else {
newCallLib.open({
path: path,
callback: function callback() {
location.href = callBack(params);
}
});
}
};
/**
* 获取url 查询参数或hash后面的查询参数,返回键值对
* @param url
* @returns object
*/
var getURLParameters = function getURLParameters(url) {
return (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(function (a, v) {
return a[v.slice(0, v.indexOf("="))] = v.slice(v.indexOf("=") + 1), a;
}, {});
};
/**
* UniversalLink链接生成器
* @returns 返回一个iOS可解析的 universalUrl
*
* 采用三次编码约定:(针对<5.9.0的iOS版本,使用open=来接受,可使用 https://websanova.com/utils/url 进行测试)
* 步骤一. 对目标地址(https://{domain}/{path}/?qs#/hash?qs)中2个 qs 部分进行编码形成 queryStringEncoder;
* 步骤二. 再对 https://{domain}/{path}/?queryStringEncoder 进行编码形成 targetUrlEncoder;
* 步骤三. 再对 dfyj20170811://dl/wb?url=targetUrlEncoder 进行再编码形成 schemaUrlEncoder;
* 步骤四. 最终形成规范地址:https://appullinks.dfzq.com.cn/dfyjlink?open=schemaUrlEncoder;
*
* 采用二次编码约定:(针对>=5.9.0的iOS版本,使用callapp=来接受)
* 步骤一. 对 location.href 进行编码形成 targetUrlEncoder;
* 步骤二. 对 dfyj20170811://dl/wb?url=targetUrlEncoder 进行再编码形成 schemaUrlEncoder;
* 步骤三. 最终形成规范地址:https://appullinks.dfzq.com.cn/dfyjlink?open=schemaUrlEncoder;
*
* 注意:open和callapp需要同时携带在url上,open=用于<5.9.0的兼容,callapp=则是用于>=5.9.0的兼容
*/
var universalurl = function universalurl(targetUrl) {
// 情况1:http://192.168.114.160:10086/?recommend=1&appversion=5.7.3#/pages/fundSubscribeDetail/index?prodCode=000395
// 情况2:http://192.168.114.160:10086/?recommend=1&appversion=5.7.3#/pages/fundSubscribeDetail/index
// 情况3:http://192.168.114.160:10086/#/pages/fundSubscribeDetail/index?prodCode=000395
// 经分析,hash部分中可能存在 qs,同时 qs 也可能出现在标准体html后!另外 recommend 和 appversion 作为原生分享出来的派生参数。
// @ts-ignore
var parser = window.url;
if (!targetUrl) {
targetUrl = location.href;
}
console.log("[UL]targetUrl: " + targetUrl);
// 兼容 <5.9.0 的iOS版本
// 步骤一
// 页面标准的 qs 编码
var queryString = parser("query", targetUrl) || "";
var queryStringEncoder = "";
if (queryString) {
console.log("[UL]queryString: " + queryString);
queryStringEncoder = window.encodeURIComponent(queryString);
targetUrl = targetUrl.replace(queryString, queryStringEncoder);
}
// 页面标准的 hash 编码,需带#
var hash = parser("hash", targetUrl);
var hashEncoder = "";
if (hash) {
// 检测 hash 部分中是否包含 qs 部分
var hashQsString = parser("query", hash);
if (hashQsString) {
console.log("[UL]hashQsString: " + hashQsString);
var hashQsStringEncoder = window.encodeURIComponent(hashQsString);
targetUrl = targetUrl.replace(hashQsString, hashQsStringEncoder);
}
}
// 步骤二
var targetUrlEncoder = window.encodeURIComponent(targetUrl);
console.log("[UL]targetUrlEncoder: " + targetUrlEncoder);
// 步骤三
var schemaUrlEncoder = window.encodeURIComponent("dfyj20170811://dl/wb?url=".concat(targetUrlEncoder));
console.log("[UL]schemaUrlEncoder: " + schemaUrlEncoder);
// 步骤四
var universalLink = "https://appullinks.dfzq.com.cn/dfyjlink?open=".concat(schemaUrlEncoder);
console.log("[UL]universalLink: " + universalLink);
// 兼容 >=5.9.0 的iOS版本
// 步骤一
// 对 location.href 进行编码形成 targetUrlEncoder
// const targetUrlEncoder2 = window.encodeURIComponent(location.href);
var targetUrlEncoder2 = window.encodeURIComponent(targetUrl);
console.log("[UL]targetUrlEncoder2: " + targetUrlEncoder2);
// 步骤二. 对 dfyj20170811://dl/wb?url=targetUrlEncoder 进行再编码形成 schemaUrlEncoder;
var schemaUrlEncoder2 = window.encodeURIComponent("dfyj20170811://dl/wb?url=".concat(targetUrlEncoder2));
console.log("[UL]schemaUrlEncoder2: " + schemaUrlEncoder2);
// 步骤三
var universalLink2 = "".concat(universalLink, "&callapp=").concat(schemaUrlEncoder2);
console.log("[UL]universalLink2: " + universalLink2);
return universalLink2;
};
/**
* 唤起app打开当前location.href
* @param params fastmanV3时不用传
*/
var callAppLH = function callAppLH(params) {
if (params === void 0) {
params = {};
}
// if (detect.os.ios && isFromWeiXin()) {
if (detect.os.ios) {
// location.href = universalurl();
iosCallApp(location.href);
} else {
baseCallApp(params, "dl/wb?url=".concat(encodeURIComponent(location.href)));
}
};
/**
* 通过 Universal Link 唤起 iOS 端应用,若唤起失败则跳转至下载页
* @param targetUrl - 需要打开的原始目标链接地址
*/
var iosCallApp = function iosCallApp(targetUrl) {
var targetUniversalLinkUrl = universalurl(targetUrl);
// 示例targetUniversalLinkUrl:https://appullinks.dfzq.com.cn/dfyjlink/?open=dfyj20170811%3A%2F%2Fdl%2Fwb%3Furl%3Dhttp%253A%252F%252F192.168.92.217%253A10086%252F%2523%252Fpages%252FfundPurchaseDetail%252Findex&callapp=dfyj20170811%3A%2F%2Fdl%2Fwb%3Furl%3Dhttp%253A%252F%252F192.168.92.217%253A10086%252F%2523%252Fpages%252FfundPurchaseDetail%252Findex
// 非pathKey模式,Universal Link 拼接规则:const universalLink = `https://${host}/${open方法中的path}?${open方法中param转换的queryString}`;
// @ts-ignore
var parser = url;
try {
// 解析 Universal Link 中的查询参数部分
var param = parser("?", targetUniversalLinkUrl) || {};
// 提取 Universal Link 中的路径部分
var path = parser("1", targetUniversalLinkUrl);
console.log("[UL]path: " + path);
console.log("[UL]param: " + JSON.stringify(param));
// 调用唤端库进行 App 唤起操作
newCallLib.open({
path: path,
param: param,
callback: function callback() {
// 自定义唤端失败回调函数:进入下载页
console.log("自定义唤端失败回调函数:进入下载页");
// 跳转至App下载页
location.replace("https://cfyjh5-v3.dfzq.com.cn/html5-marketing/marketing-install/index.html");
}
});
} catch (err) {
// 容错保护,一旦发生parser解析异常,最低限度确保用户可以跳转,而不会引导跳转下载页
location.href = targetUniversalLinkUrl;
}
};
/**
* fastmanV3函数,浏览器唤起app打开url
* @param callUrl 打开的url,默认为当前页面的地址,原生界面时调用dfyjdfyj20170811://前缀
*/
var callAppUrlV3 = function callAppUrlV3(callUrl) {
if (callUrl === void 0) {
callUrl = window.location.href;
}
var path = callUrl;
if (/^dfyj/.test(callUrl)) {
// 判断是否原生指令
path = callUrl.replace("dfyj://", "");
path = path.replace("dfyj20170811://", "");
}
if (/^http/.test(callUrl)) {
// 判断是否互联网url
path = "dl/wb?url=" + encodeURIComponent(callUrl);
}
// baseCallApp({}, path);
// 判断如果是ios 则跳转UniversalLink
if (detect.os.ios) {
// location.href = universalurl(callUrl);
iosCallApp(callUrl);
} else {
baseCallApp({}, path);
}
};
/**
* 样式为:页面下面有下载导航栏,点击导航栏中的立即打开按钮,浏览器里唤起app
* @param params fastmanV2的config文件
*/
var newCallApp = function newCallApp(params, beforeCallApp) {
if (params === void 0) {
params = {};
}
if (beforeCallApp === void 0) {
beforeCallApp = function beforeCallApp() {};
}
if (!isFromApp()) {
openButtonHtml();
// 增加定位属性 location: 顶部定位,默认底部定位
// 从参数中获取位置信息
var location_1 = params.location;
// 获取名为"wraper"的元素
var wraper = document.getElementById("wraper");
// 获取类为"shareNavigation-footer"的元素,此处使用断言转换为任意类型以进行后续操作
var footer = document.querySelector(".shareNavigation-footer");
// 如果位置信息存在且为"top",则将footer元素移动到页面顶部,并调整wraper元素的位置
if (location_1 && location_1 == "top") {
if (wraper) {
// 将footer元素添加到body元素的开头
document.body.prepend(footer);
// 设置wraper元素的顶部距离为0,使其贴紧页面顶部
wraper.style.top = "0";
// 重置wraper元素的底部距离,以适应顶部定位
wraper.style.bottom = "initial";
}
} else {
// 如果位置信息不是"top",则将wraper元素的位置调整为默认,并设置底部距离为0,使其贴紧页面底部
if (wraper) {
// 重置wraper元素的顶部距离,以适应默认定位
wraper.style.top = "initial";
// 设置wraper元素的底部距离为0,使其贴紧页面底部
wraper.style.bottom = "0px";
}
}
var btnHtml = document.getElementById("btn");
btnHtml === null || btnHtml === void 0 ? void 0 : btnHtml.addEventListener("click", function () {
beforeCallApp();
callAppLH(params);
});
}
};
export var getCallAppHelper = function getCallAppHelper(transfer_URLS) {
if (!transfer_URLS) {
console.log("transfer_URLS is null");
return {};
}
g_Transfer_URLS = transfer_URLS;
return {
newCallApp: newCallApp,
callAppUrlV3: callAppUrlV3
};
};