隨著公司項(xiàng)目的增加和迭代,用到H5實(shí)現(xiàn)需求的地方越來越多,也踩了很多的坑穆端,在此記錄和分享一下乳蓄。
首先,來看一段“萬惡”的代碼微渠。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>在手機(jī)端瀏覽器調(diào)用相機(jī)、相冊功能</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頁面直接調(diào)用手機(jī)自帶相冊、拍照功能鲁森,并不需要兩端進(jìn)行交互。乍看之下非常方便镀梭,可以由H5開發(fā)人員控制調(diào)用功能刀森,App開發(fā)人員也無需浪費(fèi)精力和時(shí)間在溝通和交互上。但是报账,調(diào)用顯示的圖庫研底、相機(jī)等控制器屬于系統(tǒng)提供,開發(fā)人員無法獲取任何相關(guān)信息透罢,坑也由此而來榜晦。
Modal情況下無法調(diào)起系統(tǒng)相冊
這是在迭代過程中出現(xiàn)的第一個(gè)坑,具體描述一下:app的rootViewController稱之為rootVC,rootVC現(xiàn)在push出WebView控制器vc1羽圃,在vc1上點(diǎn)擊按鈕成功調(diào)起系統(tǒng)相冊乾胶,但是當(dāng)vc1是被rootVC以modal方式彈出時(shí),調(diào)起系統(tǒng)相冊失敗朽寞,Xcode出現(xiàn)以下警告:
Warning: Attempt to present <UIImagePickerController: 0x1102c2a00> on <UITabBarController: 0x11020f600> whose view is not in the window hierarchy!
此bug目前只在iOS8系統(tǒng)上出現(xiàn)(PS:公司向下兼容到iOS8止识窿,如有更低版本出現(xiàn)此問題,歡迎讀者評論補(bǔ)充)脑融,首先說明解決辦法喻频,在你presentViewControoler的控制器重寫
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion{
if ( self.presentedViewController)
{
[super dismissViewControllerAnimated:flag completion:completion];
}
}
舉個(gè)例子,在我的項(xiàng)目中modal出來的控制器是UITabBarController肘迎,所以我給UITabBarController寫了個(gè)分類
#import "UITabBarController+LYExtension.h"
@implementation UITabBarController (LYExtension)
/***iOS8之Modal情況下使用WebView無法調(diào)起系統(tǒng)相冊***/
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
if ( self.presentedViewController)
{
[super dismissViewControllerAnimated:flag completion:completion];
}
}
@end
具體的原因尚未明確甥温,通過重寫后打斷點(diǎn)得知,在iOS8下彈出選擇相冊頁面前調(diào)用了兩次
[super dismissViewControllerAnimated:flag completion:completion];
而在其他系統(tǒng)版本下只調(diào)用一次妓布,導(dǎo)致相冊調(diào)起失敗姻蚓,具體原因查了相關(guān)資料也未能解惑,如有大神得知匣沼,還望不吝賜教狰挡。
參考資料: