确定移动设备是否具有支持协议的应用程序

Determine if mobile device's has application that support a protocol

我有一个移动应用程序可以在用户之间发送 URL links。 接收用户应单击 link,以便移动设备使用 link 打开浏览器,然后启动我的应用程序,将 link 传递给它。

我通过向网页发送 link 来管理此操作,该网页使用我的应用程序协议重定向到 URL。

这样的 link 的一个例子是: ://www.myurl.com?一些数据

问题是如果接收用户没有安装我的应用程序,他会得到一个错误对话框。

我的 java-script 检测到这个问题并将用户重定向到下载页面,但我想避免在页面首次打开时出现 ugly 错误对话框。

有什么想法吗?

如果你需要提前知道(在实际重定向到一个hyperlink之前),如果一个移动设备有一个支持协议的应用程序,写下面的java-脚本代码在您的 link 定位的网页中:

var url="myAppName://www.myapp.com";
var request=new XMLHttpRequest();
if(request) {
    request.open("GET", url);
    if (request.status < 400) {
        try{
                    window.location.replace(url);
                }
                catch(e){
                    console.log(e);
                }

    }
    else {
        console.log('Failed to find application that supports '+url+' switching to manual download');
        window.location.replace("download.application.url");
    }

一些解释:

总体思路是向目标用户发送一个 link 到一个网页。该网页(包含上述 java-脚本)发出 ajax 调用以查看是否可以打开特殊协议 URL。如果 ajax 调用失败,浏览器 不会 显示错误对话框。相反,它悄悄地 returns 一个错误状态代码。 上面的代码检查 Ajax 的呼叫状态代码是否小于 400,以确保任何良好的响应都意味着移动应用程序 已安装

如果一切正常,浏览器打开移动应用程序,将 URL 作为参数传递,然后移动应用程序处理请求。

如果未安装移动应用程序,浏览器会收到错误状态代码(同样没有对话框)。浏览器会将用户重定向到应用程序的下载页面。

我试着用一个例子让事情更清楚
1. 假设我们有一个移动应用程序名称:mobileapp .
2. 假设用户想要发送一条文本消息,其中包含目标设备上的移动应用程序要执行的某些操作。为简单起见,对目标用户的命令是:dothis .
3. 假设应用程序的网站是 www.mobileapp.com .

消息中的 link 应该是这样的: *http://www.mobileapp.com?cmd=dothis*

当在目标移动设备上按下 link 时,将加载带有上述 java 脚本的网页。如果应用程序安装在目标移动设备上,浏览器将启动它,将 *myAppProtocol://www.myapp.com* 传递给它(您需要将此 URL 替换为您自己的)。

如果没有安装该应用程序,浏览器将重定向到该应用程序的下载页面(将download.application.url替换为您自己的。