为什么使用通用链接?
Universal Links 是iOS9以后有的一个系统级功能,可以使我们的应用分享到第三方应用后点击链接唤醒我们app,不过现在微信禁止了,微信中打开需要在sarfari中打开才可以唤醒.
为何不用scheme
scheme的方式是需要其他软件中设有你app的白名单才可以跳转,这就不符合我们的要求,我们不可能让所有的分享软件都设有我们app的白名单,这是不合理的.所以不选择.
实现通用链接功能分为三部
1、Developer Settings (开发者中心配置)
首先,需要在开发者中心开启Associated Domains功能,具体操作是:
点击要修改的 App ID,在列表中勾选 Associated Domains
在弹出框点确定,这个警告是告诉你,你如果启用该功能,就相当于编辑了这个 App ID,那么你现有的用该 App ID 生成的描述文件就得重新生成并导入至 Xcode 中了
点击确定后,你会发现 Associated Domains 可用了
点击描述文件,发现失效了,那是因为你编辑过生成该描述文件用到的 App ID,不急,编辑它就是了
编辑描述文件,只需要重新勾选 App ID 即可,然后保存的描述文件又变成有效的了。下图注释中说的很明确了,Download 该描述文件,双击安装即可
开发跟发布的描述文件都重新生成并下载安装之后,开发者中心的配置就完成了
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 下去找。如图:
BundleIdentifier 就是你应用的 Bundle Identifier
这个 JSON 其他 key 的作用我就不过多赘述了,具体看官方文档,** paths** 我这里是用了 *,代表支持该域名下的所有链接跳转至 App。
编辑好该 JSON 后,保存,命名为:apple-app-site-association,注意,这里不能给该文件冠以 .json之类的后缀
将保存好的 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 内容,说明已经可以访问该文件
3、Xcode 设置
Targets -> Capabilities -> Associated Domains
这里的操作就是添加 Domains,具体写 applinks:domain,这里的 domain 跟上一步 Web Settings 里面的 domain 是一致的。
假设你的域名为 domain ,例如:www.xxx.com 或 xxx.com 或 xxx.xxx.com 都能当做是域名,具体看你后台怎么给你配,我这里称之为 domain,domain 代表上述那几种域名。
这里开启了 Associated Domains 功能后,你的工程会自动创建一个 .entitlements 文件
到这里的时候,你的通用链接基本打通了。你可以通过简单的方法来测试一下。
我的测试方法是
- 删除已安装的app,重新安装;
- 待程序安装好后,打开备忘录,在备忘录里面随便输入一个带域名的链接,比如:https://domain/xxx, 点击右上角完成按钮;
- 长按该链接,如果已接通通用链接,底部弹出框会多出一栏,显示“在xxx中打开”,其中这个xxx就是你应用的名字。
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];
}
网友评论