随着公司项目的增加和迭代,用到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];
而在其他系统版本下只调用一次,导致相册调起失败,具体原因查了相关资料也未能解惑,如有大神得知,还望不吝赐教。
参考资料: