# iOS 接入指南

注 1:接入 Open SDK 的开发者,请先认真阅读《微信 Open SDK 个人信息处理规则》《微信 Open SDK 开发者合规使用指南》,并确保对 OpenSDK 的接入使用情况符合上述指南中的相关要求。

注 2:SDK 更新日志可前往《微信 Open SDK for iOS 更新日志》查看。

# 关于 OpenSDK 1.8.6 及以上版本的更新说明

由于苹果 iOS 13 系统版本安全升级,为此 OpenSDK 在 1.8.6 及以上版本进行了适配。1.8.6 及以上版本支持 Universal Links 方式跳转,对 OpenSDK 分享进行合法性校验。

建议开发者接入新版本 SDK,覆盖测试微信 7.0.7 或以上版本、iOS 12 或 13,以验证所使用的接口的功能性和可用性。

目录

# 关于老版本 OpenSDK 中使用的 openUrl 接口说明

  • 由于老版本 SDK 中使用的 openUrl 接口为系统废弃接口,如开发者在 iOS 18 升级 Xcode 16 进行打包,则会偶现 SDK 无法拉起微信的问题
  • 该问题已经在 2.0.4 的版本换新接口。因此,请近期有发版计划的开发者及时更新到 2.0.4,避免影响用户日常使用

# SDK 接入成功验证指引

环境要求

项目 要求
SDK 版本 1.8.6 或以上
微信版本 7.0.7 或以上
系统版本 iOS 12 或以上

首先,确认微信(7.0.7 或以上版本)的 Universal Links 在设备上正常,以确保 OpenSDK 与微信双向使用 Universal Links 通信。

Safari 输入:

https://help.wechat.com/app/

下拉查看是否有打开微信入口(如下图)。若无入口,可能是由于系统拉取微信 Universal Links 失败,请检查手机网络状态是否正常,或更新/重装微信。

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

