導(dǎo)致問(wèn)題的html代碼是這一句:<input type = "file" name = "file"> 調(diào)用app的UIDocumentMenuViewController控制
問(wèn)題發(fā)生場(chǎng)景:VC presentViewController 顯示 webVC;
或者VC presentViewController 顯示NVC,webVC在NVC上
這時(shí)候在H5上的? input type = "file" 觸發(fā)后會(huì)導(dǎo)致UIDocumentMenuViewController 和 pre出來(lái)的VC(顯示webVC的界面)兩個(gè)直接dismis掉昧旨,
控制臺(tái)會(huì)打印這么句警告: ?Warning: Attempt to present <UIImagePickerController: 0x1018a0600> on <XXController: 0x100506020> whose view is not in the window hierarchy!?
個(gè)人覺(jué)得這是apple的一個(gè)bug讶迁,應(yīng)該有開(kāi)發(fā)者反饋了才對(duì)涮瞻,但是到目前WKWebView, UIWebView還存在這個(gè)問(wèn)題朝蜘,具體原因不曉得搬瑰,坐等apple修復(fù)睡蟋,在這之前可以參考我的處理方式踏幻,把那demo里的UIViewController+Dismis_FileUploadPanel ?.h和.m文件拖到項(xiàng)目里就ok了,不需要額外代碼戳杀。修復(fù)處理邏輯看下文:
經(jīng)過(guò)分析该面,發(fā)現(xiàn)是WKFileUploadPanel(或 UIWebFileUploadPanel)這么個(gè)東西的 _dismisDisplayAnimated: 方法執(zhí)行的,直接代碼是在UIDocumentMenuViewController控制器關(guān)閉后的completion內(nèi)觸發(fā)信卡。
分析后發(fā)現(xiàn) UIDocumentMenuViewController 和 webVC 之間并沒(méi)有什么關(guān)系(pre關(guān)系)隔缀,只是和WKFileUploadPanel(或 UIWebFileUploadPanel) 這貨有關(guān)系(delegate關(guān)系),基于這一點(diǎn)結(jié)合runtime切入傍菇,在presentViewController:animated: 時(shí)候?qū)μ厥釻IDocumentMenuViewController進(jìn)行標(biāo)記猾瘸,
由于cancel是由UIDocumentMenuViewController發(fā)起的,所以也對(duì)其進(jìn)行標(biāo)記。
然后dismissViewControllerAnimated:animated:時(shí)候的completion對(duì)標(biāo)記對(duì)象進(jìn)行區(qū)分處理牵触,由于兩次dismis是兩個(gè)無(wú)關(guān)的vc順序執(zhí)行淮悼,所以用一個(gè)靜態(tài)變量dismisFromFileUploadPanel 來(lái)標(biāo)記是否是UIDocumentMenuViewController之后的dismis。
標(biāo)記的目的是其它正常的dismis可以正確執(zhí)行揽思,避免其它bug出現(xiàn)袜腥。
更新:新增選擇圖片攔截,可知道選擇的圖片信息钉汗,修復(fù)選擇圖片攔截bug
分析發(fā)現(xiàn)圖片文件選擇走的是UIImagePickerController瞧挤,而UIImagePickerController是通過(guò)代理返回結(jié)果集,那么在FileUploadPanel內(nèi)部就必然有回調(diào)方法儡湾,否則無(wú)法完成圖片獲取操作
之前嘗試runtime對(duì)WKFileUploadPanel 或 UIWebFileUploadPanel 采用方法替換攔截測(cè)試不可行特恬,
新的攔截思路采用代理攔截器實(shí)現(xiàn),在UIImagePickerController setDelegate:時(shí)候增加_UIImagePickerController_IFUP 攔截[imagePickerController: didFinishPickingMediaWithInfo:]代理事件
具體實(shí)現(xiàn)看demo:https://github.com/youlianchun/WebView_FileUploadBug