Universal Links实践总结

3,032 阅读6分钟

Universal Links(通用连接)

当您支持通用链接时,iOS用户可以点击指向您网站的链接,然后无缝链接到已安装的应用程序,而无需通过Safari。
如果未安装您的应用程序,请点击指向您网站的链接以在Safari中打开您的网站。

通用链接为您提供了一些自定义URL方案无法获得的关键优势。
具体来说,通用链接为:

  • 独特。
    与自定义URL方案不同,其他应用无法声明通用链接,因为它们使用指向您网站的标准HTTP或HTTPS链接。

  • 安全。
    当用户安装您的应用程序时,iOS会检查您已上传到Web服务器的文件,以确保您的网站允许您的应用程序代表其打开URL。
    只有您可以创建和上传此文件,因此网站与应用程序的关联是安全的。

  • 灵活。
    即使未安装您的应用程序,通用链接也可以使用。如果未安装您的应用程序,则按用户期望,点击指向您网站的链接可在Safari中打开内容。

  • 简单。
    一个URL既适用于您的网站,也适用于您的应用程序。

  • 私人的。
    其他应用可以与您的应用通信,而无需知道您的应用是否已安装。

注意

通用链接可让用户在点击WKWebViewUIWebView视图和Safari页面中的指向您网站的链接时打开您的应用程序,此外,这些链接还会导致调用openURL:,例如在Mail,Messages和其他应用程序中发生的链接。

当用户在Safari中浏览您的网站时,他们点击指向当前网页所在域中URL的通用链接,iOS会尊重该用户最有可能的意图并在Safari中打开该链接。如果用户点击指向其他域中URL的通用链接,iOS将在您的应用中打开该链接。

对于运行9.0之前的iOS版本的用户,点击指向您网站的通用链接可在Safari中打开该链接。

添加支持通用链接的步骤

1.创建和上传apple-app-site-association文件

文件内容如下:

{
"applinks": {
        "apps": [],
        "details": [
            {
                "appID": "teamID.bundleId",
                "paths": ["/mall/app_download/app","/app_download/app"]
            },
            {
                "appID": "teamID.bundleId",
                "paths": ["/path/app_download/app","/app_download/app","*"]
            }
        ]
    }
}

注意事项:

  1. details里面的内容可以为数组,也就是可以配置多个应用的Universal Links
  2. apple-app-site-association 文件名固定,没有后缀
  3. appID 的 格式为 teamID.bundleId形式
  4. paths配置,实际上就是限制哪些路径可以唤醒app,哪些路径不能唤醒app。一下为path规则:
  • 使用*配置,则整个网站都可以使用
  • 使用特定的URL,例如/xz/user/*来指定某一个特殊的链接
  • 除了使用*来匹配任意字符,你也可以使用 ?来匹配单个字符,你可以在路径当中结合这两个字符使用,例如 /foo/*/bar/201?/mypage
  • 配置的paths路径,是区分大小写的

2.将apple-app-site-association文件上传到您的HTTPS Web服务器。(注:一定是HTTPS Web服务器,并不是API服务器)您可以将文件放置在服务器的根目录或.well-known子目录中。

注意事项:

  • 确保使用https://yourdomain.com/apple-app-site-association这个链接可以访问到,yourdomain.com为你的服务器域名。

  • 也可以使用苹果的验证网站,验证文件是否能被苹果请求到。如果是未上线的应用,使用验证网站时可能出现如下提示:

  • 出现该提示为apple-app-site-association文件配置正确。

  • 出现404错误码提示,则为apple-app-site-association文件未上传成功,或者使用https://yourdomain.com/apple-app-site-association路径无法访问。

需要执行三个步骤:

  • 创建一个apple-app-site-association包含有关您的应用程序可以处理的URL的JSON数
    文件。

  • apple-app-site-association文件上传到您的HTTPS Web服务器。(注:一定是HTTPS Web服务器,并不是API服务器)您可以将文件放置在服务器的根目录或.well-known子目录中。

  • 准备您的应用程序以处理通用链接。

