允许在 WKWebView 上的输入文件中上传文档

Posted

技术标签:

【中文标题】允许在 WKWebView 上的输入文件中上传文档【英文标题】:Allow document upload in input file on WKWebView 【发布时间】:2018-01-23 22:33:30 【问题描述】:

我在通过 wkwebview 加载的页面上有一个 html input type="file" 上传表单,并且我正在尝试允许上传常见文档文件(pdf、docx 等)的功能。目前我可以拍照和浏览图片,但是文档是灰色的并且不可用。我是一名网络开发人员,swift 对我来说是希腊语,所以任何帮助都将不胜感激!

这是我的视图控制器

import UIKit
import WebKit
import IJProgressView
import FirebaseMessaging

class ViewController: UIViewController, WKNavigationDelegate 

let webView = WKWebView()
var initialstart = true



override func viewDidLoad() 

    webView.backgroundColor = UIColor(red:0.17, green:0.24, blue:0.31, alpha:1.0)
    webView.isOpaque = false
    webView.allowsBackForwardNavigationGestures = true

    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.receivedUrlFromPushNotification(notification:)), name: NSNotification.Name(rawValue: "ReceivedPushNotification"), object: nil)
    // Do any additional setup after loading the view, typically from a nib.
    guard let url = URL(string: "https://www.website.com/users/account") else  return;
    webView.frame = view.bounds;
    webView.navigationDelegate = self;
    webView.load(URLRequest(url: url));
    webView.autoresizingMask = [.flexibleWidth, .flexibleHeight];
    view.addSubview(webView)



func receivedUrlFromPushNotification (notification: Notification)  
    let notification: [AnyHashable : Any] = notification.userInfo!
    let url = URL(string: notification["url"] as! String);
    webView.load(URLRequest(url: url!))




func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) 
    if navigationAction.navigationType == .linkActivated 
        if let url = navigationAction.request.url,
            let host = url.host, !host.hasPrefix("www.website.com"),
            UIApplication.shared.canOpenURL(url) 
            if #available(ios 10.0, *) 
                UIApplication.shared.open(url)
             else 
                // Fallback on earlier versions
                UIApplication.shared.openURL(url)
            
            decisionHandler(.cancel)
         else 
            decisionHandler(.allow)

        
     else 
        decisionHandler(.allow)
    



func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 
    let url = webView.url;
    let path = url?.path;
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
    IJProgressView.shared.hideProgressView()
    view.isOpaque = true


func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) 
    if (initialstart == true) 
        initialstart = false
     else 
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
        IJProgressView.shared.showProgressView(view)
    



【问题讨论】:

【参考方案1】:

对于 OSX,您可以尝试实现委托方法 runOpenPanelWithParameters。这是一个 WKUIDelegate 方法。

检查接受的类似问题的答案:Input type=file not working in WebView of OS X application

【讨论】:

感谢您的回复。不幸的是,我无法让它工作。根据我的阅读,NSOpenPanel 和 WKOpenPanelParameters 似乎在 iOS 中不可用,只有 OSX 可用。我不敢相信不可能通过 iOS 应用上传非图像?我确实看到了一些关于 github.com/marmelroy/FileBrowser 之类的库的建议,但是将其集成到 wkwebview 超出了我的能力范围。再次感谢您的任何帮助,再次感谢您的回复。 对不起,是的,它仅适用于 OS X,不适用于 iOS。尝试使用真实设备对此进行测试,并确保您想要的功能可用并在 safari 中运行。【参考方案2】:

在我的情况下,文件上传后,页面被重定向到基本 url。问题是我在调用

webview.load(request)

来自 viewDidAppear() 函数。 将调用移至 viewDidLoad() 解决了我的问题。Click here to see more details

【讨论】:

以上是关于允许在 WKWebView 上的输入文件中上传文档的主要内容,如果未能解决你的问题,请参考以下文章

在 keydown 上禁用 WKWebView “funk”声音,但允许输入输入字段

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

iOS UIWebview,禁用双击,允许点击 WKWebview

如何保护上传的文档不被 Web 表单直接访问

WKWebView 确实从本地文档文件夹加载资源

iPad上的WKWebView水平滚动