为啥在 iPhone 里面点击 Quora 问答的链接会自动跳转到 Quora 客户端,而知乎 iPhone 客户端就不能这样,而是直接打开网页

关于原理,其他几位同学都解释的差不多了,在这我就说下为什么没有完整实现从 web 到 app 的跳转机制。如 @Bill Cheng 同学所说,其实 iPhone 里已实现了 scheme,现阶段完整的 scheme 如下:- zhihu://questions/\u0026lt;identifier\u0026gt;- zhihu://topics/\u0026lt;identifier\u0026gt;- zhihu://people/\u0026lt;identifier\u0026gt;但是,Mobile Safari 并没有提供接口用于「安静的」探测所处 iOS 是否支持某个 Scheme。所谓「安静的」,是说当通过 HTTP(或者 JS)强制跳转到自定义的 scheme,成功则罢,但若失败 Mobile Safari 会弹出 alert 告知地址非法。iOS 6 引入的 app banner 方式也不够安静,也没有回调可以用于进一步定制 web 的行为。现在的方案是大多是通过 JS 的延时方式(回到浏览器一段时候后仍会看到那个 alert),或者用户自行开关的方式来达到 web 到原生 app 的跳转,对用户来说还是存在困惑和打扰的,所以 iPhone 暂时没有跟进。另外,因为在 iOS 上原生 app 里可以「安静的」探测其它 app 的 scheme,所以你会发现在微信的内置浏览器里打开一些有原生 app 的 web 时,你会发现一些厂商给你留了跳到他家 app 的 link,那是因为微信先行探测到了你装了对应的 app 并且通过 url 传参告知了那家厂商。
■网友
首先告诉你实现原理实现方法就是传说中的iOS URL Scheme,具体到Quora这个例子上,Quora使用的Scheme是『quora://question/(0000000)』这种类型的现在在iOS上点击Quora的链接,你会看到一个页面,顶端写着『View In Quora App』,点击这个按钮就会执行Quora的自定义Scheme,然后系统会决定是跳转到App Store还是Quora的软件然后告诉你为什么没有这么做的App已经有一个自定义的URL Scheme了,那就是『zhihu://』,不过很奇怪并没有建立和问题相关的关联内容,这个Scheme现在仅且仅作为移动版页面顶部条调用App使用不过这个也不是一定得,说不定相关URL只是没有出现在的网页上而已,毕竟我不是开发人员……(估计还常年被开发鄙视……最后说一下页面如何判断是否安装软件这个也是通过URL Scheme来做的,具体可以参见苹果上次iOS 6发布时介绍的那个移动页面顶端展示Bar的代码,那货反正是可以检测时你否有安装软件的,不过能不能把这个信息反馈给服务器重生成页面就不知道了……========体内酒精含量:0.4%========希望这次不要被工程师鄙视……
■网友
确实是用scheme跳转。用JS做跳转。但,是在page loading完成以后,才去做跳转。如果没装应用的话,页面不会有动静,所以不存在判断装没装的问题。是在判断了是移动设备或者iPhone或者是什么来着,才加载这段脚本。 嗯,差不多就是这些。
■网友
研究过pinterest的写法,不知道quora怎么做的,但估计差不多。当系统内有pinterest应用时打开页面后,会跳转协议pinterest://这时候webkit发现自己没法处理这个协议,抛给系统,系统发现有注册过pinterest://这个协议,就调用对应的App并把协议后面的参数传进去。当没有Pinterest App怎么办呢?目前pinterest的做法是:跳转pinterest://协议,并设置计时器如果零点几秒内有返回,说明系统内没有注册这个scheme,就跳转http://到对应页面完成对应动作,如果在这零点几秒内没有返回,说明系统已经找到了这个协议并调用了对应app。至于说为什么iPhone客户端没这么干,我也不知道。


    推荐阅读