背景
微信 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日
话说啥时候 `width:4em`,在ios里会容不下四个汉字导致折行的
已阅
没效果啊,还是无法读取剪切板
无论是SDK 1.9.6还是1.9.7,问题都没有解决,比如图片超过1M时,剪贴板中的文本在调用完sendReq后依然会被清空! 而且有时还是会在微信调起时弹出剪贴板授权框。
log = wxlog:transfer to data fail after remove unnecessary data
log = wxlog:send req transformToUrl data len:0, erased:0
log = wxlog:can not gen url params, degrade
og = wxlog:set property list
opensdk升级到 v1.9.6,微信升级到最新的8.0.29,分享的时候还是偶尔会有粘贴弹框,没升级之前都是toast提示,有大佬知道咋解决吗
1.升级完iOS到v1.9.6,微信也升级到了 8.0.24版本以上了,但是分享图片和链接的时候还是会有 “是否需要粘贴” 的强制弹框,有大佬知道为啥吗?另外选择“不允许粘贴”,还是能分享成功,这个逻辑很奇怪呀。
升级sdk,添加scheme。 回调方法 onNeedGrantReadPasteBoardPermissionWithURL 根本就不会执行。还是直接执行onResp这个方法
测试iOS16 Beta8 已经没有alert提示,还是顶部的toast提示,微信sdk还需要升级吗?
展示自定义UI提示用户,completion()后,还是会弹那个系统的弹框吧?等于两个弹框,体验不太好吧