背景
微信 iOS OpenSDK 通过剪切板在应用和微信间进行数据传递,在用户同意后完成授权登录、分享等功能。具体说明如下:
1、应用通过 OpenSDK 跳转到微信。在应用内,OpenSDK 会将业务数据写入剪切板;然后在拉起微信后,微信从剪切板中读出业务数据,完成相关功能;
2、微信完成相关功能后,微信将相关业务数据(例如授权登录结果、错误信息等)写入剪切板,然后跳转回应用。在应用内,OpenSDK 从剪切板中读出数据,回调给开发者。
在 iOS 16 系统上,读取其它应用写入剪切板的数据时,系统会阻塞调用,弹窗提示,让用户手动选择是否允许读取。如下图所示:
为了提升用户体验,微信和 OpenSDK 进行数据传输方式的改造,尽量避免使用剪切板传递数据。具体说明如下:
1、对于一般传输数据的接口,会在 Scheme 或者 Universal Link 中携带相关数据;
2、对因传输数据量较大等原因无法使用上述数据传输方式的接口,保持通过剪切板传递数据。
因此,开发者需要应用升级 OpenSDK,并配合微信客户端 8.0.24 及以上版本使用。
升级指引
为了支持在 Scheme 或者 Universal Link 传递数据,微信客户端版本要求 8.0.24 及以上,OpenSDK 版本要求 1.9.6 及以上,需要微信客户端版本和 OpenSDK 版本同时满足要求。
当前 OpenSDK 版本低于 1.8.6
若原有集成的 OpenSDK 版本低于 1.8.6,请先参考 OpenSDK 接入指南,完成 Universal Link 跳转方式的接入。然后按照下述内容,继续接入剪切板适配功能。
当前 OpenSDK 版本大于等于 1.8.6
更新 OpenSDK 版本后,在 Xcode 中,选择你的工程设置项 -> 选中 “TARGETS” 一栏 -> 找到 “info” 标签栏的 “LSApplicationQueriesSchemes” -> 在原有 weixin 和 weixinULAPI 的基础上,添加 weixinURLParamsAPI。如下图所示:
新增读取剪切板控制能力
集成 1.9.6 及以上版本的 OpenSDK 后,仍需要读取剪切板数据的情况有以下 2 种:
1、旧版本兼容:从版本低于 8.0.24 的微信客户端跳转到应用;
2、因数据量较大等原因无法在 Scheme 或者 Universal Link 传递。
为了提升用户体验,在 iOS 16 系统上,OpenSDK 将在读取剪切板前请求开发者授权,由开发者自行决定是否允许 OpenSDK 读取剪切板中的业务数据以及何时进行剪切板业务数据读取。
WXApiDelegate 接口在原有 WXApiDelegate 协议上,新增 onNeedGrantReadPasteBoardPermissionWithURL:completion 函数,用于 iOS 16 及以上的系统,控制 OpenSDK 剪切板的读取。
示例代码如下:
@protocol WXApiDelegate
@optional
- (void)onReq:(BaseReq*)req;
- (void)onResp:(BaseResp*)resp;
/* ! @brief 用于在iOS16以及以上系统上,控制OpenSDK是否读取剪切板中微信传递的数据以及读取的时机
* 在iOS16以及以上系统,在SDK需要读取剪切板中微信写入的数据时,会回调该方法。没有实现默认会直接读取微信通过剪切板传递过来的数据
* 注意:
* 1. 只在iOS16以及以上的系统版本上回调;
* 2. 不实现时,OpenSDK会直接调用读取剪切板接口,读取微信传递过来的数据;
* 3. 若实现该方法:开发者需要通过调用completion(), 支持异步,通知SDK允许读取剪切板中微信传递的数据,
* 不调用completion()则代表不授权OpenSDK读取剪切板,会导致收不到onReq:, onResp:回调,无法后续业务流程。请谨慎使用
* 4. 不要长时间持有completion不释放,可能会导致内存泄漏。
*/
- (void)onNeedGrantReadPasteBoardPermissionWithURL:(nonnull NSURL *)openURL completion:
(nonnull WXGrantReadPasteBoardPermissionCompletion)completion;
@end
若不实现 onNeedGrantReadPasteBoardPermissionWithURL:completion 函数,OpenSDK 在需要读取剪切板时,直接调用读取剪切板接口,读取微信传递过来的数据,用于回调通知 onReq: 和 onResp:。
若实现 onNeedGrantReadPasteBoardPermissionWithURL:completion 函数,开发者需要通过调用 completion(),通知 SDK 允许读取剪切板中微信传递的数据, 支持异步。
实现函数后,如果不调用 completion() 通知 OpenSDK 读取剪切板,将收不到 onReq: 或者 onResp: 回调,请谨慎操作!
示例代码如下:
- (void)onNeedGrantReadPasteBoardPermissionWithURL:(NSURL *)openURL completion:
(WXGrantReadPasteBoardPermissionCompletion)completion {
//开发者可展示相关UI提示用户
[self showReadPasteBoardNotice];
//允许OpenSDK读取剪切板
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
completion();
});
}
微信团队
2022年7月18日
为什么我的账号自动掉了,而且,再次登陆,怎么登不上了呢?
已阅,与我无瓜
升级最新的SDK,添加weixinURLParamsAPI就行了是吧?
没有特殊需求可以不实现onNeedGrantReadPasteBoardPermissionWithURL:吧?
阅
在App中设置
UIPasteboard.general.string = "复制新内容"
代码调用 WXApi.openWXApp() 打开微信后发现 剪切板为空,
但是:手动打开微信剪切板就是正常的。
这个问题只在iOS16系统上存在,想问下有遇到过的么?咋么处理呢?
1、微信版本8.0.28 iOS16beta版本: 通过 WXApi.openWXApp() 打开微信剪切板为空
2、之前微信版本 iOS16beta 版本: 通过 WXApi.openWXApp() 打开微信可正常访问剪切板数据。
“代码调用 WXApi.openWXApp() 打开微信后发现 剪切板为空,
但是:手动打开微信剪切板就是正常的。”
已阅
打卡