2.网站验证
上传之后,可以访问 search.developer.apple.com/appsearch-v…,苹果专门提供的验证工具,然后将域名网址填进去,例如 https://www.lazypig.net/
,然后点击测试。
下面如果显示的是 Passed,那就证明符合规则,如果有不合规则的可以参考下面的修正。
3.网站不合规则的修正方法
3.1 Title 不符合规则
在首页的 header
标签中增加 <title>
标签,例如:
<head> <title>胡东东博客</title> …… </head>
3.2 Description 不符合规则
在首页的 header
标签中增加 description
标签,例如:
<head> <meta name="description" content="胡东东博客,分享手游和app开发的日常点滴" /> …… </head>
3.3 Image不符合规则
在首页的 header
标签中增加 og:image
标签,例如:
<head> <meta property="og:image" content="https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png?where=super" /> …… </head>
3.4 Touch Icon不符合规则
在首页的 header
标签中增加 apple-touch-icon
标签,例如:
<head> <link rel="apple-touch-icon" href="/static/quick0012.png"> …… </head>
3.5 Link to Application Action required
这个基本是因为app还没有上架,上架审核通过之后发布即可。
4.显示验证
可以打一个测试包安装到手机,然后用 safari
浏览器打开指定的网页即可看到飘窗,例如打开 www.lazypig.net/app/lazypig…,就会看到 懒猪时间盒
的打开飘窗。
网页配置
网页中对需要唤起 App 的按钮或者控件添加点击事件,事件的函数代码如下:
function wakeUpApp(){ if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { var loadDateTime = new Date(); window.setTimeout(function() { var timeOutDateTime = new Date(); if (timeOutDateTime - loadDateTime < 5000) { window.location.href = "http://a.app.qq.com/o/simple.jsp?pkgname=你的应用宝BundleID"; } else { window.close(); } }, 25); window.location.href = "https://yourdomainname.com/"; } else if (navigator.userAgent.match(/android/i)) { var state = null; try { state = window.open("apps custom url schemes ", '_blank'); } catch(e) {} if (state) { window.close(); } else { window.location.href = "要跳转的页面URL"; } } }
注:代码中 yourdomainname.com 还可以后面添加 /goodid/123456 之类的属性id后缀,用来传递事件类型和 id,方便移动端做更丰富的功能需求,比如通过 goodid 识别要做的下一步动作是打开商品 id 为123456 的商品详情页,等等。
测试一下
配置完成,查看是否能唤起 App,也可以通过如下图中,输入域名,长按来唤起 App 做验证。
网站向 App 传值
在 AppDelegate
中,可以通过回调函数获取网站向 App 传的链接,通过链接做不同的逻辑处理。
Swift 代码实现
//从通用链接进来 func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb { if let url = userActivity.webpageURL { print("从通用链接进入app",url.absoluteString) } } return true; }
Objective-C 代码实现
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSURL *url = userActivity.webpageURL; if (url是我们希望处理的){ //进行我们的处理 } } return YES; }
注意点
1.Universal Link 有跨域问题
Universal Link 必须要求跨域,如果不跨域,就不会跳转(iOS 9.2 之后的改动) 假如当前网页的域名是 A,当前网页发起跳转的域名是 B,必须要求 B 和 A 是不同域名才会触发 Universal Link,如果 B 和 A 是相同域名,只会继续在当前 WebView 里面进行跳转,哪怕你的 Universal Link 一切正常,根本不会打开 App。
前端开发经常面临跨域问题,恩 Universal Link 也有跨域问题,但不一样的是,Universal Link 必须要求跨域,如果不跨域,就不行,就失效,就不工作。
iOS 9.2之后的改动,苹果就这么规定这么设计的~
这也是上面拿知乎举例子的时候重点强调的一个问题,知乎为什么使用 oia.zhihu.com
做 Universal Link?
- 假如当前网页的域名是 A
- 当前网页发起跳转的域名是 B
- 必须要求 B 和 A 是不同域名,才会触发Universal Link
- 如果B 和 A 是相同域名,只会继续在当前WebView里面进行跳转,哪怕你的Universal Link一切正常,根本不会打开App
是不是不太好理解,那直接拿知乎举例子,知乎的一般网页 URL 都是 www.zhihu.com
域名,你在微信朋友圈看到了知乎的问题分享,如果 copy url 你就能看到这样的链接:www.zhihu.com/question/22…
微信里其实是屏蔽 Schema 的,但是你依然能看到大大的一个按钮 App内打开
,这确实就是通过 Universal Link 来实现的,但如果知乎把 Universal Link 配在了 www.zhihu.com
域名,那么即便已经安装了 App,Universal Link 也是不会生效的。
一般的公司都会有自己的主域名,比如知乎的 www.zhihu.com
,在各处分享传播的时候,也都是直接分享基于主域名的 url,但为了解决苹果强制要求跨域才生效的问题,Universal Link 就不能配置在主域名下,于是知乎才会准备一个 oia.zhihu.com
域名,专为 Universal Link 使用,不会跟任何主动传播分享的域名撞车,从而在任何活动 WAP 页面里,都能顺利让 Universal Link 生效。
简单一句话
- 只有当前 webview 的 url 域名,与跳转目标 url 域名不一致时,Universal Link 才生效。
2.Universal Link 请求 apple-app-site-association 时机
当我们的 App 在设备上第一次运行时,如果支持 Associated Domains 功能,那么 iOS 会自动去 GET 定义的 Domain 下的 apple-app-site-association 文件。
iOS 会先请求 domain.com/.well-known…domain.com/apple-app-s… GET 请求,可以直接把 apple-app-site-association放在./well-known 目录下。
服务器上 apple-app-site-association 的更新不会让 iOS 本地的 apple-app-site-association 同步更新,即 iOS 只会在 App 第一次启动时请求一次,以后除非 App 更新或重新安装,否则不会在每次打开时请求 apple-app-site-association。
3.apple-app-association 被覆盖后如何更新
线上已经工作的 Universal Link 功能,突然有一天发现坏了,查了一圈最后查到被覆盖了,那就修复呗,修复倒是没问题,问题在于修复后的 Universal Link,用户必须重新安装一次 App,才能重新生效。
所以关键是需要掌握 apple-app-association 的更新时机,反复重新杀 App 重开完全没用,删了 App 重装确实有用,但不可能让用户这么去做。
stackoverflow.com/questions/3…
这里解释了,每次 App 安装后的第一次 Launch,会拉取 apple-app-association,除此之外在 AppStore 每次 App 的版本更新后的第一次 Launch,也会拉取 apple-app-association。
也就是说,一旦不小心因为意外 apple-app-association,想要挽回又让那部分用户无感,App 再发一个版本就好了。