# iOS接入指南
注 1:接入Open SDK的开发者,请先认真阅读《微信Open SDK个人信息处理规则》并确保对OpenSDK的接入使用情况符合上述规则的相关要求。
# 关于 OpenSDK1.8.6 及以上版本的更新说明
由于苹果iOS 13系统版本安全升级,为此openSDK在1.8.6及以上版本进行了适配。 1.8.6及以上版本支持Universal Links方式跳转,对openSDK分享进行合法性校验。
*建议开发者接入新版本SDK, 覆盖测试微信7.0.7或以上版本、iOS12或13,以验证所使用的接口的功能性和可用性。
# 目录
# 关于老版本 OpenSDK 中使用的 openUrl 接口说明
- 由于老版本 SDK 中使用的 openUrl 接口为系统废弃接口,如开发者在 iOS18 升级 Xcode16 进行打包,则会偶现SDK无法拉起微信的问题。
- 而该问题已经 在 2.0.4 得 版本换新接口。因此,请近期有发版计划的开发者及时更新到2.0.4,避免影响用户日常使用
# SDK接入成功验证指引
# 环境
SDK版本: SDK1.8.6或以上
微信版本: 7.0.7或以上
系统版本: iOS12或以上
# 1.确认微信的Universal Links正常
首先,确认微信(7.0.7或以上版本)的Universal Links在设备上正常,以确保openSDK与微信双向使用Universal Links通信
Safari输入
https://help.wechat.com/app/
下拉查看是否有打开微信入口(如下图)。若无入口,可能是由于系统拉取微信Universal Links失败,请检查手机网络状态是否正常,或更新/重装微信
# 2.确认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
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接入成功验证指引操作
# 2.向微信注册你的应用程序id和Universal Links
请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将获得AppID,可立即用于开发。但应用登记完成后还需要提交审核,只有审核通过的应用才能正式发布使用。
# 3.下载微信终端 SDK 文件
SDK 文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。 如选用手动集成,请前往资源下载页下载最新 SDK 包
# 4.搭建开发环境
# 4.1 通过 CocoaPods 集成
[1] 在 Xcode 中建立你的工程。
[2] 在工程的 Podfile 里面添加以下代码:
pod 'WechatOpenSDK-XCFramework'
保存并执行 pod install,然后用后缀为.xcworkspace 的文件打开工程。
注意:
命令行下执行 pod search WechatOpenSDK-XCFramework,如显示的 WechatOpenSDK-XCFramework 版本不是最新的,则先执行 pod repo update 操作更新本地 repo 的内容
若接入.a静态库版本的OpenSDK,此处请参考差异点说明。
关于 CocoaPods 的更多信息请查看 CocoaPods 官方网站 。
[3] 在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序 id(如下图所示)。
Xcode 设置 URL scheme
[4] 在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在 “info”标签栏的“LSApplicationQueriesSchemes“添加weixin、weixinULAPI、weixinURLParamsAPI(如下图所示)。
经验证,在iOS 15系统上,使用Xcode 13编译出的App,LSApplicationQueriesSchemes的数量会限制为50个。第50个之后的scheme配置会不生效,需要确保"weixin"、"weixinULAPI"和"weixinURLParamsAPI"配置在LSApplicationQueriesSchemes的前50个。
[5] 在你需要使 用微信终端 API 的文件中 import WXApi.h 头文件,并增加 WXApiDelegate 协议。
#import <UIKit/UIKit.h>
#import <WXApi.h>
@interface AppDelegate : UIResponder<UIApplicationDelegate, WXApiDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
若接入.a静态库版本的OpenSDK,此处请参考差异点说明。
4.2 手动集成
[1] 在 XCode 中建立你的工程。
[2] 将 WechatOpenSDK-XCFramework.xcframework 文件添加到你所建的工程中(如下图所示,建立了一个名为 Test 的工程,并把以上文件添加到 Test 文件夹下)。
(注:请使用 xCode4.5 及以上版本)
添加完成后,在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,能够看到“General”下的“Frameworks, Libraries, and Embedded Content”和“Build Phases”下的“Link Binary With Libraries”中有“WechatOpenSDK-XCFramework.xcframework”。
若接入.a静态库版本的OpenSDK,此处请参考差异点说明。
[3]开发者需要在工程中链接上:Security.framework, CoreGraphics.framework, WebKit.framework。
[4] 在你的工程文件中选择 Build Setting,在"Other Linker Flags"中加入"-ObjC -all_load"。
(注:请使用 xCode4.5 及以上版本)
[5] 在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序 id(如下图所示)。
Xcode 设置 URL scheme
[6] 在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“LSApplicationQueriesSchemes”添加weixin、weixinULAPI、weixinURLParamsAPI(如下图所示)。
经验证,在iOS 15系统上,使用Xcode 13编译出的App,LSApplicationQueriesSchemes的数量会限制为50个。第50个之后的scheme配置会不生效,需要确保"weixin"、"weixinULAPI"和"weixinURLParamsAPI"配置在LSApplicationQueriesSchemes的前50个。
[7] 在你需要使 用微信终端 API 的文件中 import WXApi.h 头文件,并增加 WXApiDelegate 协议。
#import <UIKit/UIKit.h>
#import <WXApi.h>
@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 的 handleOpenURL 和 openURL 方法:
- (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<UIUserActivityRest
oring>> * __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*)reqonReq
是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用 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 类型。
需要注意的是,SendMessageToWXReq 的 scene 成员,如果 scene 填 WXSceneSession,那么消息会发送至微信的会话内。如果 scene 填 WXSceneTimeline,那么消息会发送至朋友圈。如果 scene 填 WXSceneFavorite,那么消息会发送到“我的收藏”中。scene 默认值为 WXSceneSession。
至此,你已经能使用微信终端 SDK 的 API 内容了。如果想更详细了解每个 API 函数的用法,请查阅官网 API 文档或自行下载阅读微信 SDK Sample Demo 源码。
# 使用SDK 自检函数排查接入问题
SDK1.8.7版本,WXApi新增了自检函数checkUniversalLinkReady:
,帮助开发者排查SDK接入过程中遇到的问题。
注意事项:
- 调用自检函数之前必须要先调用registerApp:universalLink接口, 并确认调用成功
- 自检过程中会有Log产生,可以先调用startLogByLevel函数,根据Log排查问题
- 会多次回调block
- 仅用于新接入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
: 参数检查 - step =
WXULCheckStepSystemVersion
: 当前系统版本检查 - step =
WXULCheckStepWechatVersion
: 微信客户端版本检查 - step =
WXULCheckStepSDKInnerOperation
: 微信SDK内部操作检查 - step =
WXULCheckStepLaunchWechat
: App拉起微信检查 - step =
WXULCheckStepBackToCurrentApp
: 由微信返回当前App检查 - step =
WXULCheckStepFinal
: 最终检查
会依次回调这7个step,当回调了WXULCheckStepFinal
,说明检测通过,SDK接入成功。
任一step回调的result.success
为NO, 流程终止,后续不再回调,可以根据result.errorInfo
的查看当前步骤错误的原因,根据result.suggestion
修复问题.