Deep Link & URL Scheme & Universal Link

Deep Link & URL Scheme & Universal Link

Deep Link

在移动前端,deepLink一般指app内部的逻辑处理,可以根据这个deeplink直接跳转到对应的页面或者触发特定的逻辑,deeplink的目的是通过deep link打开app,并且跳转带app内某个页面,前提是该APP在该手机上已安装,且该APP需要编程支持该Deep Link的“schema”语法定义。

URL Scheme(Deep Link第一代实现方式)

URL Schemes其实就是实现deep linking的第一代解决方案。利用它就可以在移动开发中实现从web页面或者别的app中唤起自己的app的功能,然而开发者们很快就发现,这样也还有很多限制:

  • Custom URL scheme 是自定义的协议,所以在没有安装 app 的情况下是无法直接打开的。

    在app内开启其他app的scheme之前,通过canOpenURL判断是否安装app,来决定是否可以跳转,但是需要先检查这个scheme是否注册了,即在info.plist文件的LSApplication

    QueriesScheme中记录要询问的scheme,否则通过canOpenURL得到的结果是false。

  • 因为这个scheme是自己定义的,容易冲突。

    例如,自己的名为A的app定义的url scheme为a://,但如果用户手机没有装名为A的app,而装了名为B的app,但是B也定义了a://,那么通过a://打开的app就是B,而不是A,也就是冲突了

因此为了解决以上问题,苹果推出了Universal Link方案,但是,iOS在很长的一段时间内用来实现deep linking以及app间通信的方法就是上面提到的,被叫做custom URL scheme。处理的方法就是:

  1. 注册一个URL type,注册的方法就是在app的info.plist文件里添加 CFBundleURLTypes 键,它包含了一个由多个字典组成的数组,每一个字典定义了这个app支持的一个URL scheme,其他app即可通过这个URL scheme打开自己的app。

  2. application:willFinishLaunchingWithOptions:方法或者application:didFinishLaunchingWithOptions:方法中获取URL的相关信息,并决定是否要打开它,一般客户端会根据自己的业务需求建立白名单,不再白名单内的链接不允许打开。

  3. 如果在白名单内,实现app delegate方法:application:openURL:sourceApplication:annotation:(ios 9之前)或者application:openURL:options:(ios9之后) ,获取需要的信息,处理url链接,打开相应页面)。

Universal Link(Deep Link第二代实现方式)

一、概述

Universal Link可以让网站或者web view中的内容在用户点击跳转或安装了app之后仍然能够直接在这个app中被找到。比如,用户在官网上点击了“在app中浏览该商品”的链接,这个时候就可以通过Universal Link去唤起这个app,同时直接定位到该商品页面。

二、使用

  • 在支持HTTPS的服务器根目录下上传apple-app-site-association文件。

  • 在xcode的工程内Capabilities栏中找到Associated Domains,在里面添加以applinks:为前缀的域

  • 实现delegate方法application:continueUserActivity:restorationHandler:处理universal link的链接,通过该方法可以获取NSUserActivity对象,从该对象获取NSUserActivityTypeBrowsingWeb的activityType,这个对象的webpageURL属性中的URL就是用户正在访问的URL地址

    注意:当APP在设备上第一次运行时,若已开启Associated Domains功能,那么iOS会自动去获取Domain下的apple-app-site-association文件,iOS会先请求https://domain.com/.well-known/apple-app-site-association 。若此文件请求不到,再去请求https://domain.com/apple-app-site-association 。所以若想要避免服务器接收过多GET请求,可直接把apple-app-site-association放在./well-known/目录下。服务器上apple-app-site-association的更新不会让iOS本地的apple-app-site-association同步更新,即iOS只会在APP第一次启动时请求一次,以后除非APP更新或重新安装否则不会在每次打开时请求apple-app-site-association。

三、优缺点

(1)优点

1、Universal Links本身也就是一个能够指向一个web页面或者app中的内容页的标准的web link(形如https://example.com) ,当已经安装了这个app的时候,不需要加载任何web页面,app就会立即启动;当这个app没有安装的时候,就会默认地从当前浏览器中重定向到App Store中引导用户去下载安装这个app。而且,Universal links支持从其他app中的UIWebView中跳转到目标app

2、Universal links是从服务器上查询是哪个app需要被打开,因此不存在Custom URL scheme那样名字被抢占、冲突的情况。

3、安全性,用universl link去打开的时候,只有你(开发这个app的人)可以通过创建和上传一个允许这个网页去通过这个URL去打开你的app的文件。

4、隐私性,提供Universal link给别的app进行app间的交流,然而对方并不能够用这个方法去检测你的app是否被安装。(之前的custom scheme URL的canOpenURL方法可以)

(2)缺点

如果用户手机上没有安裝 APP,那么使用ULink只能打开网页,而不能引导用户前往 App Store 下载。所以有些网页处理方案是在载入的時候,會运行一段 javascript ,然后通过timer 计时,如果在特定时间內无法开启 App,就前往 App Store 下载。

deferred Deep Linking

deferred deep linking 是指用户打开一个 web page 的时候并没有安装对应的 app,希望用户在安装 app 以后可以 deep link 到对应内容

https://juejin.im/post/59e2cdbef265da43200245a0

你可能感兴趣的:(iOS开发中问题)