【iOS开发】WKWebView调用系统相册问题(一)

2018-11-02  本文已影响0人  Dnaleci

随着公司项目的增加和迭代,用到H5实现需求的地方越来越多,也踩了很多的坑,在此记录和分享一下。
首先,来看一段“万恶”的代码。

 <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>在手机端浏览器调用相机、相册功能</title>
    </head>
    <body>

    <div>
        <input type="file" accept="image/*" capture="camera">
        <input type="file" accept="video/*" capture="camcorder">
        <input type="file" accept="audio/*" capture="microphone">
    </div>
    
    </body>
    </html>

这是H5页面直接调用手机自带相册、拍照功能,并不需要两端进行交互。乍看之下非常方便,可以由H5开发人员控制调用功能,App开发人员也无需浪费精力和时间在沟通和交互上。但是,调用显示的图库、相机等控制器属于系统提供,开发人员无法获取任何相关信息,坑也由此而来。

Modal情况下无法调起系统相册

这是在迭代过程中出现的第一个坑,具体描述一下:app的rootViewController称之为rootVC,rootVC现在push出WebView控制器vc1,在vc1上点击按钮成功调起系统相册,但是当vc1是被rootVC以modal方式弹出时,调起系统相册失败,Xcode出现以下警告:

Warning: Attempt to present <UIImagePickerController: 0x1102c2a00> on <UITabBarController: 0x11020f600> 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];

而在其他系统版本下只调用一次,导致相册调起失败,具体原因查了相关资料也未能解惑,如有大神得知,还望不吝赐教。
参考资料:

下篇链接:【iOS开发】WKWebView调用系统相册问题(二)

上一篇下一篇

猜你喜欢

热点阅读