iOS通用链接(Universal Links)配置

Universal Links

app开发中我们经常需要从浏览器,Safari中去唤醒appiOS 9之前我们通过配置scheme从而实现这种跳转,但是这种方式需要提前判断系统中是否安装了能够响应对应schemeapp,这种方式在微信中是被禁用的。

Universal LinksiOS 9推出的一项功能,我们可以通过配置Universal Links使用户能够通过一个链接进入app或者指定页面,这个不会被微信禁用。

配置

  1. 首先我们需要有一个支持Https的域名,必须支持Https.

  2. 创建一个内容为Json格式的文件,文件名为apple-app-site-association,没有后缀名,文件内容大体如下:

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

    注意⚠️:

    appID组成:TeamId.your app’s bundle identifier。这里我随意填的,2DNT4K53X5表示你appTeamIdcom.apple.wwdc表示app的bundle identifier。其中TeamId你需要登陆相关开发者账号,到Account - Membership中去获取,如下图:

TeamId获取

paths组成:设定你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理。*的写法代表了可识别域名下所有链接。

  1. 将这个文件上传到你的域名对应的根目录或者.well-known目录下(需要后端配合),这样苹果将会在合适的时候,从该域名请求这个文件。我们可以自己测试,即打开你的域名/apple-app-site-association,看看我们能不能够下载到对应的文件。
  2. 然后我们需要在app中进行相关配置。之前我们需要在对应App IdApplication Services列表中加入Associated Domains,使它变成Enabled。现在Xcode会帮我们自动配置,我们只需要在项目中加入Associated Domains,然后在Domains中加入相应链接,如下图:
增加Associated Domains
Associated Domains链接配置
Application Services显示

注意⚠️: Domains中加入的链接,必须以 applinks:开头,然后去除你的域名前的Https以及最后的/,例如你的域名是https://www.apple.wwdc.com/,那么Domains中加入的就是applinks:www.apple.wwdc.com

验证配置

配置一个该域名下可以访问的链接地址,然后复制该链接到Safari中直接访问,然后在出现的网页中下拉,当出现在“XXX”App中打开即可,如下图:

验证配置

注意⚠️: 只有当前Webviewurl域名,与跳转目标url域名一致时,Universal Link 才会生效。

进入app后对链接进行处理

当用户点击对应的链接时,会直接进入app,如果我们需要监听链接并做出不同的处理,我们就需要在AppDelegate中实现对应的方法,否则就是直接进入app

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler{
    NSLog(@"userActivity : %@",userActivity.webpageURL.description);
    if([userActivity.webpageURL.description rangeOfString:H5_JumpApp_CourseMark].location != NSNotFound){
    //相应处理
    }
    return YES;
}

注意⚠️: 该方法是在进入app之后才会进行调用

微信相关配置

在使用旧版本微信SDK时,分享会出现未验证现象。这时候需要我们更新SDK并进行相应的Universal Links配置。

微信分享未验证

项目更新对应的微信SDK

pod 'WechatOpenSDK', '~> 1.8.7.1'
或者
直接导入相关SDK。

微信后台加入Universal Links配置

在微信后台加入你设置的域名配置,如https://www.apple.wwdc.com/

微信后台配置

app设置

  1. Info.plistSetting的infoLSApplicationQueriesSchemes中加入weixinULAPI
Info.plist配置
info配置

微信提供了检测的方法

  //调用自检函数
 [WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
        NSLog(@"%@, %u, %@, %@", @(step), result.success, result.errorInfo, result.suggestion);
        NSLog(@"123");
    }];
微信自检结果

注意⚠️: 通过自检方法我们能够知道Universal Links配置是否成功。另外未验证问题不是实时更新的,你会发现你更新了SDK也不会立刻生效,需要等待从未验证列表中移除为止。

最明显的就是效果就是只有第一次会通过微信验证,后面就不会再调用微信验证了。

效果图

注意⚠️:接入微信之后必须- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler方法中加入[WXApi handleOpenUniversalLink:userActivity delegate:self],否则会导致微信的回调-(void)onReq:(BaseReq*)req不执行。

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler{
    NSLog(@"userActivity : %@",userActivity.webpageURL.description);
    if ([userActivity.webpageURL.description containsString:kAppID_Weixin]) {          // 微信调用
        return [WXApi handleOpenUniversalLink:userActivity delegate:self];
    }else if([userActivity.webpageURL.description rangeOfString:H5_JumpApp_CourseMark].location != NSNotFound){
    //相应处理
    }
    return YES;
}

