iOS Universal Links踩坑之旅

20191031关于Universal Links appID的取值说明,见下面文章内容


自从微信7.0.5版本放开 Universal Links之后,就把这种无缝唤醒App的方式提上日程了(主要是遇到每一个测试都要解释一下schemes的缺点,太烦了)。通过链接跳转到App应用内部页面,目前iOS主流的方案有两个:

  1. URL Schemes
  2. Universal Links

需求

如果手机中有安装App则跳转到App内部页面,没有安装App的话,则应跳转到App Store下载页面或指定页面。

URL Schemes

URL Schemes是iOS9之前比较主流的一种跳转方案了,更多的是用在了两个App相互跳转中。也可以在Safari中输入Schemes://跳转到App内部。 例如weixin://

但是这种方式很不顺滑,在每次跳转的时候都会弹框询问。如果iPhone中如果没有安装则会直接弹出错误提示(这也是每次测试说这个是缺陷的时候我要解释N遍的苦恼),而且微信也封了这种跳转,现在微信放开Universal Links就赶紧开干。

Universal Links

如果英文棒棒哒的话建议直接看官方文档 Support Universal Links

Universal Links(通用链接)是iOS9.0出的新技术。如果我们的应用支持通用链接,那么我们就可以无缝的链接到App内部,流畅的跳转体验,简易的接入方式,同时又解决H5Native间的无缝切换;对于应用层面,站外引流效率提高(手机中没有安装此App),转化率提高等等。
从iOS 9.2开始,在相同的domainUniversal Links是不work的,必须要 跨域 才生效,实测值需要跨子域名即可,比如 m.domain.com 跳转 o.domain.com 是可以触发跳转App

使用条件
1.有一个注册的域名。
2.支持https请求,并且CA证书是有效的
3.能够上传文件到自己的域名(一个名为apple-app-site-association的json格式文件)
4.Xcode7, iOS 9以上,并且在Xcode项目中做好适配
1.准备接入工作
  • 首先是将项目中CapabilitiesAssociated Domains打开,并填上你的域名,前缀是applinks。如果你的域名是mywebsite.com,则填上applinks:mywebsite.com(如图1)。
    App会在第一次启动的时候通过填写的域名来下载apple-app-site-association文件,该文件会在接下来说明。

    图1

  • 配置后会发现项目中多了一个APPNAME.entitlements文件(如图2)

    图2

  • 然后去开发者中心当前证书下打开Associated Domains开关,并更新一下证书

    图3

  • 同时把Team ID记录下来,下面会用到

    图4

2.创建apple-app-site-association文件

创建一个apple-app-site-association文件(注意是没有后缀的),其内容是json格式,官方示例如下

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
            },
            {
                "appID": "ABCD1234.com.apple.wwdc",
                "paths": [ "*" ]
            }
        ]
    }
}
特别需要注意:(这个坑搞了我好几天,最后发现还是官方文档靠谱)

The value of the appID key is the team ID or app ID prefix, followed by the bundle ID. (The appID value is the same value that’s associated with the “application-identifier” key in your app’s entitlements after you build it.)

appID 的 格式为 teamID.bundleId或者app ID prefix.bundleId形式,切记不要搞错!!很多文档只是说teamID,但是官方文档是说team ID or app ID prefix,不知道用哪个的时候你可以把你编译之后的包解压看看embedded.mobileprovision文件里面的application-identifier值是什么就用什么。
比如说我的teamID9JA89QQLNQbundleIdcom.apple.wwdc那么我的appID就是:9JA89QQLNQ.com.apple.wwdc

paths的配置,实际上就是限制哪些路径可以唤醒App,哪些路径不能唤醒App,其中 * 表示任意路径

3.上传apple-app-site-association文件

apple-app-site-association文件保存的位置

4.检查配置文件是否正常

1.使用浏览器打开我们上传的文件路径,应该可以直接看到刚刚上传的json文件。
https://mywebsite.com/apple-app-site-association
或者
https://mywebsite.com/.well-knowna/apple-app-site-association

坑1:注意:这里在浏览器打开应该是可以看到json格式的文件内容,在这里被坑好久,如果不是,则要修改此文件服务器的返回格式 修改nginx返回json或者文本格式详解

2.苹果也提供了一个官方网页供我们开发者来验证自己的网页配置是否有效。
验证地址:App Search API Validation Tool

3.终极办法-使用Charles进行抓包查看有没有下载

5.如果第四步没问题就可以编译App来检查

坑2:clean一下Xcode再跑,不然有时候Xcode抽风了你还以为是服务器配置错了
坑3:如果你配的是applinks:www.mywebsite.com则要用这个链接唤醒:https://www.mywebsite.com/.well-knowna/apple-app-site-association
如果你配的是applinsk:mywebsite.com则要用这个链接唤醒:https://mywebsite.com/.well-knowna/apple-app-site-association,切记切记!

在备忘录输入你配的对应域名,点击可直接跳转到App,长按会显示(在“AppName”中打开)。


图5

这样就成功啦!

问题汇总:

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

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

  • 在项目的 AppDelegate 里实现回调方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler
{
    if ([userActivity.activityType   isEqualToString:NSUserActivityTypeBrowsingWeb]) {

      NSURL *webpageURL = userActivity.webpageURL;
      NSString *host = webpageURL.host;

      if ([host isEqualToString:@"xxxx.com"]) { 
        // 解析路径、跳转到指定界面 and so on...
    }
    else {
      [[UIApplication sharedApplication]openURL:webpageURL];
    }
  }
  return YES;
}

扩展阅读:
Universal Link(iOS)踩坑

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

推荐阅读更多精彩内容