最近在项目中遇到一个让人头痛的bug,查遍网上都没找到,因为本项目中必须用到交互和上传相片,最后只能自己挨着挨着的排除测试。
出现问题的场景:
在同一个控制器中的WKWebView页面中使用相机或者相册后,所有的交互便失效了。回退后的web页面也同样失效。当退出再重新进入控制器,即创建了新的WKWebView页面,其他的交互又才可以用。
排除的问题及解决办法:
- 相机相册的使用权限问题
① 检查info.plist中是否添加以下两条权限
相机 Privacy - Photo Library Usage Description
相册 Privacy - Camera Usage Description
② 在访问时,权限是否生效,若未生效,则通过<Photos/Photos.h>中的PHAuthorizationStatus类来手动设置
PHAuthorizationStatus authorizationStatus = [PHPhotoLibrary authorizationStatus];
if (authorizationStatus == PHAuthorizationStatusAuthorized) {
//从相册中读取照片
[self readImageFromAlbum];
} else {
if (authorizationStatus == PHAuthorizationStatusNotDetermined) {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { //弹出访问权限提示框
if (status == PHAuthorizationStatusAuthorized) {
//从相册中读取照片
[self readImageFromAlbum];
} else {
//显示无权限的提示
}
}];
} else {
//显示无权限的提示
}
}
同样,此方法也用于解决此错误:
[discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled};
在网上看到很多人通过设置环境变量OS_ACTIVITY_MODE为disable来解决此打印问题,但个人觉得这并没有真正的解决问题,只是屏蔽打印而已。
- 经测试发现不管是通过原生的UIImagePickerController还是H5的input来调用相机或相册,只要进入相机或相册,就会导致与WKWebView的交互失效。
最后换成UIWebView测试,终于发觉使用相机或相册不影响UIWebView的交互了,虽然UIWebView的性能没有WKWebView好,但为了解决此问题暂时退而求其次。
总结:
ios12使用相机或相册的系统类与WKWebView的交互类有冲突。
若找到更好解决办法,我会在后面更新;若你也遇到同样的问题,或有更好的解决方法,也希望可以留言相互交流学习。