iOS配置Universal Links

Universal Links(后文统称:UL链接)是苹果自iOS9.0推出的用于应用之间跳转的一种安全认证机制,支持通过传统HTTPS链接来启动APP

相比的URL Scheme最大区别:

scheme是由开发者自定义的,有一定概率会重复;

如果需要使用URL Scheme,则必须提前将scheme加入到Xcode工程info.plist文件的LSApplicationQueriesSchemes白名单中,否则会被系统自动屏蔽;

安装应用的同时下载UL链接并导入系统,由于需要配合HTTPS使用因此安全性较强;

UL链接通常需要跳转的应用双方来共同制定path,不像URL Scheme是由app开发人员单方面自定义;

使用scheme跳转系统会弹框提示,替换成UL链接后可以实现无缝跳转;

前提条件:

硬件设备搭载的iOS系统版本 >= 10.3;

链接必须使用域名,不得是IP地址;

域名对应服务器必须使用https,且SSL证书必须通过苹果信任;

公司用就是WoSign CA颁发的证书也就是沃通被苹果屏蔽的,导致我和运维小伙伴研究了很久才找到原因,苹果爸爸再一次教我做了人:我不要你觉得,我要我觉得

iOS信任的证书查询:https://support.apple.com/en-au/HT204132

第一步:配置App

在苹果开发者官网,找到你需要配置的App并打开;

找到App ID Prefix和Bundle ID,记录以备后用;

找到”Associated Domains“选项,打开勾选;

配置App.png

注意:如果当前未勾选,选择打开的同时会导致所有与当前App相关的描述文件全部失效,需要重新配置并保存;

第二步:配置服务器

这里需要运维童鞋支持一下,在host域名对应的服务器.well-known目录下面新建一个json文件,命名为apple-app-site-association,不需要.json后缀

测试办法:例如你的{host}是www.hongyantu.com,那浏览器打开https://www.hongyantu.com/.well-known/apple-app-site-association可以下载该文件即可

apple-app-site-association文件的JSON内容:

{"applinks":{"apps":[],"details":[{"appID":"MC1A2B3C4D5.com.hongyantu.AppSample","paths":["/app/*"]}]}}

appID:固定值,使用第一步获取到的App ID Prefix和Bundle ID,格式照<App ID Prefix>.<Bundle ID>

paths:非固定且可以有多个,根据自身要求定义,但需要注意配置通用符号*,不要带query参数。

第三步:配置Xcode Project

打开你的iOS工程,在project → Signing & Capabilities → + Capability,添加“Associated Domains”

Xcode配置1.png

在Associated Domains点击"+"添加两个参数:applinks:{host}和webcredentials:{host},后面带上,{host}修改为apple-app-site-association文件配置所在的域名

配置Xcode.png

第四步:测试UL链接

打开https://{host}/apple-app-site-association,检查是否包含应用Bundle ID,并且取得其paths,并生成UL链接

可以参考微信的apple-app-site-association:

https://help.wechat.com/apple-app-site-association

生成UL链接:

https://help.wechat.com/app/

当前本人已知的测试UL是否配置成功的方法有三种:

使用iOS自带Safari浏览器,打开UL链接,下拉会出现应用入口,点击“打开”可以跳转至原生App;

Safari.jpg

使用iOS自带备忘录应用,输入UL链接并保存,长按会出现”在应用内打开“,点击可以跳转至原生App;

备忘录.jpg

使用另一个Xcode工程,调用openURL:尝试打开UL链接,可以跳转至原生App。

NSURL*url=[NSURL URLWithString:@"https://help.wechat.com/app/"];if([[UIApplication sharedApplication]canOpenURL:url]){if(@available(iOS10.0,*)){[[UIApplication sharedApplication]openURL:url options:@{}completionHandler:^(BOOL success){if(success){NSLog(@"The URL was delivered successfully.");}else{NSLog(@"The URL failed to open.")}}];}else{[[UIApplication sharedApplication]openURL:url];}}

若未跳转至对应App应用,而是打开了网页则表示配置有问题

补充知识

