文章目录

  • Custom URL Scheme
  • Universal Link
  • 如何建立App与Website间的联系?
  • 如何阻止跳转?



App间跳转常见场景如第三方登录,例如饿了么使用支付宝登录,我们需要从饿了么App跳转至支付宝App进行授权。


常用的实现App间跳转方式有以下两种:

Custom URL Scheme

自定义URL Scheme提供了一种引用应用内资源的方法,我们可以通过访问对应URL启动App并展示特定的内容。
该URL必须以自定义的Scheme开头,如需要打开微信:weixin://...,若在自己的App内定义了Scheme为test,则可通过test://来打开App。在Scheme可以添加需要的参数,在App中通过解析参数来打开特定的内容。完整的URL可能如下:

tel://10086

我们在App内怎么打开指定的URL呢?
通过以下方法:

[[UIApplication sharedApplication] openURL:<#(nonnull NSURL *)#> options:<#(nonnull NSDictionary<UIApplicationOpenExternalURLOptionsKey,id> *)#> completionHandler:<#^(BOOL success)completion#>];

同时,如果我们需要从A跳到B,需要在A的配置白名单中加入B才能实现跳转:
在A的Info.plist文件中加入LSApplicationQueriesSchemes字段,指定为数组类型,加入B的URL Schemes。
要实现跳转还涉及到两个问题:在App中如何自定义URL Scheme?如何解析参数?

  1. 自定义URL Schemes

    Apple并不强制多个App的URL Schemes的必须保持唯一性,因此我们可以通过设置标识符identifier来区分相同URL Schemes的两个App。但这也并不能确保唯一性。
  2. 参数解析
    当其他App打开一个URL包含你自定义的URL Schemes,系统将会运行你的App,通过调用AppDelegate中实现的如下方法将URL传递到你的App中。
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options API_AVAILABLE(ios(9.0));

Apple并不推荐将Custom URL Schemes作为深层链接的最佳实践。

  1. URL Schemes + identifier并不能确保不与其他App重复。(即你打开的可能不是时你想打开的App);
Universal Link

Universal Link通用链接是指Scheme为http、https等通用Schemes的URL。
使用Universal Link前提条件:

  • 一个可正常访问的站点;
  • 建立App与Website间的联系。
如何建立App与Website间的联系?
  1. App关联网站域名
    在工程中配置targets->Capabilites->Associated Domains
  2. iOS 支付宝 接入 ios支付宝url_App

  3. 如图在Domain填入applinks:域名
  4. 网站Server端配置
    创建一个名为apple-app-site-association(无后缀名)的文件,内容如下:
{
  "applinks": {
      "apps": [],
      "details": [
           {
             "appID": "ABCDE12345.com.example.app",
             "paths": [ "/buy/*", "NOT /help/website/*", "/help/*" ]
           }
           {
             "appID": "ABCDE12345.com.example.app2",
             "paths": [ "/buy/*", "NOT /help/website/*", "/help/*" ]
           }
       ]
   }
}

appID:组成方式是TeamID.BundleID。如上面的ABCDE12345就是teamId。登陆开发者中心,在Account -> Membership里面可以找到Team ID;
paths:设定你的app支持的路径列表,只有这些指定路径的链接,才能被app所处理。*的写法代表了可识别域名下所有链接。

内容完善后,将该文件保存到网站可访问的根目录下的.well-known目录中,如:
https://example.com/.well-known/apple-app-site-association 可通过该链接验证我们的apple-app-site-association文件的合法有效性。

当我们新安装App首次打开时,会从站点拉去apple-app-site-association文件,已完成App与域名的关联。应用程序成功与域关联后,它将保持关联状态,直到从设备中删除该应用程序为止。 在开发期间,每次更新关联文件需要立即查看所做的更改时,从测试设备中删除您的应用程序再次安装。

当完成App与域名的关联,当从其他App打开该网站时,根据apple-app-site-association中配置判断是否可以完成跳转,如果可以将跳转至关联的App。

当通过Universal Link触发系统打开你的App时,AppDelegate将会接受到如下消息,其中包括一个NSUserActivity对象,该对象activityType属性值为NSUserActivityTypeBrowsingWeb,webpageURL属性值为对应的URL。

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler API_AVAILABLE(ios(8.0));

可在该方法中处理具体的跳转动作。

使用Universal Link时需注意:

  • 跨域问题,App跳转必须跨域,点击跳转的链接与当前所在页面的链接不跨域则不能完成跳转到对应App;
  • Server端更新apple-app-site-association,不会触发客户端重新拉去,客户端的拉去只在新安装App进行一次。

与Custom URL Scheme对比:

  • 与自定义Scheme不同,通用链接的跳转是利用一个http/https的链接,如果设备上没有对应的App,亦可在网页端进行浏览,便于兼容。
  • 由于域名是唯一的,与该域名关联的App也由域名持有方决定,因此不存在自定义Scheme那样存在冲突,冒名顶替的现象。
如何阻止跳转?

为防止因为跳转至其他App进而降低了用户在线时长,阻止App间跳转的方法(阻止A -> B跳转):

  • Custom URL Scheme : 在A的白名单中删除B即可;
  • Universal Link : 可参考

参考: