iOS-Universal Link 接入与微信分享的配置

Universal Link 是 iOS9 推出的一项功能,使你的应用(微信,微博等)可以通过传统的HTTPS链接来启动APP,而不是使用 scheme 的方式

在苹果开发者中心配置 Associated Domains

  1. Certificates, Identifiers Profiles
  2. Identifiers
  3. 勾选 Associated Domains
iOS-Universal Link 接入与微信分享的配置_第1张图片
Associated Domains

在 xcode 中启用 Associated Domains

  1. TARGETS
  2. Signing & Capabilities
  3. "+" 添加 Associated Domains

格式为

applinks: + 域名
  • 域名需要为 Https
  • 域名最好不要与 app 接口域名一样,这与微信分享有关
  • apple-app-site-association 文件会存放在此域名的根目录下
iOS-Universal Link 接入与微信分享的配置_第2张图片
Associated Domains

配置 apple-app-site-association 文件

创建一个内容为 json 格式的文件,当我们的App在设备上第一次运行时,如果支持Associated Domains功能,那么iOS会自动去获取上述在xcode 填写的域名下的apple-app-site-association文件。

文件内容大概是这样子:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "ABCD1234.com.company.myApp",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
            },
            
            //多个app
            {
                "appID": "ABCD4321.com.apple.wwdc",
                "paths": [ "*" ]
            }
        ]
    }
}

注意点:

  • apps:是限制只能在这几个app中使用, 基本是不填写,所以是空数组
  • appID:TeamID.Bundle ID(TeamID 可以从开发者中心 -> Membership 中获取)
  • paths:设定你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理。星号代表了可识别域名下所有链接
  • 文件名必须为 apple-app-site-association,且文件无后缀

最后,把该文件上传到在 xcode 中填写的域名的根目录或者 .well-known 目录下,上传后,自己在浏览器访问下该文件目录,如果上传成功,会直接下载该文件。

跳转回 APP 的处理

在 AppDelegate 里实现方法


- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray> * _Nullable))restorationHandler {
    
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        
        NSString *urlStr = userActivity.webpageURL.absoluteString;
        
        if (期望的 url) {
            

        }
        else {
            
        }
    }
    
    return YES;
}

测试

在手机备忘录中输入App能识别的链接,然后直接点击此链接,就会直接跳转到你的app了。或是长按,在出现的弹出菜单中第二项是在’XXX’中打开,这也代表着成功。

能识别的链接可以填写上述在xcode中填写的域名地址,也可以在此域名后面添加别的参数

iOS-Universal Link 接入与微信分享的配置_第3张图片
测试

到这里,基础的 Univarsal Link 的接入已经完成了。

shareSDK 1.8.6 与 Univarsal Link

shareSDK 更新到1.8.6后,微信的API发生了少许变更,其中注册的API需要传一个Universal Link,如果不进行配置,微信无法进行分享,出现以下错误:

-canOpenURL: failed for URL: "weixinULAPI://" - error: "This app is not allowed to query for scheme weixinulapi"

我们要进行以下的一些配置:

xcode 配置
  1. TARGETS
  2. Info
  3. LSApplicationQueriesSchemes 添加一个元素 weixinULAPI
iOS-Universal Link 接入与微信分享的配置_第4张图片
weixinULAPI
微信开放平台配置

在微信开放平台的应用详情中配置 UniVersal Link

格式要求为 https 开头,以“/”结尾,中间就是在 xcode 填写的域名

https://域名/
iOS-Universal Link 接入与微信分享的配置_第5张图片
微信开放平台
代码编写

shareSDK 更新到1.8.6后,微信的 API 增加了 Universal Link 的参数,我们传入在微信开放平台上填写的 Universal Link (例:https://www.myApp.com/)就好。

/*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。
 *
 * 需要在每次启动第三方应用程序时调用。
 * @attention 请保证在主线程中调用此函数
 * @param appid 微信开发者ID
 * @param universalLink 微信开发者Universal Link
 * @return 成功返回YES,失败返回NO。
 */
+ (BOOL)registerApp:(NSString *)appid universalLink:(NSString *)universalLink


/**
 设置微信(微信好友,微信朋友圈、微信收藏)应用信息
 
 @param appId 应用标识
 @param appSecret 应用密钥
 @param universalLink 应用深度连接
 */
- (void)setupWeChatWithAppId:(NSString *)appId appSecret:(NSString *)appSecret universalLink:(NSString *)universalLink;

其他问题

有的手机成功了,有的手机就不行呢?
  • 因为网络波动有可能会导致部分用户第一次安装时,无法下载apple-app-site-association文件,这个只能引导用户删除重装或者在迭代时修改Associated Domains配置告诉系统重新下载apple-app-site-association文件
  • 另外一种可能是苹果服务器抽风导致
服务器换域名了怎么办?

当Associated Domains添加新的 Domains的之后,在app再次启动的时候抓包发现(不需要删除重装),苹果会给新添加的这个Domains发送一个请求,请求新Domain下的apple-app-site-association文件。

也就是说Associated Domains发生改变的话,系统是会知道的,这样就可以在迭代的时候删除旧的域名,添加新的域名了。
另外Domains的配置也可以使用通配符,例如

applinks:*.mywebsite.com
移动端配置好,web端如何配置?

一般从APP内分享出去的网页,可以被苹果用户和安卓用户同时查看,在这里需要由web端使用js判断当前所处的平台以及其系统。

如果是安卓用户,则显示安卓相关提示页面。

如果是苹果用户,那么分两种:

如果是9.0以上的系统,相关的 『在APP内打开』 按钮的链接配置的就是我们的Universal Link(通用链接)了,且该通用链接地址指向的是一个APP下载引导页面,那么当用户安装了APP,即可通过通用链接唤醒APP;如果用户没有安装app,那么就会跳转到通用链接指向的APP下载引导页面,达到最大化的客户导流。

如果是9.0以下的系统,则相应的『在APP内打开』 的按钮就会发一个跳转到我们APP URL Scheme的重定向,以实现在Safari中唤醒我们的APP。

当使用通用链接唤醒APP之后,手机右上角有一个小按钮,那个小按钮只有在iOS10.0以下才有,是可以引导用户跳转到Safari中,名字叫bread crumbs button(面包屑),当然也去不掉,并且当用户点过这个按钮后,再点击Universal Link(通用链接)不会直接打开对应的APP。

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

未跨域导致的,如:分享到微信的链接是https://www.mydomain.com/share.html,然后该网页中的『在APP内打开』 按钮配置的通用链接为https://www.mydomain.com/index.html,域名都是同一个。

跨域的意思是说,通用链接和调用通用链接的网页不要使用同一域名。即如果通用链接域名为www.mydomain.com,则调用通用链接所处的网页域名就不能是www.mydomain.com。

参考文章:
官方文档
iOS 唤起APP之Universal Link(通用链接)
shareSDK与微信配置

你可能感兴趣的:(iOS-Universal Link 接入与微信分享的配置)