为什么使用通用链接?
Universal Links 是iOS9以后有的一个系统级功能,可以使我们的应用分享到第三方应用后点击链接唤醒我们app,不过现在微信禁止了,微信中打开需要在sarfari中打开才可以唤醒.
为何不用scheme
scheme的方式是需要其他软件中设有你app的白名单才可以跳转,这就不符合我们的要求,我们不可能让所有的分享软件都设有我们app的白名单,这是不合理的.所以不选择.
实现通用链接功能分为三部
1、Developer Settings (开发者中心配置)
首先,需要在开发者中心开启Associated Domains功能,具体操作是:
![](https://img.haomeiwen.com/i6067780/a187a924f6edd604.png)
点击要修改的 App ID,在列表中勾选 Associated Domains
![](https://img.haomeiwen.com/i6067780/e5aab7f027006d2a.png)
在弹出框点确定,这个警告是告诉你,你如果启用该功能,就相当于编辑了这个 App ID,那么你现有的用该 App ID 生成的描述文件就得重新生成并导入至 Xcode 中了
![](https://img.haomeiwen.com/i6067780/aeda0e60f1172991.png)
点击确定后,你会发现 Associated Domains 可用了
![](https://img.haomeiwen.com/i6067780/16b4c4c8a3a0dce4.png)
点击描述文件,发现失效了,那是因为你编辑过生成该描述文件用到的 App ID,不急,编辑它就是了
![](https://img.haomeiwen.com/i6067780/5f5701fbc4343255.png)
编辑描述文件,只需要重新勾选 App ID 即可,然后保存的描述文件又变成有效的了。下图注释中说的很明确了,Download 该描述文件,双击安装即可
![](https://img.haomeiwen.com/i6067780/57223885809e51b3.png)
开发跟发布的描述文件都重新生成并下载安装之后,开发者中心的配置就完成了
2、HTTPS Settings
有一个注册的通过 SSL 访问的域名(HTTPS)
假设你的域名为 domain ,例如:www.xxx.com 或 xxx.com 或 xxx.xxx.com 都能当做是域名,具体看你后台怎么给你配,我这里称之为 domain,domain 代表上述那几种域名。
支持上传一个 JSON 文件到你的域名
用文本编辑器写一个 JSON ,该 JSON 的格式是:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TeamID.BundleIdentifier",
"paths": [ "*" ]
}
]
}
}
这个 JSON 最好去 官方文档粘贴复制,防止错误
上面的 appID 的组成结构是 TeamID.BundleIdentifier
TeamID 可以去开发者中心的 Account -> Membership 下去找。如图:
![](https://img.haomeiwen.com/i6067780/eed9c6467802ecfc.png)
BundleIdentifier 就是你应用的 Bundle Identifier
![](https://img.haomeiwen.com/i3889208/b6fea406d9dd4e90.png)
这个 JSON 其他 key 的作用我就不过多赘述了,具体看官方文档,** paths** 我这里是用了 *,代表支持该域名下的所有链接跳转至 App。
编辑好该 JSON 后,保存,命名为:apple-app-site-association,注意,这里不能给该文件冠以 .json之类的后缀
![](https://img.haomeiwen.com/i6067780/08ed38284d1f1fbc.png)
将保存好的 JSON 文件 apple-app-site-association上传至HTTPS服务器域名的 根目录 或者根目录下的.well-known文件夹下。例如:https://domain/apple-app-site-association 或者 https://domain/.well-known/apple-app-site-association, 其中 domain 就是你的域名,上面已经概述过。
上传好 JSON 文件后,最简单的办法是通过浏览器访问该文件,如果能得到该 JSON 内容,说明已经可以访问该文件
![](https://img.haomeiwen.com/i6067780/744b731c22db8998.png)
3、Xcode 设置
Targets -> Capabilities -> Associated Domains
![](https://img.haomeiwen.com/i3889208/1241c574e12e433f.png)
这里的操作就是添加 Domains,具体写 applinks:domain,这里的 domain 跟上一步 Web Settings 里面的 domain 是一致的。
假设你的域名为 domain ,例如:www.xxx.com 或 xxx.com 或 xxx.xxx.com 都能当做是域名,具体看你后台怎么给你配,我这里称之为 domain,domain 代表上述那几种域名。
这里开启了 Associated Domains 功能后,你的工程会自动创建一个 .entitlements 文件
![](https://img.haomeiwen.com/i3889208/443d758a8a39e4e1.png)
到这里的时候,你的通用链接基本打通了。你可以通过简单的方法来测试一下。
我的测试方法是
- 删除已安装的app,重新安装;
- 待程序安装好后,打开备忘录,在备忘录里面随便输入一个带域名的链接,比如:https://domain/xxx, 点击右上角完成按钮;
- 长按该链接,如果已接通通用链接,底部弹出框会多出一栏,显示“在xxx中打开”,其中这个xxx就是你应用的名字。
![](https://img.haomeiwen.com/i6067780/c7569ec3df79fbd7.png)
4、写代码的地方
在AppDelegate.m 文件里 方法-application:continueUserActivity:restorationHandler:接受回掉获取数据跳往对应页面
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webUrl = userActivity.webpageURL;
NSLog(@"host = %@", webUrl.host);
NSString *urlString = webUrl.absoluteString;
NSArray *arr = [urlString componentsSeparatedByString:@"xxx"];
if (arr.count == 2) {
if ([[arr lastObject] length] > 0) {
NSString *paraString = [arr lastObject];
NSString *schemeStr = @"xxxxxxx";
if ([paraString hasPrefix:schemeStr]) {
NSLog(@"接收到了");
NSLog(@"root = %@", self.window.rootViewController);
id rootVC = self.window.rootViewController;
if ([rootVC isKindOfClass:[LoginNVC class]]) {
NSLog(@"未登录,请先登录");
} else {
NSLog(@"已登录直接跳转至指定页面");
[self gotoDiffrentVCWithUrl:[NSURL URLWithString:paraString]];
}
}
}
}
return YES;
} else {
return NO;
}
}
当跳转我们app的时候,右上角有个返回按钮,iOS 会记录你的用户习惯,如果用户点了,那么就会从浏览器中打开,后面就不会打开app了,防止用户点击,于是我们阻挡右上角用户交互,代码如下
/**
添加右上角视图(覆盖UIStatusBarOpenInSafariItemView)
*/
- (void)addStatusBarRightView {
UIView *v = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
UIView *b = [[UIView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-100, 0, 100, 20)];
b.backgroundColor = clear();
[v addSubview:b];
}
网友评论