【iOS开发】WKWebView调用系统相册问题(一)
【【iOS开发】WKWebView调用系统相册问题(一)】随着公司项目的增加和迭代,用到H5实现需求的地方越来越多,也踩了很多的坑,在此记录和分享一下。
首先,来看一段“万恶”的代码。
在手机端浏览器调用相机、相册功能 - 锐客网
这是H5页面直接调用手机自带相册、拍照功能,并不需要两端进行交互。乍看之下非常方便,可以由H5开发人员控制调用功能,App开发人员也无需浪费精力和时间在沟通和交互上。但是,调用显示的图库、相机等控制器属于系统提供,开发人员无法获取任何相关信息,坑也由此而来。
Modal情况下无法调起系统相册
这是在迭代过程中出现的第一个坑,具体描述一下:app的rootViewController称之为rootVC,rootVC现在push出WebView控制器vc1,在vc1上点击按钮成功调起系统相册,但是当vc1是被rootVC以modal方式弹出时,调起系统相册失败,Xcode出现以下警告:
Warning: Attempt to present on whose view is not in the window hierarchy!
此bug目前只在iOS8系统上出现(PS:公司向下兼容到iOS8止,如有更低版本出现此问题,欢迎读者评论补充),首先说明解决办法,在你presentViewControoler的控制器重写
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion{
if ( self.presentedViewController)
{
[super dismissViewControllerAnimated:flag completion:completion];
}
}
举个例子,在我的项目中modal出来的控制器是UITabBarController,所以我给UITabBarController写了个分类
#import "UITabBarController+LYExtension.h"@implementation UITabBarController (LYExtension)/***iOS8之Modal情况下使用WebView无法调起系统相册***/
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
if ( self.presentedViewController)
{
[super dismissViewControllerAnimated:flag completion:completion];
}
}@end
具体的原因尚未明确,通过重写后打断点得知,在iOS8下弹出选择相册页面前调用了两次
[super dismissViewControllerAnimated:flag completion:completion];
而在其他系统版本下只调用一次,导致相册调起失败,具体原因查了相关资料也未能解惑,如有大神得知,还望不吝赐教。
参考资料:
- https://stackoverflow.com/questions/36457781/modal-uiwebview-and-camera-image-picker-issue
- http://stackoverflow.com/questions/25942676/ios-8-sdk-modal-uiwebview-and-camera-image-picker
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 深入理解Go之generate
- 20190302|20190302 复盘翻盘