【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
下篇链接:【iOS开发】WKWebView调用系统相册问题(二)

    推荐阅读