建议 Universal Links 配置 path,例如 /app/*,避免全域命中 Universal Links 跳转。

以 SDK Sample 配置为例:

{ "appID": "teamID.com.tencent.xin.SDKSample", "paths": ["/sdksample/*"] }

测试配置是否成功:

1)Safari 输入 Universal Links(包括完整路径)+ 随机字符串(例如:abc)

SDK Sample 的 Universal Links:

https://help.wechat.com/sdksample/

测试输入 Safari 的 Universal Links:

https://help.wechat.com/sdksample/abc

2)下拉页面检查是否有打开 app 的入口提示(如下图)

# 3. 连续发起分享,确认不会发生多次二次跳转行为

当用户首次使用新版本 SDK 发起分享时,将会出现如下交互流程:从 App 拉起微信 → 出现「正在连接」页面 → 返回 App → 重新打开微信。以上是新的安全验证流程,每个用户在首次使用时会出现上述跳转。(如同一用户多次使用分享都出现跳转,请按照以下接入指引,检查 Universal Links 配置)

# 4. 如 App 有使用微信授权登录功能,确认授权不出现二次确认弹窗

授权登录如出现以下二次确认弹窗,原因是微信无法通过 App 提供的 Universal Links 返回导致,很可能是 App 的 Universal Links 不生效,请按照接入指引检查 Universal Links 配置。

# SDK 接入指引

请注意红字部分配置。

1)根据 苹果文档 配置你应用的 Universal Links

微信对 Universal Links 配置要求:

a)Universal Links 必须支持 https

b)Universal Links 配置的 paths 不能带 query 参数

c)微信使用 Universal Links 拉起第三方 App 时,会在 Universal Links 末尾拼接路径和参数,因此 App 配置的 paths 必须加上通配符 /*

示例:

{
    "appID": "8P7343TG54.com.tencent.xin.SDKSample",
    "paths": ["/sdksample/*"]
}

2)打开 Associated Domains 开关,将 Universal Links 域名加到配置上

3)检查确认 App 的 Universal Links 配置成功,通过上述 SDK 接入成功验证指引 操作

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将获得 AppID,可立即用于开发。但应用登记完成后还需要提交审核,只有审核通过的应用才能正式发布使用。

# 3. 下载微信终端 SDK 文件

SDK 文件包括 libWeChatSDK.aWXApi.hWXApiObject.h 三个。如选用手动集成,请前往 资源下载页 下载最新 SDK 包。

# 4. 搭建开发环境

# 4.1 通过 CocoaPods 集成

1)在 Xcode 中建立你的工程。

2)在工程的 Podfile 里面添加以下代码:

pod 'WechatOpenSDK-XCFramework'

保存并执行 pod install,然后用后缀为 .xcworkspace 的文件打开工程。

注意:命令行下执行 pod search WechatOpenSDK-XCFramework,如显示的版本不是最新的,则先执行 pod repo update 操作更新本地 repo 的内容。

若接入 .a 静态库版本的 OpenSDK,此处请参考 差异点说明

关于 CocoaPods 的更多信息请查看 CocoaPods 官方网站

3)在 Xcode 中,选择你的工程设置项,选中「TARGETS」一栏,在「info」标签栏的「URL type」添加「URL scheme」为你所注册的应用程序 id(如下图所示)。

4)在 Xcode 中,选择你的工程设置项,选中「TARGETS」一栏,在「info」标签栏的「LSApplicationQueriesSchemes」添加 weixinweixinULAPIweixinURLParamsAPI(如下图所示)。

经验证,在 iOS 15 系统上,使用 Xcode 13 编译出的 App,LSApplicationQueriesSchemes 的数量会限制为 50 个。第 50 个之后的 scheme 配置会不生效,需要确保 weixinweixinULAPIweixinURLParamsAPI 配置在 LSApplicationQueriesSchemes 的前 50 个。

5)在你需要使用微信终端 API 的文件中 import WXApi.h 头文件,并增加 WXApiDelegate 协议。

#import <UIKit/UIKit.h>
#import <WechatOpenSDK/WXApi.h> // (SDK 版本 >= 2.0.5)
// #import <WXApi.h> // 旧版本 SDK 的导入方式(SDK 版本 < 2.0.5)

@interface AppDelegate : UIResponder<UIApplicationDelegate, WXApiDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

若接入 .a 静态库版本的 OpenSDK,此处请参考 差异点说明

# 4.2 手动集成

1)在 Xcode 中建立你的工程。

2)将 WechatOpenSDK-XCFramework.xcframework 文件添加到你所建的工程中(如下图所示,建立了一个名为 Test 的工程,并把以上文件添加到 Test 文件夹下)。

(注:请使用 Xcode 4.5 及以上版本)

添加完成后,在 Xcode 中,选择你的工程设置项,选中「TARGETS」一栏,能够看到「General」下的「Frameworks, Libraries, and Embedded Content」和「Build Phases」下的「Link Binary With Libraries」中有 WechatOpenSDK-XCFramework.xcframework

若接入 .a 静态库版本的 OpenSDK,此处请参考 差异点说明

3)开发者需要在工程中链接上:Security.frameworkCoreGraphics.frameworkWebKit.framework

4)在你的工程文件中选择「Build Setting」,在「Other Linker Flags」中加入 -ObjC -all_load

(注:请使用 Xcode 4.5 及以上版本)

5)在 Xcode 中,选择你的工程设置项,选中「TARGETS」一栏,在「info」标签栏的「URL type」添加「URL scheme」为你所注册的应用程序 id(如下图所示)。

6)在 Xcode 中,选择你的工程设置项,选中「TARGETS」一栏,在「info」标签栏的「LSApplicationQueriesSchemes」添加 weixinweixinULAPIweixinURLParamsAPI(如下图所示)。

经验证,在 iOS 15 系统上,使用 Xcode 13 编译出的 App,LSApplicationQueriesSchemes 的数量会限制为 50 个。第 50 个之后的 scheme 配置会不生效,需要确保 weixinweixinULAPIweixinURLParamsAPI 配置在 LSApplicationQueriesSchemes 的前 50 个。

7)在你需要使用微信终端 API 的文件中 import WXApi.h 头文件,并增加 WXApiDelegate 协议。

#import <UIKit/UIKit.h>
#import <WechatOpenSDK/WXApi.h> // (SDK 版本 >= 2.0.5)
// #import <WXApi.h> // 旧版本 SDK 的导入方式(SDK 版本 < 2.0.5)

@interface AppDelegate : UIResponder<UIApplicationDelegate, WXApiDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

若接入 .a 静态库版本的 OpenSDK,此处请参考 差异点说明

# 5. 在代码中使用开发工具包

1)要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 id。(如下所示,在 AppDelegate 的 didFinishLaunchingWithOptions 函数中向微信注册 id)。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 向微信注册
    [WXApi registerApp:APP_ID universalLink:UNIVERSAL_LINK];
    return YES;
}

2)重写 AppDelegate 的 handleOpenURLopenURL 方法:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [WXApi handleOpenURL:url delegate:self];
}

3)重写 AppDelegate 或 SceneDelegate 的 continueUserActivity 方法:

注意:适配了 SceneDelegate 的 App,系统将会回调 SceneDelegate 的 continueUserActivity 方法,所以需要重写 SceneDelegate 的该方法。

AppDelegate:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
    return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}

SceneDelegate:

- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
    [WXApi handleOpenUniversalLink:userActivity delegate:self];
}

4)现在,你的程序要实现和微信终端交互的具体请求与回应,因此需要实现 WXApiDelegate 协议的两个方法:

-(void) onReq:(BaseReq*)req

是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用 sendRsp 返回。在调用 sendRsp 返回时,会切回到微信终端程序界面。

-(void) onResp:(BaseResp*)resp

如果第三方程序向微信发送了 sendReq 的请求,那么 onResp 会被回调。sendReq 请求调用后,会切到微信终端程序界面。

具体在此两方法中所要完成的内容由你定义,具体可参考微信开发工具包中的 SDK Sample Demo 源码。

5)如果你的程序要发消息给微信,那么需要调用 WXApi 的 sendReq 函数:

+ (void)sendReq:(BaseReq *)req completion:(void (^__nullable)(BOOL success))completion;

其中 req 参数为 SendMessageToWXReq 类型。

需要注意的是,SendMessageToWXReqscene 成员:如果 scene 填 WXSceneSession,消息会发送至微信的会话内;如果 scene 填 WXSceneTimeline,消息会发送至朋友圈;如果 scene 填 WXSceneFavorite,消息会发送到「我的收藏」中。scene 默认值为 WXSceneSession

至此,你已经能使用微信终端 SDK 的 API 内容了。如果想更详细了解每个 API 函数的用法,请查阅官网 API 文档或自行下载阅读 微信 SDK Sample Demo 源码

# 使用 SDK 自检函数排查接入问题

SDK 1.8.7 版本,WXApi 新增了自检函数 checkUniversalLinkReady:,帮助开发者排查 SDK 接入过程中遇到的问题。

注意事项:

1)调用自检函数之前必须要先调用 registerApp:universalLink 接口,并确认调用成功

2)自检过程中会有 Log 产生,可以先调用 startLogByLevel 函数,根据 Log 排查问题

3)会多次回调 block

4)仅用于新接入 SDK 时调试使用,请勿在正式环境中调用

示例代码:

// 在 register 之前打开 log,后续可以根据 log 排查问题
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
    NSLog(@"WeChatSDK: %@", log);
}];

// 务必在调用自检函数前注册
[WXApi registerApp:APP_ID universalLink:UNIVERSAL_LINK];

// 调用自检函数
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
    NSLog(@"%@, %u, %@, %@", @(step), result.success, result.errorInfo, result.suggestion);
}];

WXULCheckStep 值说明:

Step 说明
WXULCheckStepParams 参数检查
WXULCheckStepSystemVersion 当前系统版本检查
WXULCheckStepWechatVersion 微信客户端版本检查
WXULCheckStepSDKInnerOperation 微信 SDK 内部操作检查
WXULCheckStepLaunchWechat App 拉起微信检查
WXULCheckStepBackToCurrentApp 由微信返回当前 App 检查
WXULCheckStepFinal 最终检查

会依次回调这 7 个 step,当回调了 WXULCheckStepFinal,说明检测通过,SDK 接入成功。任一 step 回调的 result.success 为 NO,流程终止,后续不再回调,可以根据 result.errorInfo 查看当前步骤错误的原因,根据 result.suggestion 修复问题。