集成新版微信SDK遇到的坑

5,789 阅读6分钟

最近在继承最新版本微信 SDK 的时候,碰到很多坑。前期总以为是配置 Universal Links 的问题,结果并不是。实际上,只要 universalLink 和开放平台上的配置一致,就完全不会影响正常的基本使用。

新旧版本的分界线是 SDK1.8.6.1。而这次的另一个大更新是将 UIWebView 换成 WKWebView ,而 UIWebView 苹果已经不推荐使用,也许今后某个时刻,他会有上架的政策风险。

微信使用第三方App的 Universal Links 唤起第三方App时,会在Universal Links末尾拼接路径和参数,因此开发者Universal Links配置必须加上通配符,并测试Universal Links拼接字符串能否唤起app

相应的在新版本 SDK 中,初始化函数有了变化,增加了 universalLink 这个参数。

+ (BOOL)registerApp:(NSString *)appid universalLink:(NSString *)universalLink;

初始化失败

我们在使用 SDK 任意功能之前,必须先 registerApp:universalLink: 方法,并且保证成功返回了 true。

当你在初始化步骤总是失败时,先不要怪 universalLink。我们需要在初始化之前,开启日志打印来帮助我们分析错误原因。

WXApi.startLog(by:.detail) { (msg) in
    print(msg)
}
let isRegist = WXApi.registerApp("wx920891c1027285da", universalLink: "https://www.ccsobj.com")

值得注意的是 startLog 放在后面,初始化过程中发生的错误是不会打印出来的。

不要遗漏 scheme weixinULAPI

我们知道,需要调起微信 SDK 必须在 info.plist 的 LSApplicationQueriesSchemes 中添加微信的 scheme。微信之前用的是 weixin 。在新版本中增加了 weixinULAPI。从字面意思推测是专门为 UniversalLink 设计的,UL 就是其简称。在调起 微信app 的时候,如果 scheme 是 weixinULAPI,微信会进行有关 UniversalLink 相关检验。

微信 SDK 在初始化的时候会检测 info.plist 的相关配置,如果遗漏了,会出现下列提示。

WeChat scheme(weixinULAPI) is not be added to LSApplicationQueriesSchemes in plist

值得注意的是,scheme 是严格区分大小写的,ULAPI 请确保是大写。

universalLink 与开放平台配置不一致

在初始化 SDK 的时候,是不会检验 universalLink 的有效性的。当我们第一次调起微信的时候,首先会检验 universalLink 和开放平台的配置是不是一致的。如果不一致,会弹窗提示

由于 universal link 检验不通过

再次拉起 app

当 universalLink 和开放平台的配置一致之后,微信会尝试使用这个链接唤起我们的app。当用尝试失败之后,会用传统的 URL scheme 的方法调起我们的app。

而当微信成功用我们提供的 universalLink 调起我们的 app 之后。微信会缓存这个 universalLink ,下次再调起微信的时候就不会进行这一步骤了。

在这一步骤中,会出现下面画面

img

当我们发现,出现这个画面,返回 app 的时候就没有反应了。请确保在返回 app 的使唤调用了 WXApi.handleOpenUrl 方法。

首先,正常流程,用 universalLink 返回,需要监听 appdelegate 的下列方法:

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

如果 universalLink 打开失败,需要监听下列方法:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {}

配置 UniversalLink

就像之前所说的,UniversalLink 只要和微信开放平台保持一致,及时是一个假链接也不会影响我们正常的功能使用。这是微信 SDK 人性化的一方面。

当时我们还是不希望,整天出现正在连接这个页面,而且要在 app 之间来回跳几次。而且 UniversalLink 这个 iOS 9 就有的技术,我们也该抽空配置一下了。

网站配置 apple-app-site-association 文件

出于安全考虑,在配置 Universal Link 时,我们的服务器必须支持 HTTPS。

为了说明问题方便,我们假设我们的服务器域名为 www.exsample.com。我们的苹果开发者账号的TeamId是 TEAMID,我们app的bundleId是 com.exsample.testapp

配置方式简单来说,就是将一个特定的 apple-app-site-association 文件放到我们服务的根目录。也就说用 www.exsample.com/apple-app-s… 访问,返回的是指定的格式的 json 文件。

apple-app-site-association 文件的结构如下:

{
"applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TEAMID.com.exsample.testapp",
                "paths": ["/myapp/*"]
            }
        ]
    }
}

其中 appID 为我们开发者账号的TeamId和应用bundleId的拼接。paths指定我们Universal Link的子路径。如果 Universal Link 使用服务的根目录,那么使用通配符 * 就可以了,那样的话访问我们服务的任何路径,都会展示是否跳转 app 的提醒。我们一般会配置在某个字路径下。如果 Universal Link 是 https://www.exsample.com/myapp/,那么path 就是/myapp/* 。应当确保这个链接是可以访问的,当我们访问这个链接,或者这个链接的任意子路径时,如果完成所有配置,会展示是否跳转 app 的提醒。

app的配置

我们首先需要在项目的 Capability 中增加Associated Domains。在配置时,我们可以新增多个 Domains。

applinks:www.exsample.com

必须以 applinks: 开头,后面是我们的服务器的域名。

配置完成之后会为我们自动生成一个 .entitlements 文件。

配置完成之后,我们需要在手机上运行一下。

检验是否配置成功

经过上面两个简单的配置之后,我们就基本完成了 Universal Link 的配置。看起来很简单,但是第一次配置的话,坑还是比较多的。

想要看看是否配置成功,最简单的方式是直接打开 safari 输入 https://www.exsample.com/myapp/,也就是我们所配置的完整路径。如果发现顶部有个横幅,提示是否打开某某app,那么我们就大功告成了。如果看不到,可以尝试下滑到页面最顶部。

可能遇到的问题

如果你依然无法配置成功,请检查:

  • apple-app-site-association 文件名必须正确,并且不能有 .json 后缀。
  • 查看 https://域名/apple-app-site-association 是否能访问到我们上传的 json 文件。如果不行,需要请后端同学帮忙
  • apple-app-site-association 文件的配置是否正确,也就是 appID 和 paths 是否正确。尤其是 path。
  • app项目中 Associated Domains 的 Domains 是否配置正确
  • 配置完成之后你必须在手机上运行起来,才可以。只有在运行着指定app的手机上,才能看到效果。
  • 配置完第一次运行app之后,可能还需要等待一小段时间才可以生效。
  • 微信使用Universal Links拉起第三方App时,会在Universal Links末尾拼接路径和参数,因此App配置的paths必须加上通配符/*