注意⚠️:
前端开发经常面临跨域问题,必须要求跨域,如果不跨域,就不行。
只有当前webviewURL域名,与跳转目标URL域名不一致时,Universal Link(通用链接)才生效。

问题汇总

  1. 按照上面写的配好了,怎么死活打不开呀???

    • 支持HTTPS呀,一定要是符合苹果认证的HTTPS证书呀。
    • 系统问题,确保iOS9.0以上
    • 配置文件问题,apple-app-site-association文件中配置的path和测试用的通用链接不一致,注意是区分大小写的。
    • 域名问题,Xcode中配置的域名一不小心写错了。
  2. 为毛有的手机成功了,有的手机就不行呢???

    • 上面也提到过,因为网络波动有可能会导致部分用户第一次安装时,无法下载apple-app-site-association文件,这个只能引导用户删除重装或者在迭代时修改Associated Domains配置告诉系统重新下载apple-app-site-association文件。
    • 另外一种可能是苹果抽风导致,笔者今年年初一碰到过一个蛋疼的问题,从中午一直到下午4点发现重复的删除重装,app也不会请求服务器的apple-app-site-association文件,过了4点之后就好了。当时因为时间特殊并没有深究到底是什么原因导致。
  3. 服务器换域名了肿么办???

    当Associated Domains添加新的 Domains的之后,在app再次启动的时候抓包发现(不需要删除重装),苹果会给新添加的这个Domains发送一个请求,请求新Domain下的apple-app-site-association文件。也就是说Associated Domains发生改变的话,系统是会知道的,这样就可以在迭代的时候删除旧的域名,添加新的域名了。
    另外Domains的配置也可以使用通配符,例如:applinks:*.mywebsite.com

  4. 全都配置好了,项目也能唤起来了,web页面到底该怎么弄呀???通用链接指向的服务器的页面到底应该是哪个?

    之前iOS和安卓用的是同一个网页,也就是说从APP内分享出去的网页,可以被苹果用户和安卓用户同时查看,在这里需要由web童鞋使用js判断当前所处的平台以及其系统。

    如果是安卓用户,则显示安卓相关提示页面。

    如果是苹果用户,那么分两种:

    • 如果是9.0以上的系统,相关的“在APP内打开”按钮的链接配置的就是我们的Universal Link(通用链接)了,且该通用链接地址指向的是一个APP下载引导页面,那么当用户安装了APP,即可通过通用链接唤醒APP;如果用户没有安装app,那么就会跳转到通用链接指向的APP下载引导页面,达到最大化的客户导流。
    • 如果是9.0以下的系统,则相应的 “在APP内打开”的按钮就会发一个跳转到我们APP URL Scheme的重定向,以实现在Safari中唤醒我们的APP。
  5. 当使用通用链接唤醒APP之后,手机右上角有一个小按钮?

    那个小按钮只有(在iOS10.0以下才有)是可以引导用户跳转到Safari中,名字叫bread crumbs button(面包屑),当然也去不掉;并且当用户点过这个按钮后,再点击Universal Link(通用链接)不会直接打开对应的APP。

  6. 备忘录和safari中都可以打开app,怎么分享到其他app里面就不行了?

    未跨域导致的,如:分享到微信的链接是https://www.mydomain.com/share.html,然后该网页中的“在app内打开”按钮配置的通用链接为https://www.mydomain.com/index.html
    跨域的意思是说,通用链接 和 调用通用链接的网页不要使用同一域名。
    即如果通用链接域名为www.mydomain.com,则通用链接所处的网页域名就不能是www.mydomain.com

  7. 微信已经禁用了Universal Link(通用链接)

  8. iOS13中在safari中可以打开相应APP,但是从微信或其他APP中点击去safari怎么就打开了别的APP?

    在iOS13之前在其他APP去safari中打开Universal Link(通用链接)系统匹配域名是全匹配,而在iOS13之后规则发生了变化,猜测是包含关系。比如在iOS13之前,如果Universal Link(通用链接)为w.mydomain.com那么在微信或者其他APP访问www.mydomain.com然后点击去safari打开则不会拉起相应APP,而在iOS13则会拉起相应APP。
    而在safari中输入的链接则依然和iOS之前一样,只有www.mydomain.com才会提示打开相应APP。
    微信文档

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