URL scheme

scheme 是一种页面之间跳转的协议,不仅可以用于app之间进行跳转,还可以用于 H5 页面跳转到app页面。

无论Android还是IOS,都可以通过在H5页面中打开 scheme 协议的地址,从而打开本地app。

URL Schemes 有两个单词:

  • URL, http://www.apple.com 就是个 URL,我们也叫它链接或网址;
  • Schemes,表示的是一个 URL 中的一个位置——最初始的位置,即 :// 之前的那段字符。比如 https://www.apple.com 这个网址的 Schemes https

你可以完全按照理解一个网页的 URL也就是它的网址的方式来理解一个 手机应用的 URL,拿苹果的网站和 微信APP来做个简单对比:

网页(苹果官网) 应用(微信APP)
网站首页/打开应用 <https://www.apple.com> weixin://
子页面/具体功能 https://www.apple.com/mac/ (Mac页面) weixin://dl/moments(朋友圈)

scheme 协议定义和 http 协议类似,都是标准的 URI 结构。

[scheme:][//host:port][path][?query][#fragment]
  • scheme : 协议名称 - 必须
  • host : 协议地址 - 必须
  • port : 协议的端口,可以不填
  • path : 协议路径,可用 / 连接多个
  • query : 携带的参数可用 & 连接多个
  • fragment : 锚点

Example:

wexin://tencent.com:8080/dl/news/open?data=902323&params=test
  • weixin : 协议名称
  • tencent.com : 域名
  • 8080 : 端口
  • /dl/news/open : 页面的路径
  • data, params : 传递的参数

示例URI及其组成部分。

          userinfo     host        port
          ┌─┴────┐ ┌────┴────────┐ ┌┴┐ 
  https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top
  └─┬─┘ └───────┬────────────────────┘└─┬─────────────┘└──┬───────────────────────┘└┬─┘  
  scheme     authority                 path              query                      fragment
  ldap://[2001:db8::7]/c=GB?objectClass?one
  └─┬┘ └───────┬─────┘└─┬─┘ └──────┬──────┘
 scheme    authority  path       query
  mailto:John.Doe@example.com
  └──┬─┘ └─────────┬────────┘
  scheme         path
  news:comp.infosystems.www.servers.unix
  └─┬┘ └───────────────┬───────────────┘
 scheme              path
  tel:+1-816-555-1212
  └┬┘ └──────┬──────┘
scheme     path
  telnet://192.0.2.16:80/
  └──┬─┘ └──────┬──────┘│
  scheme    authority  path
  urn:oasis:names:specification:docbook:dtd:xml:4.1.2
  └┬┘ └──────────────────────┬──────────────────────┘
scheme                     path

各类URL Schemes

  1. 基本 URL Schemes,是指一个 URL 的 Schemes 部分,比如上文提到的微信的。这个部分的唯一功能,就是打开相应应用,而不能够跳转到任何功能。

    weixin://
    
  2. 复杂 URL Schemes 有两种:一种是直接打开某个应用的某个功能,另一种是打开某个功能后直接填写预设的字符

    http://images.google.com/images?q=关键字
    
  3. 变形 URL Schemes 是指一些应用利用了 URL Schemes 的规则和 系统的一些内置功能,来拓充复杂 URL Schemes,并使其中需要输入字符或参数的部分可以预设或输入后再跳转,进一步减少步骤。

    OmniFocus:///add?name=任务名&note=备注
    
  4. x-callback-URL

    如果我们还想让应用根据不同的结果有对应的反应,就要用到 x-callback-URL。比如当上一个 URL Schemes 运行成功以后,我是要回到跳转前的应用?还是要接另一个动作(接上另一段 URL Schemes,打开另一个应用的某个功能)?无论是跳转回上个应用还是打开另一个动作,只要你在运行完一个 URL Schemes 后还想再利用一段新的 URL Schemes 做下一件事,就要靠 x-callback-URL,它的固定语法是:

  • 在一个 URL Schemes 后面接&x-success,表示前一个 URL 成功以后下一步做什么;
  • 在一个 URL Schemes 后面接&x-error,表示前一个 URL 失败以后下一步做什么;
  • 在一个 URL Schemes 后面接&x-cancel,表示取消前一个 URL 的操作结果后下一步做什么;
  • 还有一个 &x-source 我们遇到了再说。

URL 编码(Encode)

URL中的参数如果包含特殊字符,需要预先进行url编码,否则的话URL可能不能打开。

URL 中的字符可以分为两类,一部分可以在链接中正常显示,比如字母、数字还有/等一部分符号。除此之外,全部不能正常显示,需要进行编码才能够作为 URL 的一部分出现。比如空格,在 URL 中就必须表示为 %20转换的规则不用深究,网上有很多工具(比如 FeHelper提供 URL 的编码和解码功能,可以把编码过的乱七八糟的 URL 解码为我们看得清爽的字符:

Hi%2C+%E6%88%91%E6%98%AF+%40JailbreakHum` 转换为 `Hi, 我是 @JailbreakHum

这些工具当然也可以反过来把我们常用的字符转换成可以在 URL 中使用的字符。

所以理论上,所有 URL 不支持的字符,都要编码。编码的任务也就是这么简单,把 URL 不支持的字符换位它支持的字符。既然如此,为什么有的时候不用编码?因为那些不用编码的时候,是 App 私下替你编了。

如何查找URL

其中,基本 URL Schemes 是可以由你自己手动查询的,所有支持基本 URL Schemes 的 App 都可以用以下方法查到其基本 URL Schemes。而其它几种 URL Schemes 因为是写进代码中的,需要查询各 App 的文档,来参照例子根据自己的需求制作 URL。

查找基本 URL Schemes

  1. IOS: 基本 URL Schemes 的查找方法可以通过 App 中的 info.plist 来查询
  2. AOS: 在AndroidManifest.xml文件中查找

复杂 / 变形 / x-callback-URL

若想全知全能,唯有查询文档。

复杂 / 变形 / x-callback-URL 这三种类型的 URL Schemes 是写入代码中的,无法通过查询 .plist 文件来获取。但支持这三种 URL Schemes 的 App 的开发者将这些功能加入到自己 App 中一般是希望用户使用的,所以针对那些希望用户使用的功能都会专门写文档来告诉读者如何使用它们。

如果你想搜索任何一个 App 的复杂 / 变形 / x-callback-URL,你只要搜 App 名 URL Schemes,一般就能找到该 App 的 URL Schemes 文档页面。同时,直接去这些 App 的官网查找相关网页也可以。

Universal Link(通用链接)

IOS9+支持通用链接,IOS用户可以点击指向您网站的链接,无需通过Safari即可无缝地重定向到已安装的应用。如果您的应用未安装,点击指向您网站的链接即可在Safari中打开您的网站。

通用链接为您提供了使用自定义URL方案时无法获得的几个主要优势。具体而言,通用链接是:

  • 独特。与自定义网址方案不同,其他应用无法声明通用链接,因为它们使用指向您网站的标准HTTP或HTTPS链接。
  • 安全。当用户安装您的应用时,IOS会检查您上传到网络服务器的文件,以确保您的网站允许您的应用代表其打开网址。只有您可以创建并上传此文件,因此您的网站与应用的关联是安全的。
  • 灵活。即使您的应用未安装,通用链接也能正常工作。未安装您的应用时,点按指向您网站的链接会在用户期望的Safari中打开内容。
  • 简单。一个URL适用于您的网站和您的应用。
  • 私人的。其他应用可以与您的应用进行通信,而无需知道您的应用是否已安装。

Android不支持Universal Link。

H5打开APP的流程

  1. AOS中,由于不支持统一通用链接使用scheme,如果系统有安装应用则打开应用,否则无反应。
  2. IOS9+中,应用有通用链接的,则使用通用链接,如果系统有安装(系统自动识别)应用则打开应用,否则打开网页; 没有通用链接的以及不支持通用链接的IOS,则与AOS一致;

如何检测系统是否安装相应的应用?

关于这个H5并不能做到。

在不知道系统是否安装相应的应用的情况下如何实现上面的场景呢?

1、通过设置延时,浏览器尝试打开URL scheme并记录时间点t1,在2秒计时后,检查当前时间t2,如果t2-t1 > 2200ms,说明唤起app成功(唤起app会是浏览器的定时器延后执行),如果t2-t1 < 2200ms,可能没有安装app,可以引导用户进入下载页(IOS直接跳转APP Store, 如itms-apps://itunes.apple.com/cn/app/id477927812)或者直接跳转与应用功能对应的web页面

function openWithApp(){
    var openTime = Date.now(),
	timer = null,
	appLink = "twitter://messages/compose?text=hello",
    webLink = "https://twitter.com/messages/compose?text=hello",
	appDownloadURL = "you app download page",
	window.location.href = appLink;
	timer = setTimeout(function () {
	        if (Date.now() - openTime < 2200) {//加了200ms基准误差
	            window.location.href = appDownloadURL;
	        }else{
	            clearTimeout(timer);
	}, 2000);

2、在浏览器实际上是没有能力判断手机里是否安装了某个App的,所以只能够采取一种投机取巧的方式。

在JavaScript中判断页面是否进入后台来判断打开成功。Html5提供了下列事件和属性可以利用:

  • pagehide : 页面隐藏时触发

  • visibilitychange : 页面隐藏没有在当前显示时触发(切换tab也会触发该事件)

  • document.hidden : 当页面隐藏时,该值为true,显示时为false

上面这些事件或者属性并不是所有浏览器都支持。下面是一个给出为id为openBtn 的按钮添加打开scheme或者下载事件的例子,但对于Android 4.4版本以下则不支持

function openWithApp(id) {
    var scheme = "fb://", // 需要打开的app scheme 地址
        iosDownloadURL = "https://www.baidu.com", // 如果打开scheme失效的app下载地址
        aosDownloadURL = "https://www.baidu.com",
        ua = navigator.userAgent,
        isIOS = !!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
        isAOS = ua.indexOf("Android") > -1 || ua.indexOf("linus") > -1,
        localDoc = document,
        localLocation = window.location,
        downloadTimer;
    // 尝试打开 scheme
    localLocation.href = scheme;
    // 设置3秒的定时下载任务,3秒之后下载app
    downloadTimer = setTimeout(function () {
        if (isAOS) {
            localLocation.href = aosDownloadURL;
        } else if (isIOS) {
            localLocation.href = iosDownloadURL;
    }, 3000);
    localDoc.addEventListener("visibilitychange webkitvisibilitychange", function () {
        // 如果页面隐藏,推测打开scheme成功,清除下载任务
        if (localDoc.hidden || localDoc.webkitHidden) {
            clearTimeout(downloadTimer);
    });
    window.addEventListener("pagehide", function () {
        clearTimeout(downloadTimer);
    });

有些APP在微信中为什么无法唤醒,需要“用浏览器打开”?

微信浏览器使用你自己APP的 url scheme 满足两个条件

  1. 使用腾讯开放平台的微下载服务,

    在微信浏览器中使用应用宝的微下载,将当前页面重定向到应用宝的下载页面

  2. 该应用在平台必须是S级应用

    将你的APP的Scheme添加到微信官方的白名单中

  3. 如果不符合以上两个条件,只有引导用户用其他浏览器打开

PS:对于下载apk这种,微信是屏蔽任何应用的,所以你想提供下载链接,都逃不过使用浏览器打开之中low的方式了.

  1. https://blog.csdn.net/u013517637/article/details/55251421
  2. https://www.jb51.net/html5/591158.html
  3. https://sspai.com/post/31500
  4. https://en.wikipedia.org/wiki/Uniform_Resource_Identifier
  5. https://www.jianshu.com/p/0ead88409212

附录:常见应用的URL Scheme

1、记录使用过的URL Scheme

名称URL Scheme对应的普通链接
Twitter发消息twitter://messages/compose?text=[yourText]https://twitter.com/messages/compose?text=[yourText]
Twitter发动态twitter://intent/tweet?text=[yourText]https://twitter.com/intent/tweet?text=[yourText]
打开Emailmailto:?body=[yourText]
给某人发Emailmailto:[emailAddress]?body=[yourText]
发短信SMSsms:body=hello(AOS)sms:&body=hello(IOS)
whatsapp发消息whatsapp://send?text=[yourText]
fbmessenger发消息(分享链接)fb-messenger://share/?link=[yourShareURL]https://www.facebook.com/dialog/send?display=popup&app_id=[yourAppID]&link=[yourShareURL]&redirect_uri=[yourShareURL]
fbmessenger发消息(指定对象)fb-messenger://m.me/[yourPageID](通用) fb-messenger-public://user-thread/[yourPageID](IOS)https://www.messenger.com/t/[yourPageID] / https://m.me/[yourPageID]
fb打开相关主页fb://page/[yourPageID]https://www.facebook.com/[yourPageID]
Amazon打开产品详情页com.amazon.mobile.shopping://www.amazon.com/dp/[yourAsin]https://www.amazon.com/dp/[yourAsin]
打开App Store中应用详情页itms-apps://itunes.apple.com/cn/app/[yourAppID]https://itunes.apple.com/cn/app/[yourAppID]
打电话tel:[telephoneNumber]

2、系统默认应用

名称URL SchemeBundle identifier
Safarihttp://
mapshttp://maps.google.com
Phonetel://
SMSsms://
Mailmailto://
iBooksibooks://
App Storeitms-apps://itunes.apple.com
Musicmusic://
Videosvideos://

3、常用第三方软件

名称URL SchemeBundle identifier
QQmqq://
微信weixin://
腾讯微博TencentWeibo://
淘宝taobao://
支付宝alipay://
微博sinaweibo://
weico微博weico://
QQ浏览器mqqbrowser://com.tencent.mttlite
uc浏览器dolphin://com.dolphin.browser.iphone.chinese
欧朋浏览器ohttp://com.oupeng.mini
搜狗浏览器SogouMSE://com.sogou.SogouExplorerMobile
百度地图baidumap://com.baidu.map
Chromegooglechrome://
优酷youku://
京东openapp.jdmoble://
人人renren://
美团imeituan://
1号店wccbyihaodian://
我查查wcc://
有道词典yddictproapp://
知乎zhihu://
点评dianping://
微盘sinavdisk://
豆瓣fmdoubanradio://
网易公开课ntesopen://
名片全能王camcard://
QQ音乐qqmusic://
腾讯视频tenvideo://
豆瓣电影doubanmovie://
网易云音乐orpheus://
网易新闻newsapp://
网易应用apper://
网易彩票ntescaipiao://
有道云笔记youdaonote://
多看duokan-reader://
全国空气质量指数dirtybeijing://
百度音乐baidumusic://
下厨房xcfapp://

PS: 更多URL Scheme可在下列链接中查找

  1. https://st3376519.huoban.com/share/1985010/VGi2N5Vf0C1MVnHCVWiBc8L9g15c9VGJbMGcFrb6/172707/list
  2. https://blog.csdn.net/dengchuanjiang/article/details/52554021
  3. https://blog.csdn.net/samuelltk/article/details/42290523
  4. https://mp.weixin.qq.com/s/p2-Fpua6tysgOZOml5Ywfw
Patientorienteddecision-makinginmedicaldomainscanenhancetheefficiencyofthemodernhealthcare recommender system provided the data scattered across different geographical regions is collected, mined and analyzed efficiently. Different sites, having Arbitrary Distributed Data (ADD) of healthcare services at various nodes can collaborate with each other to generate customer’s preference leading to mutualadvantageandovercomingoftheissuesrelatedtoinsufficientratingsofvariousmedicalservices. However,duetoprivacy,financialandlegalissues,differentpartiesdeferfromsharingtheirconfidential data. If the parties are assured of data confidentiality, they might agree for fruitful collaboration. Few existingstudiesproposedPrivacyPreservingCollaborativeFiltering(PPCF)onADD,butthesetechniques consideredonlytwoparties.Moreover,thecomputationcostofoff-linemodelgenerationprocessishigh since these techniques use homomorphic encryption techniques. To fill these gaps, this paper propose PPCF scheme on ADD based on multi-party random masking and polynomial aggregation techniques. In the proposal, two phases are considered namely as: off-line model generation and online prediction generation. Three protocols have been considered for privacy preservation so that analysis of each protocol is performed separately. The Paillier homomorphic encryption system is also used to calculate the length of vector X securely, so that only additive property of homomorphic encryption is used. Analysis of the proposed scheme has been done for security, accuracy, coverage and performance on healthcareandMovieslensdatasets.Ithasbeenexperimentallydemonstratedthattheproposedscheme maintains data owner’s confidentiality, and privacy measure so that it does not affect the accuracy of prediction generation on integrated data. Comparative analysis of the proposed scheme has also been done with other related schemes based on off-line and online computation overheads. The results obtaineddemonstratedthattheproposedschemehassignificantimprovementbyafactorof36%(approx) withrespecttotheaforementionedparameters. 该插件为 1.x默认主题增加了对 -color-scheme的支持。 yarn add vuepress-theme-default-prefers-color-scheme npm i vuepress-theme-default-prefers-color-scheme // .vuepress -> config.js module . exports = { theme : 'default-prefers-color-scheme' overlayTheme(可选) 强迫用户进入特定主题,而忽略 。 H5跳转微信小程序,通过AccessToken获取URL Scheme,在vue页面通过location.href实现短信,微信,邮件,外部链接等方式跳转小程序,实现链接跳转小程序并传参 Linux 上的 SublimeText URL 处理程序(基于 Ubuntu) 启用 SublimeText 以打开 URL Scheme subl:// 和 txmt:// ,如下所示: subl://open/?url=file:///etc/passwd&line=10&column=2 解压,然后: cd sublime-url-handler-master bash install 在浏览器上打开一个新选项卡并输入:subl://open/?url=file:///etc/hosts 蒂埃里 G. 为他的。 通过这样的链接启动您的应用程序: mycoolapp:// -此Apache Cordova问题导致Cordova-iOS 3.7.0出现问题:冷启动时未调用handleOpenURL函数。 使用高于或低于3.7.0的版本。 -从iOS 9.2开始,对话框Open in "mycoolapp"? 不再阻止JS,因此,如果您在打开应用商店时有短暂的超时,则用户将被带到商店,然后他们才有机会查看和回答该对话框。 请参阅下面的可用解决方案。 此插件可让您通过使用mycoolapp://path?foo=bar类的URL调用应用程序来启动您的应用程序 与Cordova Plugman兼容 在PhoneGap Build上提交并等待批准(更多信息) iOS细节 不用使用config.xml定义URL方案。 该插件增加 在 h5 页面上唤醒app ,需要用到 scheme协议(由app端提供),但是在微信浏览器里scheme不起作用,因此需要先判断是否为微信浏览器,是微信浏览器的话,提示到浏览器打开,不是的话,再判断是Android端还是iOS端,然后尝试scheme协议唤醒app,如果唤醒失败再转向应用市场。 URL Scheme协议 URL Scheme是一种页面内跳转协议,通过这个协议可以比 判断 是否安装 app 移动端是ios、或者Android项目需求上方红框标记位置,APP内分享出去的文章那里要一个提示打开APP阅读内容的功能,点击之后跳转到APP该页面,没有提示下载主要目的是分享出去的文章/视频 h5页面 识别 是安卓还是 ios然后查看是否已经安装该app了 是就启动该app 否则就跳到下载地址第一点判断 移动端是ios、或者Androidvaru=navigat... 2.根据微信开放平台文档,按照步骤来。 在浏览器中打开 https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state... 一、网页启动APP由于安全隐私的原因,目前网页端无法通过js脚本直接判断某个APP是否已安装,只能首先通过js尝试性的启动app,然后再进入安装流程。web网页上启动app的方式有两种:1. schemaandroid与ios均支持自定义schema,通过访问自定义schema的url即可启动对应的app,如weixin://dl/scan这个url,这里的weixin就是自定义的schema。j... 工作可能有这样的需求,就是手机浏览器中加载一个h5页面,点击可以打开某一个APP,比如微信等。这时候通常都是采用URL Scheme的方式进行配置跳转。 那么什么是URL Scheme呢? 简单说:它是一个页面跳转协议。 2、 URL Scheme协议 URL Scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通... 今天接到需求!!!想要从浏览器,QQ等场景,用H5链接打开微信小程序!!! 如何实现的,一番查阅后,让我带你实现吧! ps:适用于非个人主体,微信内部的浏览器好像不行,你们自己试试。 1、首先登录微信小程序后台: 微信小程序后台→工具→微信生成小程序URL Scheme,根据你的需要填写,启动query参数可为空; 2、生成后会获得一个链接 weixin://dl/news/?t=xxxxxxx 3、然后创建demo.html文件,建立页面,把weixin链接改成你上面得到的链接 <!DOCTYPE