我们在微信里查看新闻类APP比如网易新闻、今日头条的文章时,会看到类似于“在APP里查看更多评论”、”在APP里查看原文”的按钮功能,如果用户安装了相应的APP,点击后离开微信,在APP里打开原文。
我们也想做这个需求。安卓貌似没有如此完美的功能可实现。调研了苹果的Universal Link。它是iOS系统级的,不受微信的限制,可以很好的符合我们的需求。
前提准备: iOS系统9.0及以上、在AppStore有已上线应用
官方文档: https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html
具体实现需要后台和iOS开发人员两方面配合实现。
后台方面:
1. 新建一个文件,名为apple-app-site-association,无后缀。内容如下
- {
- "applinks": {
- "apps": [],
- "details": [
- {
- "appID": "A2D7CUJ888.com.mydomain.Star",
- "paths": ["*"]
- }
- ]
- }
- }
2. 我们想要在APP里打开的页面或者Action,域名选定的static.mydomain.com这个子域名。是将此文件扔到服务器域名解析的根目录下。即 http://static.mydomain.com/apple-app-site-association 是能访问的,会将此文件下载到本地。
这还不够。我们需要https://static.mydomain.com/apple-app-site-association,而不是http。
之前我们nginx配置是有配置ssl的。然后自己生成的证书。自己生成证书的过程见我另一篇文章。然而自己生成的证书,是未受信任的。用curl -ihttps://static.mydomain.com/apple-app-site-association 会报错误。于是我们需要申请机构认证的证书。
公司的服务器使用的腾讯云。我想阿里云等其他服务商也有代理申请ssl证书的功能。
https://www.qcloud.com/document/product/400/6814
我们域名是在万网解析的。因此我们选择手动DNS验证。按指引到万网添加 一条类型为TXT的解析
申请下来后,得到用于Nginx配置的两个加密文件XXX.crt和YYY.key
可以配置Nginx了
我的apple-app-site-association文件就是放到/data/apps/resource 下了。
curl -i https://static.mydomain.com/apple-app-site-association
在Universal Link官方文档里有关于检测该文件是否有效的地方。https://search.developer.apple.com/appsearch-validation-tool/
输入文件的地址后
出现 Error no apps with domain entitlements错误。这个问题困扰我一天一夜。因为自己和iOS RD测试一直拉不起来我们的App,不走iOS的代理类。怀疑应该让这里pass才能往下继续测试。事实证明这里出现这个是可以的。之所以没有拉起app是其他地方还有坑。
iOS方面
首先就是要提供bundle ID和 team ID给我了。前面apple-app-site-association文件配置里appID的值就是teamID.bundleID
在XCode的capabilities里添加App域名。我的就是static.mydomain.com了。格式为applinks:static.mydomain.com
然后在代理类里对接收到请求的进行解析和处理了。
然后我们 随便写了个地址 希望他能走进iOS项目调试信息。比如https://static.mydomain.com/ddd 没反应。后来想是不是应该这个地址是存在的才行,于是在服务器上配置了ddd.html文件。微信里点击访问https://static.mydomain.com/ddd.html同样也不行。
最后一个大坑:还是不跳。在一篇文章里记得有提及页面的链接和跳转的链接的域名不能一样。于是我们试了下。在另一个项目(子域名t1.mydomian,com)下建了测试文件。
在微信里首先打开这个页面,然后点击这些static子域名的链接。无论这个链接地址是不是404的,都成功了!!
这样以后就可以处理业务需求了。url里带action.cmd的,解析action参数,打开APP后按照既定的action跳转到各个native页, 不带的直接跳转链接对应的HTML5页。