三种协议
URL Scheme
安卓老版本和ios都支持
格式: <scheme>://[authority]<path>[?query]
- scheme 为应用标识
- authority 认证
- path 路由
- query 参数
示例:
weixin://
alipays://
taobao://
mqq://
zhihu://
sms://
cmshowidol://ui_openPage?pageName=${pageName}&data=${encodeURI(JSON.stringify(pageData))}
scheme 的唤起方式会被浏览器和app拦截:
- chrome 禁止非用户操作的 scheme 跳转,所以必须要加 button 让用户点击才能跳转
- QQ浏览器、其他 App 内置 webview 的浏览器,都会对 scheme 进行拦截(需要加入app的白名单才行)
Intent
chrome 25以后的版本支持
intent:
HOST/URI-path // Optional host
#Intent;
package=[string]; 必选
action=[string];
category=[string];
component=[string];
scheme=[string]; 必选
end;
例如:intent://ui_openPage?pageName=${pageName}&data=${encodeURI(JSON.stringify(pageData))}/#Intent;scheme=cmshowidol;package=com.tencent.kapu;end
Universal Link
IOS 9+支持
触发方式
<iframe src='${intentURL}' style='display:none'>打开</iframe>
<iframe href='${intentURL}' style='display:none'>打开</iframe>
window.location=intentURL
OS的差异性
Android
IOS
- 下载 app 必须要到跳转到 app store,使用的 scheme 协议为:
itms-appss://apps.apple.com/app/id590338362
- 唤起 app 可以直接用
window.location.href = schemeURL
其他
唤端结果的捕获
唤端成功后浏览器进入后台运行,计时器被推迟(计时器不准),重新切换到浏览器后一般超过2s,此时认为唤端失败
let openTime = new Date()
setTimeout(() => {
if(+new Date() - openTime > 2000) {
alert('打开成功')
}
else {
alert('打开失败')
alert('请使用safari浏览器打开~')
}
}, 1000);
window.location.href = schemeURL