美文网首页
【iOS开发】WKWebView调用系统相册问题(一)

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

作者: Dnaleci | 来源:发表于2018-11-02 17:15 被阅读0次

    随着公司项目的增加和迭代,用到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调用系统相册问题(二)

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/dfratqtx.html