方案一:URL Scheme 方式
格式通常为:scheme://host/path?query=value
实现代码
// 使用HTML超链接方式
<a href="myapp://home?user=123&source=h5">打开我的应用</a>
// 使用JavaScript方式
function openAppWithScheme() {
const schemeUrl = 'myapp://home?user=123&source=h5';
window.location.href = schemeUrl;
}常见应用的URL Scheme
微信: weixin://
支付宝: alipays:// 或 alipay://
QQ: mqq://
微博: sinaweibo://
淘宝: taobao://
注意事项:
- URL Scheme 需要目标APP支持并在系统中注册
- 未安装APP时,iOS会弹出错误提示,Android可能无响应
- 部分浏览器可能会拦截URL Scheme调用
- 安全性较低,可能被恶意应用劫持
方案二:Universal Links (iOS)
Universal Links 是 Apple 在 iOS 9 推出的功能,允许使用标准的 HTTP/HTTPS 链接来打开APP,同时支持在未安装APP时打开网页版。
配置步骤
- 在开发者中心为APP开启 Associated Domains 服务
- 在Xcode中配置 Associated Domains,格式applinks:yourdomain.com
- 在网站服务器根目录或 .well-known 目录下创建 apple-app-site-association 文件
- 配置该文件,指定APP的Bundle ID和支持的路径
- 确保服务器支持HTTPS,且文件可被访问
apple-app-site-association 文件示例
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.BundleID",
"paths": ["/app/*", "/products/*"]
}
]
}
}H5页面中的使用
// 直接使用普通的HTTPS链接
<a href="https://yourdomain.com/app/home?user=123">打开应用或网页</a>
// JavaScript方式
function openWithUniversalLinks() {
window.location.href = 'https://yourdomain.com/app/home?user=123';
}说明:当用户点击链接时,系统会自动检测是否安装了对应APP:
- 如果已安装,会直接打开APP并传递路径信息
- 如果未安装,则打开对应的网页链接
方案三:App Links (Android)
App Links 是 Google 在 Android 6.0 (Marshmallow) 推出的类似功能,允许应用程序与网站域名关联。
配置步骤
- 在APP的 AndroidManifest.xml 中配置 Intent Filter
- 在网站服务器上创建 assetlinks.json 文件
- 确保网站支持HTTPS
- 通过Google验证网站与APP的关联
AndroidManifest.xml 配置示例
<activity android:name=".DeepLinkActivity"
android:exported="true"
android:autoVerify="true">
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="yourdomain.com"
android:pathPattern="/app/.*" />
</intent-filter>
</activity>assetlinks.json 文件示例
// 放在 https://yourdomain.com/.well-known/assetlinks.json
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.yourapp.package",
"sha256_cert_fingerprints": ["你的APP签名SHA-256指纹"]
}
}
]
// 与普通链接相同
<a href="https://yourdomain.com/app/home?user=123">打开应用或网页</a>方案四:Intent Scheme (Android)
Intent Scheme 是 Android 平台特有的一种调用应用的方式,通过 intent:// 协议可以精确控制打开的应用和行为。
实现代码
// 基本格式
<a href="intent://home?user=123#Intent;scheme=myapp;package=com.yourapp.package;end">打开应用</a>
// 带回退URL的实现
<a href="intent://home?user=123#Intent;scheme=myapp;package=com.yourapp.package;S.browser_fallback_url=https%3A%2F%2Fexample.com%2Fdownload;end">
打开应用或下载
</a>
// JavaScript方式
function openWithIntent() {
const intentUrl = 'intent://home?user=123#Intent;scheme=myapp;package=com.yourapp.package;S.browser_fallback_url=https%3A%2F%2Fexample.com%2Fdownload;end';
window.location.href = intentUrl;
}参数说明:
- scheme: APP的URL Scheme
- package: APP的包名
- S.browser_fallback_url: APP未安装时的回退URL(需URL编码)
最佳实践
// 完整的兼容性方案
function openAppOrDownload(config) {
// 默认配置
const defaultConfig = {
schemeUrl: 'myapp://home',
universalLink: 'https://yourdomain.com/app/home',
intentUrl: 'intent://home#Intent;scheme=myapp;package=com.yourapp.package;S.browser_fallback_url=https%3A%2F%2Fexample.com%2Fdownload;end',
downloadUrl: 'https://example.com/download',
timeout: 2000
};
const options = { ...defaultConfig, ...config };
const os = getOS();
let url = '';
// 根据平台选择URL
if (os === 'iOS') {
url = options.universalLink || options.schemeUrl;
} else if (os === 'Android') {
// 检测是否是Chrome浏览器
const isChrome = /chrome\/\d+/.test(navigator.userAgent.toLowerCase()) &&
/google inc/.test(navigator.vendor.toLowerCase());
url = isChrome ? options.intentUrl : options.schemeUrl;
} else {
window.location.href = options.downloadUrl;
return;
}
// 特殊处理:iOS 14+ 需要用户交互才能跳转
if (os === 'iOS' && typeof document !== 'undefined') {
const link = document.createElement('a');
link.href = url;
link.style.display = 'none';
document.body.appendChild(link);
// 触发点击
const event = document.createEvent('MouseEvents');
event.initEvent('click', true, true);
link.dispatchEvent(event);
setTimeout(() => {
document.body.removeChild(link);
}, 100);
} else {
window.location.href = url;
}
// 超时检测
setTimeout(() => {
const hidden = document.hidden || document.webkitHidden || document.msHidden;
// 如果页面未隐藏,说明跳转失败
if (!hidden) {
window.location.href = options.downloadUrl;
}
}, options.timeout);
}第三方SDK解决方案
MobLink 使用示例
// 1. 引入SDK
// <script src="https://cdn.mob.com/moblink/webdemo/js/moblink-webdemo.js"></script>
// 2. 初始化和使用
function setupMobLink() {
// 初始化配置
MobLinkConfig.params = {
appKey: '你的appKey',
appSecret: '你的appSecret'
};
// 创建链接
MobLinkConfig.getMobLink({
path: 'pages/index',
params: {
userId: '123',
contentId: '456'
},
onSuccess: function(link) {
console.log('创建链接成功:', link);
// 使用生成的链接
},
onError: function(error) {
console.error('创建链接失败:', error);
}
});
}注意事项
1. 安全性考虑
- 避免在URL中传递敏感信息,如用户凭证
- 使用Universal Links/App Links提高安全性
- 对传递的参数进行验证和过滤
2. 兼容性处理
- 测试不同浏览器和版本的兼容性
- 针对iOS 14+的App Tracking Transparency政策进行适配
- 处理特殊浏览器(如微信内置浏览器)的限制
3. 用户体验优化
- 添加明确的用户提示,避免无响应的情况
- 提供加载状态和反馈
- 设计清晰的下载引导流程
4. 微信环境特殊处理
// 检测是否在微信环境
function isWechat() {
return navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1;
}
// 微信环境下的特殊处理
function handleWechatEnvironment() {
if (isWechat()) {
// 微信内置浏览器禁止直接跳转APP
// 显示引导用户在浏览器中打开的提示
document.getElementById('wechatTip').style.display = 'block';
// 可以提供一个二维码,让用户扫码打开
generateQRCode('https://yourdomain.com/app/open');
}
}转载作品,原作者:HQTech前端,文章来源:https://mp.weixin.qq.com/s/M8Ny1b42U_9BfIdoA-l0AQ
微信赞赏
支付宝赞赏 