H5交互中,调用相册闪退到主界面_篱下悠然_新浪博客

导致问题的html代码是这一句:input type = "file" name = "file"    调用app的UIDocumentMenuViewController控制

问题发生场景:VC presentViewController 显示 webVC;

或者VC presentViewController 显示NVC,webVC在NVC上

这时候在H5上的  input type = "file" 触发后会导致UIDocumentMenuViewController 和 pre出来的VC(显示webVC的界面)两个直接dismis掉,

控制台会打印这么句警告:  Warning: Attempt to present on whose view is not in the window hierarchy! 

个人觉得这是apple的一个bug,应该有开发者反馈了才对,但是到目前WKWebView, UIWebView还存在这个问题,具体原因不晓得,坐等apple修复,在这之前可以参考我的处理方式,把那demo里的UIViewController+Dismis_FileUploadPanel  .h和.m文件拖到项目里就ok了,不需要额外代码。修复处理逻辑看下文:




经过分析,发现是WKFileUploadPanel(或 UIWebFileUploadPanel)这么个东西的 _dismisDisplayAnimated: 方法执行的,直接代码是在UIDocumentMenuViewController控制器关闭后的completion内触发。

H5交互中,调用相册闪退到主界面
调试堆栈WKWebView


H5交互中,调用相册闪退到主界面

分析后发现 UIDocumentMenuViewController 和 webVC 之间并没有什么关系(pre关系),只是和WKFileUploadPanel(或 UIWebFileUploadPanel) 这货有关系(delegate关系),基于这一点结合runtime切入,在presentViewController:animated: 时候对特殊UIDocumentMenuViewController进行标记



H5交互中,调用相册闪退到主界面

由于cancel是由UIDocumentMenuViewController发起的,所以也对其进行标记。


H5交互中,调用相册闪退到主界面


然后dismissViewControllerAnimated:animated:时候的completion对标记对象进行区分处理,由于两次dismis是两个无关的vc顺序执行,所以用一个静态变量dismisFromFileUploadPanel 来标记是否是UIDocumentMenuViewController之后的dismis。

标记的目的是其它正常的dismis可以正确执行,避免其它bug出现。

于web内相册访问需要更多可控操作或获取更多信息,建议采用js交互实现。

然后dismissViewControllerAnimated:animated:时候的completion对标记对象进行区分处理,由于两次dismis是两个无关的vc顺序执行,所以用一个静态变量dismisFromFileUploadPanel 来标记是否是UIDocumentMenuViewController之后的dismis。

标记的目的是其它正常的dismis可以正确执行,避免其它bug出现。



更新:新增选择图片拦截,可知道选择的图片信息,修复选择图片拦截bug

分析发现图片文件选择走的是UIImagePickerController,而UIImagePickerController是通过代理返回结果集,那么在FileUploadPanel内部就必然有回调方法,否则无法完成图片获取操作

之前尝试runtime对WKFileUploadPanel 或 UIWebFileUploadPanel 采用方法替换拦截测试不可行,

新的拦截思路采用代理拦截器实现,在UIImagePickerController setDelegate:时候增加_UIImagePickerController_IFUP 拦截[imagePickerController: didFinishPickingMediaWithInfo:]代理事件

代码已更新


附js交互封装 :WKWebView_JSTrade http://www.jianshu.com/p/2f901a0a6e5a 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值