Universal Links

什么是Universal Links?

iOS9之后,Apple推出的一种通用链接,能够方便的通过https链接来启动APP,通过唯一的网址,不需要特别的schema就可以链接一个特定的视图到APP。
这也就设计到universal links的几个特性:

  1. Unique:唯一性,不像自定义Url schemes那样,因为他使用到了你网站的http或者https链接
  2. Secure:安全性,当用户安装应用时,iOS会检测你上传到服务器上的文件,以确保你的网站允许其代表应用打开你的应用。
  3. Flexible:灵活性,当没有安装你的app时universal links也是可以正常使用的,当点击link时会直接在safari中打开url。
  4. Simple:一个url可以为app和web提供服务。
  5. Private:其他app可以与你的app通信,不需要知道你的应用程序是否安装。

配置Universal links

配置Universal links需要网站与app协同处理,两端都需要做一些工作。

1.创建并上传关联文件

首先,你的网站必须支持https。

然后,创建apple-app-site-association文件,注意一定是没有.json后缀的,在未压缩的情况下,文件大小不能超过128KB。

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
            },
            {
                "appID": "ABCD1234.com.apple.wwdc",
                "paths": [ "*" ]
            }
        ]
    }
}

<b>appID:</b>是由TeamID+BundleId组成,TeamID可以通过开发者账号来查看,Bundle ID可以直接在工程里查看。

<b>paths:</b>是一个数组类型用来指定网站路径,并且是大小写敏感的:
使用“*” 指定整个网站,在域名下的任何地址都可以打开App。

“/wwdc/news/”指定链接,以指定网站的某些部分.

还可以使用“?”匹配任何单个字符,"/foo/*/bar/201?/mypage"

创建好apple-app-site-association文件后,将其上传到web服务器的跟目录下或者.well-known子目录下。<b>文件是通过https访问不需要有任何重定向。</b>然后你可以直接在浏览器中输入domain/apple-app-site-association或者domain/.well-known/apple-app-site-association访问你所上传的文件。

通过Apple的测试网站可以检测你上传的文件是否正确。传送门

注意:在用Nginx处理文件的MIME Type配置时,在域名下针对该文件进行处理,也就是说response的Content-Type必须设置为”application/json“。

使用Nginx处理文件的MIME Type配置,在server的某个域名下针对该文件处理

location /apple-app-site-association {
    default_type application/json;
}

接下来就是在App内部配置了。

  1. 需要支持Universal links的话,需要将开发者中心的配置APPlication Services列表中的ASSociated Domains变成Enabled。

  2. 在项目targets->Capabilities->Associated Domains中配置App link。在这里需要注意一下,有的域名为www.abc.comabc.com,这两个对于Universal links来说是不同的域名,所以,如果你的网站是这两个都需要做处理的话,需要将这两个域名都放在associate domains列表下。在添加时都要将applinks:放在域名前面。
    例如:

  1. 不需要手动的添加entitlements,当添加domain之后,系统会自动添加相应的文件到工程,如果没有的情况下,只能通过手动添加。
  2. 在AppDelegate中调用方法来处理Universal links的回调。
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *webUrl = userActivity.webpageURL;
        if ([webUrl.host isEqualToString:@"domain"]) {
            //打开对应页面
        }else{
            //不能打开,使用Safari 打开
            [[UIApplication sharedApplication]openURL:webUrl];
        }
    }
    return YES;
}

这里回传过来一个NSUserActivity类型的数据,对该数据处理来跳转相应的界面。也就不再多说了。

到此整体的流程就已经处理完了。相关的内容介绍还是推荐看官方文档,写的比较细致。

注意事项

  1. apple-app-site-association文件上传一定不要有.json后缀,那些隐藏后缀名的需要注意。
  2. web server必须支持https
  3. 上传文件最好在根目录下,官方说也可以在根目录下的.well-known目录下。
  4. Xcode中配置Associated Domians时,一定要添加applinks:前缀。最多添加20-30条。
  5. app在<b>安装</b>的时候会访问domain获取apple-app-site-association文件,这个可以通过抓包来获取。不是在打开app时访问。
  6. 直接dev打包到手机上应该就可以测试,保证网络畅通。
  7. 最简单的方式检测Universal links是否有效,将那个链接拷贝的备忘录中(imessage、邮件),直接点击链接会跳转到App,或者长按,会在弹出的ActionSheet中第二个显示在xxx中打开
  8. 一定是从上级页面(网页)<b>点击触发</b>的Universal links。
  9. 用 Safari 打开目标域名,或者在其他 App 里用 SFSafariViewController, WKWebView, UIWebView 打开目标域名,都可以达到效果。

那些坑

1. 跨域跳转:饿了么遇到的一个问题

这里的问题,就是我们将链接复制在备忘录里发现可以拉起App,但是放在网页里,点击却是没有任何效果,这个几乎就是跨域的锅。

这个应该是在iOS9.2之后出现的问题。假设当前网页是abc.com/a,在这里有一个链接跳转到abc.com/b,还是在同一个域名abc.com下。这时点击,系统将不会进行拉起App的操作,必须在不同的域名下比如abcd.com/b,这样才会根据关联文件去判断是否要拉起app。这个时候就需要在Xcode中添加一个域名在碰到跨域问题不能拉起App时,链接改为其他的域名。
这里也有解释

2. 选择性跳转

这个也是一个坑,苹果会通过Universal links记录用户的行为习惯,当你通过一个Universal links成功的拉起了App,这时你发现在status bar右上角有一个小按钮(带一个小箭头)。当你点击了之后会成功的在Safari中打开,这时,苹果就认为你不需要这个Universal links拉起App,此后在通过这个Universal links点击时,都是在safari或者网页中打开,不会再拉起App。这个是有办法补救的,通过在Safari中点击链接长按,在app中打开。此后通过Universal links就可以拉起App了。也就说,苹果会记录最后一次Universal links的跳转情况来判断是否需要拉起app。

这里感觉第一个的跨域跳转与第二个的选择性跳转是很类似的,第一个在当前域名下点击Universal links不能拉起app就相当于当前系统认为你这个universal links本身就在浏览器中打开的,认为不需要拉起app。

When a user taps a universal link that you handle, iOS also examines the user’s recent choices to determine whether to open your app or your website. For example, a user who has tapped a universal link to open your app can later choose to open your website in Safari by tapping a breadcrumb button in the status bar. After the user makes this choice, iOS continues to open your website in Safari until the user chooses to open your app by tapping OPEN in the Smart App Banner on the webpage.

相关网站

官方文档

通过Apple的测试网站可以检测你上传的文件是否正确。传送门

写的不好,如果有问题欢迎指正。

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

推荐阅读更多精彩内容