在 iOS 中,应用间的跳转是通过 URL 来实现的,目前有两种跳转方案。
- 应用协议:注册应用协议,即 scheme 方案。
- 统一链接:关联通用链接,即 Universal Links 方案。
不论使用哪种方案举行跳转,处理跳转事件的方式是一样的。
一、跳转事件
因为后续的操作,都需要通过接收事件来查看运行结果,因此我们先解一下如何接收应用间跳转事件。
在 iOS 9 之后,通过实现UIApplicationDelegate协议的如下方法,可以接收应用间跳转的事件。
某些应用,设计者大概也会用这个方法里接收应用内跳转。
- - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
- NSLog(@"应用跳转:url = %@, options = %@", url, options);
- return YES;
- }
复制代码 在 iOS 13 之后,如果启用了“UIScene”支持的话,上述方法不会被调用,需要实现UIWindowSceneDelegate协议的如下方法,来接收应用间跳转事件。
- - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
- UIOpenURLContext *context = URLContexts.anyObject;
- NSLog(@"应用跳转:url = %@, options = %@", context.URL, context.options);
- }
复制代码 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中设置。
除非复制粘贴,一般不建议这么做。
- <key>CFBundleURLTypes</key>
- <array>
- <dict>
- <key>CFBundleTypeRole</key>
- <string>None</string>
- <key>CFBundleURLName</key>
- <string>demo</string>
- <key>CFBundleURLSchemes</key>
- <array>
- <string>demo</string>
- </array>
- </dict>
- </array>
复制代码 2、使用协议
在构造NSURL时,需要添加:来表明它是 URL 中的 scheme 部分。
- NSURL *url = [NSURL URLWithString:@"demo:"];
- [UIApplication.sharedApplication openURL:url options:@{
- UIApplicationOpenURLOptionUniversalLinksOnly: @(NO)
- } completionHandler:^(BOOL success) {
- NSLog(@"openURL: %@", success ? @"YES" : @"NO");
- }];
复制代码 参数 url 可以仅包罗 scheme 也可以包罗其它信息,但需要注意的是,大部分系统对于 URL 的长度都是有限制的(通常为1024字节),为了避免数据丢失,可以通过options参数传递数据(Web中不支持)。
- demo:
- demo://message
- demo://message?id=123
options 参数目前支持提供如下两个键值。
- UIApplicationOpenURLOptionUniversalLinksOnly 是否仅使用 Universal Links 且安装了应用时,才执行跳转。
- UIApplicationOpenExternalURLOptionsEventAttributionKey 传递给目标应用的事件数据信息。
3、检测协议
通过 -[UIApplication canOpenURL:] 可以检测目标应用是否安装,避免跳转无法落地的题目。
需要注意的是,这个方法只能确定有应用注册了该协议,不能确定注册该协议的应用为目标应用。
- NSURL *url = [NSURL URLWithString:@"demo:"];
- if ([UIApplication.sharedApplication canOpenURL:url]) {
- NSLog(@"可以打开目标应用");
- }
复制代码 Apple 为了避免该方法被滥用,只有在预置的白名单内的 scheme,该方法才会返回正确的值。
在Info.plist中,添加Queried URL Schemes设置(键为LSApplicationQueriesSchemes的数组),并将要检测的 scheme 添加其中,固然没有官方阐明,但该数组通常被认为有 50 个的数目限制。
- <key>LSApplicationQueriesSchemes</key>
- <array>
- <string>demo</string>
- </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 接口数据示例:
- {
- "applinks": {
- "apps": [],
- "details": [
- {
- "appID": "TeamID_1.com.example.app1",
- "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
- },
- {
- "appID": "TeamID_2.com.example.app2",
- "paths": [ "*" ]
- }
- ]
- }
- }
复制代码 通过如下链接来验证服务器设置是否正确,将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企服之家,中国第一个企服评测及商务社交产业平台。 |