您可以在设备上测试通用链接。

提醒两点:

  1. 如果要在微信里直接唤起App,必须跨域(即当前网页和跳转 App 的连接不能在同一域名下);
  2. 项目里配置的Universal Link和微信开放平台的Universal Link必须保持一致,否则会出现每次分享都出现【正在连接】的二跳情况、“应用校验不通过”等问题。而且修改Universal Link会影响线上版本。

常见问题总结:

问:Universal Link验证不通过,无法调起微信支付?

答:请开发者在调用注册接口前,打开WXApi.h的日志接口,观察报错日志和原因:

+(voidstartLogByLevel:(WXLogLevel)levellogBlock:(WXLogBolock)logBlock

问:接入新SDK,跳到微信后再回跳App,流程就中止?

答:
1.首先,微信唤起应用程序,应用程序一定会收到系统替代。请确认系统替代是方案本身还是通用链接。

2.如果是方案替代,请检查是否走了UISceneDelegate(XCode11构建的项目),或者UIApplicationDelegate。它们的替代方法分别是


-(void)scene :( UIScene  *)scene openURLContexts :( NSSetUIOpenURLContext  *> *)URLContexts;

-(BOOL)application :( UIApplication  *)app openURL :( NSURL  *)url选项:( NSDictionaryUIApplicationOpenURLOptionsKey,  id > *)options;


3.如果是通用链接,那么,同样也检查是否走了UISceneDelegate(XCode11创建的项目),或者UIApplicationDelegate。它们的替代方法分别是

-(void)场景:( UIScene  *)场景continueUserActivity :( NSUserActivity  *)userActivity

-(BOOL)应用程序:( UIApplication  *)应用程序continueUserActivity :( NSUserActivity  *)userActivity restoreHandler :( void(^)(NSArrayidUIUserActivityRest 
oring >> * __ nullable restorableObjects  ))restorationHandler


4.因为考虑兼容旧版本微信,因此无论是方案还是通用链接,都必须处理。在转换方法之后,需要分别调用WXApi的handleOpenUrlhandleOpenUniversalLink方法。


示例:
-(voidscene :( UIScene  *)scene continueUserActivity:(NSUserActivity *)userActivity {
        返回[WXApi handleOpenUniversalLink :userActivity  委托:self


-(BOOL)application :( UIApplication  *)application continueUserActivity:(NSUserActivity *)userActivity restoreHandler :void(^)(NSArrayidUIUserActivityRest
oring >> * __nullable restorableObjects))restorationHandler {
返回[WXApi handleOpenUniversalLink:userActivity委托:self];


【设备类型及SDK版本号】

ios; SDK版本号:1.8.6.1

【用户表现】

app每次分享都出现【正在连接】的二跳情况 或 授权登录页面出现二次确认弹窗。


【符合预期的表现】

用户首次使用SDK内功能时可能会出现上述提示,但每个用户只有首次使用的时候会出现,后续不会再提示。

【错误原因】

开发者在registerApp传入的Universal links不生效,每次分享鉴权通过Universal links回跳app失败,导致微信降级scheme返回app,自动重新发起兜底请求。目前兜底请求可以通过,但微信后续也会逐步拦截。

【原因分析】

Universal links失效,可能原因:

1)工程配置associated domain未打开或未添加Universal links域名
2)配置文件未上线或未按苹果要求放在服务器指定的路径下(域名根目录)
3)配置文件的Universal links的path末尾没有加通配符*
4)配置文件的appID(teamID+bundleID)与实际代码包不匹配

【解决方案】

1. 按微信以及苹果的官方接入文档检查Universal Links配置是否符合要求
2. 确认配置正确后,按微信接入文档内的【SDK接入成功验证指引】逐步验证
微信文档:developers.weixin.qq.com/doc/oplatfo…
苹果文档:developer.apple.com/documentati…