一、URL Scheme跳转
在iOS 9之前,我们从外部启动App都是通过URL scheme的方式进行跳转,开发者通过配置info.plist文件中的 URL Types 可以轻松实现跳转,而且现在苹果还对这种跳转的方式加了一个提示框:“是否打开XXX”,跳转过程也显得不流畅。
开发步骤
1. 注册URL Scheme
每一个项目里面都会有一个info.plist配置文件。找到info.plist,右键选择Add Row,然后选择URL types。添加URL Schemes
2. Safari启动自定义的URL Schemes APP
既然已经配置好URL Schemes,那么我们可以来款速测试一下,我们设置的URL Schemes是否有效。打开Safari,在地址栏里输入:iOSDevTip:// 即可唤起app
打开注册iOSDevTip的APP格式为: URL Scheme://URL identifier,直接调用URL Scheme也可打开程序, URL identifier是可选的。
二、UniversalLink
而UniversalLink跳转方式可以实现无缝跳转,当浏览器识别到预先指定好的URL,就可以直接唤醒App,不需要在浏览器中打开再去点击其他按钮。只支持iOS 9以上
开发步骤
1. 打开Associated Domains服务
1.1 苹果开发者账号开启Associated Domains服务
1.2 在xcode工程的Capabilities -> Associated Domains中添加跳转域名
注意:
你的服务器必须支持SSL
Domains可以添加多个
Domains必须以applinks: 开头
2. 配置 apple-app-site-association 文件
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
- apps项必须对应一个空的数组
- details项对应一个字典的数组,
- appID对应项由前缀和ID两部分组成,可以在developer中的Identifiers→AppIDs中点击对应的App ID查看。
- paths对应域名中的path,用于过滤可以跳转到App的链接,支持通配符*,?以及NOT进行匹配,匹配的优先级是从左至右依次降低。
- 建议配置上path,同一公司可能多款app有次需求,不同的path有益于后期的扩展。
- 最后,需要把配置好的json文件上传到服务器中该域名的根目录下,也就是说,我们可以用GET请求可以获取到这个apple-app-association文件。
当我们的App在设备上第一次运行时,如果支持Associated Domains功能,那么iOS会自动去GET定义的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/目录下。
3. Xcode代码处理
#pragma mark Universal Link
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *url = userActivity.webpageURL;
// TODO 根据需求进行处理
}
// TODO 根据需求进行处理
return YES;
}
总结
- apple-app-site-association不需要.json后缀。
- 如果要对没有path的域名进行支持(如:www.163.com),在json文件的paths中用通配符’*’是不行的,需要在paths数组中加入’/’进行匹配。
- 对json文件的请求仅在App第一次启动时进行,如果此时网络连接出了问题apple会缓存请求,等有网的时候再去请求,而实际测试抓包并没有请求故通用连接会失效。
- paths匹配的优先级是从左至右依次降低,但需要明确,否则会出问题。比如"paths":[ "NOT /together/",""],在IOS9.2上path为/together/*都不会跳到App,但是在IOS9.0上会跳到。
- iOS 9.2开始,在相同的domain内Universal Links是不work的,必须要跨域才生效