Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 启动应用程序(如果已安装)或重定向至下载_Javascript_Macos_Github_Href_Url Scheme - Fatal编程技术网

Javascript 启动应用程序(如果已安装)或重定向至下载

Javascript 启动应用程序(如果已安装)或重定向至下载,javascript,macos,github,href,url-scheme,Javascript,Macos,Github,Href,Url Scheme,在每个repo上,GitHub都有一个标记为“Clone in Desktop”(示例:)的按钮。如果已安装GitHub for Mac,则href类似于: github-mac://openRepo/https://github.com/github/developer.github.com 这将打开GitHub for Mac并提供克隆回购协议的功能。如果没有,则href为: http://mac.github.io` 这是GitHub for Mac的下载页面。我想在我的网站上做一些类

在每个repo上,GitHub都有一个标记为“Clone in Desktop”(示例:)的按钮。如果已安装GitHub for Mac,则
href
类似于:

github-mac://openRepo/https://github.com/github/developer.github.com
这将打开GitHub for Mac并提供克隆回购协议的功能。如果没有,则
href
为:

http://mac.github.io`

这是GitHub for Mac的下载页面。我想在我的网站上做一些类似的事情:如果安装了,打开我的应用程序,如果没有,重定向到下载。如何才能最好地实现这一点?

这可以通过Javascript或PHP实现

对于Javascript,有一个很酷的库is.js,可用于环境检查。请看这里:

您只需在HTML中创建一个div,然后根据诸如:is_windows()或!是(windows)

您也可以使用PHP。为此,您可以使用此问题第一个答案中的代码:


现在,基于getOS()和/或getBrowser函数的返回,您可以向用户呈现不同的内容。。。这是一个简单的if-else块代码:)

享受吧

GitHub是如何做到的? 客户端包括一个名为的本地服务,该服务在后台运行。GitHub页面通过URL
https://ghconduit.com:25035/status

摘自: 例如,导管位于存储库页面上的
Clone in Desktop
按钮和文件页面上的
Open
按钮的后面。导管侦听来自浏览器的有关GitHub的Mac操作的查询。要了解这一点,请访问。它应该是这样的:

如果您运行了GitHub管道服务,页面上的JavaScript将从该URL获取数据,并为“桌面克隆”按钮提供一个
GitHub mac://
URL。否则,URL将返回404响应,并假设您没有安装GitHub for Mac,并提供下载链接


如何实现这样的功能? 不幸的是,在浏览器中没有JavaScript API来执行此操作。浏览器无法识别的协议由操作系统本身处理。我尽了最大努力,但我只能为Mac上的Firefox开发出一个体面的JavaScript专用解决方案,为Safari开发出一个丑陋的半生不熟的解决方案。这两种黑客都依赖于未定义的行为,并且都不适用于Chrome。你可以在下面看到我的研究代码

如果你想用GitHub的方式来做,你必须创建一个本地HTTP服务器,它作为一个服务在你的用户机器上的一个已知端口上运行。然后,您可以使用JavaScript连接到它并检索有关已安装应用程序的信息。这样做并不是一件小事,除非它提供了一些惊人的功能,否则我建议不要这样做

不过,实现这一点的JavaScript代码相当简单。假设您返回适当的CORS头,您只需发出一个简单的AJAX请求。下面是一个基于jQuery的示例

$.ajax({
    url: 'http://127.0.0.1:1337',
    dataType: 'json',
    success: function(jqXHR) {
        //Replace links to app protocol URLs.
    }
});

研究代码: 下面的代码是我为Firefox和Safari编写的超级黑客且相当脆弱的代码。虽然它在我这方面发挥作用,但我绝对不能保证它会如预期的那样发挥作用,或者在未来继续发挥作用。它依赖于特定于浏览器的未定义行为,应该被认为是不稳定的。我也不知道这段代码在非OSX系统上会做什么

火狐: 此代码依赖于在iframe中打开链接,当无法识别协议时,该链接将触发错误(成功后,它将正常打开URL)

用法示例:
游猎: 此代码依赖于在新选项卡中打开URL,如果无法识别URL,则该选项卡的
win.location.href
将在
未定义的
之前的一秒钟内(但时间可能更短)。如果未能打开协议,则“没有用于打开URL的应用程序集”对话框仍将打开

function openAppSafari(url, failure) {
    var win = window.open(url);
        var done = function(failed) {
            win.close();
            clearInterval(checkFail);
            clearTimeout(giveup);
            if (failed) {
                failure();
            }
        };
        //Chck for failure.
        var checkFail = setInterval(function() {
        //In Safari, location.href becomes undefined on failure.
        if (!win.location.href) {
            done(true);
        }
    });
    //After a second, assume success.
    var giveup = setTimeout(function() {
        done(false);
    }, 1000);
}
用法示例:
我真的不认为这是OP想要的。他问的是如何检测浏览器是否会打开特定于应用程序的协议,如
github mac://
,而不是浏览器正在查看的协议。可能重复@atastrumf,这是类似的,但我相信它不是重复的。这似乎是答案。如果您为这个和/或您的Firefox代码提供JavaScriptGithub使用,即使只是为了学习,我也会非常感激。谢谢大家!@当然!GitHub的代码没有什么特别之处,但我添加了一个基本示例。我还添加了我的Firefox和Safari研究代码。
$.ajax({
    url: 'http://127.0.0.1:1337',
    dataType: 'json',
    success: function(jqXHR) {
        //Replace links to app protocol URLs.
    }
});
function openAppFirefox(url, failure) {
    var iframe = document.createElement('iframe');
    //Firefox will fire an error if protocol fails to open.
    iframe.onerror = function() {
        failure();
    };
    //Hide the iframe.
    iframe.style.width = 0;
    iframe.style.height = 0;
    iframe.style.visibility = "hidden";
    iframe.style.position = "fixed";
    //Load the URL.
    iframe.src = url;
    document.body.appendChild(iframe);
    //Clean up the iframe.
    setTimeout(function() {
        document.body.removeChild(iframe);
    }, 1000);
}
//Will work.
//var url = 'itmss://itunes.apple.com/us/app/stack-exchange/id871299723';
//Will fail.
var url = 'wat://bummer';
someElment.addEventListener('click', function() {
    openAppFirefox(url, function() {
        alert('Download my app!');
    });
});
function openAppSafari(url, failure) {
    var win = window.open(url);
        var done = function(failed) {
            win.close();
            clearInterval(checkFail);
            clearTimeout(giveup);
            if (failed) {
                failure();
            }
        };
        //Chck for failure.
        var checkFail = setInterval(function() {
        //In Safari, location.href becomes undefined on failure.
        if (!win.location.href) {
            done(true);
        }
    });
    //After a second, assume success.
    var giveup = setTimeout(function() {
        done(false);
    }, 1000);
}
//Will work.
//var url = 'itmss://itunes.apple.com/us/app/stack-exchange/id871299723';
//Will fail.
var url = 'wat://bummer';
someElment.addEventListener('click', function() {
    openAppSafari(url, function() {
        alert('Download my app!');
    });
});