一文弄懂iOS应用间跳转的scheme和Universal Links两种方案

海哥  金牌会员 | 2024-9-17 16:55:34 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 649|帖子 649|积分 1947

在 iOS 中,应用间的跳转是通过 URL 来实现的,目前有两种跳转方案。


  • 应用协议:注册应用协议,即 scheme 方案。
  • 统一链接:关联通用链接,即 Universal Links 方案。
不论使用哪种方案举行跳转,处理跳转事件的方式是一样的。
一、跳转事件

因为后续的操作,都需要通过接收事件来查看运行结果,因此我们先解一下如何接收应用间跳转事件。
在 iOS 9 之后,通过实现UIApplicationDelegate协议的如下方法,可以接收应用间跳转的事件。
   某些应用,设计者大概也会用这个方法里接收应用内跳转。
  1. - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
  2.     NSLog(@"应用跳转:url = %@, options = %@", url, options);
  3.     return YES;
  4. }
复制代码
在 iOS 13 之后,如果启用了“UIScene”支持的话,上述方法不会被调用,需要实现UIWindowSceneDelegate协议的如下方法,来接收应用间跳转事件。
  1. - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  2.     UIOpenURLContext *context = URLContexts.anyObject;
  3.     NSLog(@"应用跳转:url = %@, options = %@", context.URL, context.options);
  4. }
复制代码
  UIScene 是用于支持多窗口(Multiple Windows)的技术,单窗口应用完全可以关闭它。
  

  • 删除 Info.plist 中“Application Scene Manifest”字段,即对应键名为UIApplicationSceneManifest的字段。
  • 删除UIApplicationDelegate是否实现了包罗UISceneSession参数的方法。
  • 删除UIWindowSceneDelegate的实现文件,默认为SceneDelegate.h和SceneDelegate.m方法。
  二、应用协议 - scheme

应用协议跳转,是目前最简便、最直接的应用间跳转方式。固然有明显的缺点,但有不少应用依然还在采用这种方式。


  • 大概与其它应用冲突。
  • 未安装应用时,跳转需求无法落地。
  • 不够安全,不支持动态设置和控制。
1、注册协议

由于是 URL 方案,协议 scheme 定名应符合RFC-3986规范。
1、在Xcode > Targets > Info 选项卡 > URL Types 中设置。

2、大概,直接在Info.plist中设置。
   除非复制粘贴,一般不建议这么做。
  1. <key>CFBundleURLTypes</key>
  2. <array>
  3.     <dict>
  4.         <key>CFBundleTypeRole</key>
  5.         <string>None</string>
  6.         <key>CFBundleURLName</key>
  7.         <string>demo</string>
  8.         <key>CFBundleURLSchemes</key>
  9.         <array>
  10.             <string>demo</string>
  11.         </array>
  12.     </dict>
  13. </array>
复制代码
2、使用协议

在构造NSURL时,需要添加:来表明它是 URL 中的 scheme 部分。
  1. NSURL *url = [NSURL URLWithString:@"demo:"];
  2. [UIApplication.sharedApplication openURL:url options:@{
  3.     UIApplicationOpenURLOptionUniversalLinksOnly: @(NO)
  4. } completionHandler:^(BOOL success) {
  5.     NSLog(@"openURL: %@", success ? @"YES" : @"NO");
  6. }];
复制代码
参数 url 可以仅包罗 scheme 也可以包罗其它信息,但需要注意的是,大部分系统对于 URL 的长度都是有限制的(通常为1024字节),为了避免数据丢失,可以通过options参数传递数据(Web中不支持)。


  • demo:
  • demo://message
  • demo://message?id=123
options 参数目前支持提供如下两个键值。


  • UIApplicationOpenURLOptionUniversalLinksOnly 是否仅使用 Universal Links 且安装了应用时,才执行跳转。
  • UIApplicationOpenExternalURLOptionsEventAttributionKey 传递给目标应用的事件数据信息。
3、检测协议

通过 -[UIApplication canOpenURL:] 可以检测目标应用是否安装,避免跳转无法落地的题目。
   需要注意的是,这个方法只能确定有应用注册了该协议,不能确定注册该协议的应用为目标应用。
  1. NSURL *url = [NSURL URLWithString:@"demo:"];
  2. if ([UIApplication.sharedApplication canOpenURL:url]) {
  3.     NSLog(@"可以打开目标应用");
  4. }
复制代码
Apple 为了避免该方法被滥用,只有在预置的白名单内的 scheme,该方法才会返回正确的值。
在Info.plist中,添加Queried URL Schemes设置(键为LSApplicationQueriesSchemes的数组),并将要检测的 scheme 添加其中,固然没有官方阐明,但该数组通常被认为有 50 个的数目限制。
  1. <key>LSApplicationQueriesSchemes</key>
  2. <array>
  3.     <string>demo</string>
  4. </array>
复制代码
三、统一链接 - Universal Link

统一链接 Universal Links 是当前保举的应用跳转实现方式。
统一链接,本质其实就是以https作为 scheme 的应用协议跳转,因为默认情况下,https就是跳转 Web 应用的应用协议,也因此,通过统一链接跳转,在应用未安装时,可以将对应的网页作为落地页面。
   在 iOS 中,统一链接是由系统处理的,而不是浏览器。
系统会将应用与统一链接的域名、路径举行关联,掷中了关联会直接打开应用,而不需要颠末浏览器中转,与 scheme 结果完全一样。
  同样的,统一链接也并不是完善的。


  • 生效大概会延迟。
  • 依靠服务器。
  • 设置相对复杂。
1、准备



  • 域名。
  • 可以通过域名访问且支持 https 的 Web 服务器。
  • 交了保护费的开发者账号。
2、设置服务器

服务器必须实现如下接口,以域名example.com为例,下同。
名称值URLhttps://example.com/.well-known/apple-app-site-association备用URLhttps://example.com/apple-app-site-associationMethodGETContent-Typeapplication/json 接口数据示例:
  1. {
  2.     "applinks": {
  3.         "apps": [],
  4.         "details": [
  5.             {
  6.                 "appID": "TeamID_1.com.example.app1",
  7.                 "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
  8.             },
  9.             {
  10.                 "appID": "TeamID_2.com.example.app2",
  11.                 "paths": [ "*" ]
  12.             }
  13.         ]
  14.     }
  15. }
复制代码
通过如下链接来验证服务器设置是否正确,将example.com替换为实际域名。


  • https://app-site-association.cdn-apple.com/a/v1/example.com
3、设置项目

1、进入 Apple 开发者中心,设置应用的identifier开启Associated Domains本领。

2、在Xcode > Targets > Signing & Capabilities 选项卡中,添加Associated Domains本领,并关联域名。
   关联域名的记录,格式为:applinks:域名
  

4、Universal Link 工作流程


  • 应用第一次启动,大概更新版本后第一次启动(实际结果,未体现在苹果官方文档上)。
  • 系统检测到应用是否开启Associated Domains,并检查是否有applinks域名关联记录。
  • 请求https://example.com/.well-known/apple-app-site-association查询设置文件。
  • 如果上一步失败,则请求https://example.com/apple-app-site-association查询设置文件。
  • 将apple-app-site-association注册到系统。
  • 系统收到https的跳转请求后,先匹配已注册到系统的统一链接,如果掷中,则直接打开应用,否则打开浏览器。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表