注意:在JavaScript中直接判断用户手机上是否安装了特定的APP是不可能的,因为JavaScript运行在浏览器环境中,出于安全和隐私考虑,它没有权限访问用户的本地文件系统或已安装应用的信息。但是,你可以通过一种间接的方式来实现这个需求,即尝试唤起该APP,如果失败则引导用户去下载。

利用时间检测

因为现在部分浏览器需要用户确认后才会跳转到外部APP,所以会因为超时被判定为未安装APP,目前无解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function openAppOrRedirect (appUrl, downloadLink) {
let timer;
// 创建隐藏的iframe来尝试唤起APP
const iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.onload = function () {
clearTimeout(timer); // 如果加载成功,说明APP已安装
document.body.removeChild(iframe);
};
iframe.onerror = function () {
// 如果加载失败,可能是APP未安装或链接问题
clearTimeout(timer);
document.body.removeChild(iframe);
console.log('APP未安装或链接错误')
redirectToStore(downloadLink);
};

// 设置超时以处理APP未安装的情况
timer = setTimeout(function () {
iframe.onerror();
}, 2000); // 2秒超时,可调整

iframe.src = appUrl;
document.body.appendChild(iframe);
}

// 前往对应的下载地址下载App(粗略分为ios和android,也可根据手机品牌判断)
function redirectToStore (downloadLink) {
const userAgent = navigator.userAgent.toLowerCase();
if (/(ipad|iphone|ipod)/.test(userAgent)) {
// iOS设备
window.location.href = downloadLink.ios;
} else if (/android/.test(userAgent)) {
// Android设备
window.location.href = downloadLink.android;
}
}
1
2
3
4
5
6
7
8
// 使用示例
const downloadLink={
ios: 'https://apps.apple.com/cn/app/id123456789',
android: 'https://play.google.com/store/apps/details?id=com.example.app'
}
const scheme = 'snssdk1128://aweme/detail/6814634004747193615';

openAppOrRedirect(scheme, downloadLink);

获取手机品牌

JavaScript可以通过解析navigator.userAgent字符串来获取关于用户设备的某些信息,包括手机品牌的线索。不过,这种方法并不完全可靠,因为用户代理字符串可以被修改,且不同厂商可能有不同的标识方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getMobileBrand () {
var userAgent = navigator.userAgent.toLowerCase();
if (/iphone/i.test(userAgent)) {
return 'Apple';
} else if (/huawei/i.test(userAgent) || /honor/i.test(userAgent)) {
return 'Huawei';
} else if (/oppo/i.test(userAgent) || /pacm00/i.test(userAgent)) {
return 'OPPO';
} else if (/vivo/i.test(userAgent)) {
return 'Vivo';
} else if (/mi\s/i.test(userAgent) || /redmi/i.test(userAgent) || /mix\s/i.test(userAgent)) {
return 'Xiaomi';
} else if (/sm-/i.test(userAgent)) {
return 'Samsung';
} else {
// 如果没有匹配到已知品牌,可能返回默认值或者具体分析userAgent来尝试识别更多品牌
return 'Unknown';
}
}