允许在 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 文档选择器关闭容器视图