热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《启动应用程序(如果已安装)或重定向下载》经验,为你挑选了1个好方法。

在每个repo上,GitHub都有一个标记为"Clone in Desktop"的按钮(例如:https://github.com/github/developer.github.com).如果您安装了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的下载页面.我想在我的网站上做类似的事情:如果已安装,请打开我的应用程序,如果没有则重定向下载.如何才能最好地完成?



1> Alexander O'..:
GitHub是如何做到的?

在GitHub上的Mac客户端包括称为本地服务GitHub的管道,在后台运行.GitHub页面通过URL与此服务进行通信https://ghconduit.com:25035/status.

摘自GitHub Conduit帮助页面:

例如,Conduit位于Clone in Desktop存储库页面上的Open按钮和文件页面上的按钮之后.Conduit从浏览器中侦听有关GitHub for Mac操作的查询.要查看此操作,请访问https://ghconduit.com:25035/status.它应该看起来像这样:

{"capabilities":["status","unique_id","url-parameter-filepath"],"running":true,"server_version":"5"}

如果您正在运行GitHub Conduit服务,则页面上的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.
    }
});


研究代码:

以下代码是我的超级hacky和相当脆弱的Firefox和Safari代码.虽然它正在我的工作,我绝对不能保证它将按预期工作,或将继续在未来工作.它依赖于特定于浏览器的未定义行为,应该被视为不稳定.我也不知道这个代码在非OS X系统上会做什么.

火狐:

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

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!');
    });
});

苹果浏览器:

此代码依赖于在新选项卡中打开URL,如果无法识别URL,该选项卡win.location.hrefundefined在一秒钟之内(但可能更短的时间).不幸的是,如果无法打开协议,"没有应用程序设置打开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);
}

用法示例:

//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!');
    });
});


@StackOverflown当然可以!GitHub的代码没有什么特别之处,但我添加了一个基本的例子.我还添加了我的Firefox和Safari研究代码.
这似乎是答案.如果您将Javascript GitHub用于此和/或您的Firefox代码,即使只是为了学习,我也将不胜感激.谢谢!
推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 1.利用node实现页面实时更新,主要 ... [详细]
  • C++程序员视角下的Rust语言
    自上世纪80年代初问世以来,C就是一门非常重要的系统级编程语言。到目前为止,仍然在很多注重性能、实时性、偏硬件等领域发挥着重要的作用。C和C一样&#x ... [详细]
  • 从零开始系列之vue全家桶(2)安装调试插件vue Devtools
    小白安装前提是会用git,会从github上找东西。第一步:我们可以先从github上找到vue-devtools的项目,下载到本地。下载vue-devtools链接。克隆方法:git ... [详细]
  • 我有使用googledrivepdf的共享链接,我必须使用angular7下载pdf文件。我已经完成了自欺 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
author-avatar
mobiledu2502887683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有