Q:UL链接是在app首次打开的时候,由系统向服务器发起请求获得的吗?

A:准确来说,iOS系统是在安装app应用的过程中向服务器发起请求,如果获得数据则会导入系统

注意:

系统会优先请求:https://{host}/.well-known/apple-app-site-association

如果第1步没请求成功,才会请求:https://{host}/apple-app-site-association

修改服务端apple-app-site-association文件内容后,已安装本地应用不会同步更新

若需要更新,建议删除当前应用后重新安装

Q:当由浏览器或其他app应用跳转进入我自己的应用时,如何接收回调?

A:需要在AppDelegate.m/SceneDelegate.m中实现下面回调方法:

-(BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>>*__nullable restorableObjects))restorationHandler{if([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]){NSLog(@"%@",userActivity.webpageURL);//打印URL}returnYES;}

Q:如果当前使用浏览器打开,如何获取浏览器URL内容中的query参数?

A:还记得上面第二步骤中paths需要配置通用符号么?这使得开发者可以自定义query参数

例如我们上面测试的链接是:

https://help.wechat.com/app/

然而这个链接本身不带有任何query参数,可以在后面尝试加上一些,例如:

https://help.wechat.com/app/s?brand=hermes&year=2021

在App内可以将后面的query字段解析并转换为字典:

{    @"brand":@"hermes",    @"year":@"2021"}

Q:如果维护了多个app应用,如何做区分?

A:配置不同的path

个人理解:UL的底层工作原理是通过path来映射appID,也就是说当发起跳转时系统会通过寻找path并匹配appID最后来决定到底应该唤醒哪个应用,所以针对不同App应当尽量配置不同的path

针对类似问题其实有个比较经典的使用场景:一个开发者同时维护多个应用,并且这些应用都用到了微信和腾讯开放平台openSDK

需要修改apple-app-site-association文件成如下格式:

{"applinks":{"apps":[],"details":[{"appID":"MC1AB2C3D4.com.geniune.app1","paths":["/wx_conn/100001/*","/qq_conn/100002/*"]},{"appIDs":["MC1AB2C3D4.com.geniune.app2","MC1AB2C3D4.com.geniune.app2Sample"],"paths":["/wx_conn/200001/*","/qq_conn/200002/*"]}]}"webcredentials":{"apps":["MC1AB2C3D4.com.geniune.app1","MC1AB2C3D4.com.geniune.app2"]}}

假设我使用的{host}域名为:www.hongyantu.com,在域名后面加上任意path即可形成UL链接

因此也得出以下四个结果:

APP1(com.geniune.app1)的UL链接:

https://www.hongyantu.com/wx_conn/100001/(提供微信开放平台使用)

https://www.hongyantu.com/qq_conn/100002/(提供腾讯开放平台使用)

APP2(com.geniune.app2)的UL链接:

https://www.hongyantu.com/wx_conn/200001/(提供微信开放平台使用)

https://www.hongyantu.com/qq_conn/200002/(提供腾讯开放平台使用)

相关文章:

微信openSDK使用Universal Links

腾讯openSDK使用Universal Links

参考文章:

iOS信任的证书链接

applinks

Associated Domains

使用Universal Links实现App之间跳转

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • Universal Links(后文统称:UL链接)是苹果自iOS9.0推出的用于应用之间跳转的一种安全认证机制,...
    Geniune阅读 12,235评论 3 12
  • Universal Links 相关文档 苹果官方文档说明[https://developer.apple.com...
    社会隆阅读 2,485评论 6 10
  • 前言 由于对接微信分享的时候发现微信的SDK 1.8.6需要支持Universal Links,于是查看官网以及各...
    ZT_Story阅读 6,230评论 2 6
  • 1.Universal Link 的基本运作机制: 通过在 XCode 的 App 配置中配置了相关信息以及安全域...
    angle_杰阅读 8,425评论 6 6
  • 1.Universal Link 的基本运作机制: 通过在 XCode 的 App 配置中配置了相关信息以及安全域...
    王家小雷阅读 1,993评论 3 2