iOS Universal Links / 2020-03-29

上周,微信开发者公众号发布了《微信开放平台移动应用 SDK 更新提醒》的文章,提醒开发者升级微信iOS SDK,以适配iOS 13系统版本的更新,主要是Universal Links的适配。

对于开发者来说,本次更新主要涉及到Universal Links的适配。Universal Links并不是新技术,早在iOS 9系统上就已经在应用了。在微信openSDK 1.8.6版本之前,iOS APP使用的微信登录、分享功能借助的是URL scheme的通信方式,在1.8.6版本后,则采用了Universal Links方式对调用openSDK的合法性进行校验。和URL scheme方式相比,Universal Links方式操作更加安全便捷。

Universal Links的原理比较好理解:iOS APP可以配置支持applinks的Associated Domains,在APP安装或更新时,系统会从指定域名的.well-known/apple-app-site-association路径访问Universal Links配置。Universal Links配置指示了APP能处理的该域名下的路径(可以是一个或多个),也就是该域名的指定路径和APP的内容有对应的关系。当从Safari中访问该域名下的指定路径时,iOS系统会查询当前url是否在APP有注册,有的话就可以直接打开对应APP的内容。

微信openSDK iOS接入指南,有详细的配置说明,这里只谈几个需要注意的点。

Universal Links的格式

通过以下方式访问apple-app-site-association:

https://<fully qualified domain>/.well-known/apple-app-site-association

在iOS 13系统上,最新的apple-app-site-association格式有变动:

{
  "applinks": {
      "details": [
           {
             "appIDs": [ "ABCDE12345.com.example.app", "ABCDE12345.com.example.app2" ],
             "components": [
               {
                  "/": "/buy/*",
                  "comment": "Matches any URL whose path starts with /buy/"
               }
               ...
             ]
           }
       ]
   }
}

这个格式和iOS 12使用的格式不一样。

iOS APP的配置和处理

在正确配置了Associated Domains之后,在AppDelegate的

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Swift.Void) -> Bool

将会收到Universal Links的调用,在这个方法中根据不同的请求url调用APP页面。

确保Universal Links生效

保持手机网络畅通,更新或重装APP,以便iOS 系统能拉取到最新的Universal Links配置(也就是请求https://<fully qualified domain>/.well-known/apple-app-site-association)。

如何验证Universal Links生效

可以使用iOS自带的备忘录程序,输入链接,长按链接,如果弹出菜单中有”在‘xxx’中打开”,即表示配置生效。

微信开放平台的Universal Links如何填写?

微信开放平台的Universal Links应该是一个不带参数的url,路径可以根据需要自定义,比如:https://<fully qualified domain>/wechat/,同时需要在apple-app-site-association文件配置一项/wechat/*

参考

Supporting Associated Domains in Your App

其它文章

iOS Asset Catalog and Bundle
iOS系统如何获取用户的本机手机号
iOS Crash log符号化
iOS:IDFV(identifierForVendor)使用陷阱