来自 WKWebview 的 iCLoud 文档选择器关闭容器视图

Posted

技术标签:

【中文标题】来自 WKWebview 的 iCLoud 文档选择器关闭容器视图【英文标题】:iCLoud document picker from WKWebview dismissing container view 【发布时间】:2017-10-06 10:30:14 【问题描述】:

我有一个加载基于 Web 的 UI 的 WKWebview,我希望用户能够从他们的 iCloud 文档上传文件。我已授予正确的权限,并且能够浏览 iCloud 文档。但是,当我选择一个文件或单击取消按钮时,以及关闭 WKWebview 的父视图的文档选择器视图也会被关闭。

我已尝试跟踪解雇路径。我 100% 确定我没有在视图中调用关闭函数。

有谁知道是什么触发了我的 WKWebview 容器的关闭以及如何防止它?

【问题讨论】:

【参考方案1】:

UIDocumentPickerViewController 中有一个错误。

1) 保存对UIDocumentPickerViewController 的弱引用在任何视图控制器呈现UIDocumentPickerViewController 中。 (这通常最终成为UINavigationController,因此您可能必须继承UINavigationController 才能解决此问题。)

///Due to a bug in UIDocumentPickerViewController we need to stop the UIDocumentPickerViewController from dismissing this navigation controller. Or at least provide control. This is a weak reference to a UIDocumentPickerController that this controller presents
weak var documentPicker: UIDocumentPickerViewController?

2) 在呈现UIDocumentPickerViewControllerUIViewController 上覆盖这两个函数

//MARK: Overrides
override public func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) 
    if self.presentedViewController == nil && self.documentPicker != nil 
        self.documentPicker = nil
    else
        super.dismiss(animated: flag, completion: completion)
    


public override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) 
    if viewControllerToPresent is UIDocumentPickerViewController 
        self.documentPicker = viewControllerToPresent as? UIDocumentPickerViewController
    
    super.present(viewControllerToPresent, animated: flag, completion: completion)

现在来自UIDocumentPickerViewController 的第二次呼叫不会关闭正在演示的UIViewController

【讨论】:

由于同样的错误,除了图像选择器发现 UIWebViews 对于 Content-Type 标头默认为 application/x-www-form-urlencoded 而 WKWebViews 没有。终于让我的 shizz 工作了,对此感到高兴,尝试使用 shiggles 的文档选择器,并发现这里存在相同的错误,只是没有修补(尽管恰好今天最后一次评论!很快修复?) .把我的脸拍在桌子上,决定看看我能找到什么解决方法。你是天赐之物。【参考方案2】:

我在使用 WKWebView 的 Objective-C 和 ios11 上遇到了同样的问题,并使用此解决方法解决了它。您应该能够轻松地将其迁移到 Swift:

我的 WKWebView 由直接扩展 UIViewController 的视图控制器拥有

在这个视图控制器中添加这个弱属性

@property (weak, nonatomic) UIDocumentPickerViewController *_Nullable docPickerPtr;

在同一个视图控制器中覆盖这两个方法,这两个方法原本是 UIViewController 基类的一部分

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion

    if ([viewControllerToPresent isKindOfClass:[UIDocumentPickerViewController class]])
    
        _docPickerPtr = (UIDocumentPickerViewController*)viewControllerToPresent;
    

    [super presentViewController:viewControllerToPresent animated:flag completion:completion];


- (void)dismissViewControllerAnimated:(BOOL)flag
                           completion:(void (^)(void))completion

    if (_docPickerPtr != nil && self.presentedViewController == nil)
    
        NSLog(@">>>>>>>>>>>>PREVENT FROM DOING 2nd DISMISS!");
    
    else
        
        [super dismissViewControllerAnimated:flag completion:completion];
    

我们所做的是:

    当我们要显示文档选择器时,保存一个指向 UIDocumentPickerViewController 的弱指针 dismissViewControllerAnimated:completion 被调用了两次。一次,当presentedViewController 还没有杀死实际的文档选择器时,第二次由于未知原因,当presentedViewController 消失但UIDocumentPickerViewController 仍然存在时。这个想法是为了防止第二次解雇传播到超级

【讨论】:

您好,感谢您的回答!我看到它与几个月前发布的另一个答案的概念相同,只是没有使用标记语言。我也在使用 Swift,但应该归功于它:)

以上是关于来自 WKWebview 的 iCLoud 文档选择器关闭容器视图的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 无法连接到 iCloud 文档

是否可以使用 CloudKit 从 iCloud 驱动器获取数据

如何检测 WKWebView 正在关闭,来自 javascript

检测 OS X 上的 iCloud 可用性变化

获取来自 WKWebView 的 JavaScript 错误

设置 AVAudioSession 类别对来自 WKWebView 的声音没有影响