我有一个UIWebView
包含加载公共URL的位置;不幸的是,vcard和ical-Links没有被处理,即当我点击它们时没有任何反应。
我试图设置所有数据检测器,不幸的是没有运气。
在Xcode-log中,我点击这样一个链接就可以看到这个:
2017-07-14 13:43:00.982413+0200 xxx[2208:967973] WF: _userSettingsForUser mobile: {
filterBlacklist = (
);
filterWhitelist = (
);
restrictWeb = 1;
useContentFilter = 0;
useContentFilterOverrides = 0;
whitelistEnabled = 0;
}
在Safari中,相同的东西按预期工作。
如果我使用UIApplication.shared.openURL(icsOrVcardUrl)
Safari会被打开,那么一切都会按预期运行,但我不希望用户离开该应用...
修改 这不起作用:
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if let url = request.url {
if url.absoluteString.contains("=vcard&") || url.absoluteString.contains("/ical/") {
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)
let request = URLRequest(url:url)
let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in
if let tempLocalUrl = tempLocalUrl, error == nil {
DispatchQueue.main.async {
self.documentController.url = tempLocalUrl
self.documentController.presentPreview(animated: true)
}
}
}
task.resume()
return false
}
}
return true
}
答案 0 :(得分:2)
使用UIDocumentInteractionController进行预览而无需离开您的应用。 我使用.ics文件快速测试它,它工作正常。
实施UIDocumentInteractionControllerDelegate
协议
extension MainViewController: UIDocumentInteractionControllerDelegate {
func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
return self;
}
}
创建交互控制器的实例:
let documentController = UIDocumentInteractionController()
在shouldStartLoadWithRequest
中截取您的UIWebView中的点击次数,对于您要使用应用内预览处理的链接,返回false,其余为true。最后:
func previewDocument(_ url: URL) {
documentController.url = url
documentController.presentPreview(animated: true)
}
这是在模拟器中
修改强>
回应对此答案的评论:
它不适合你的原因是因为UIDocumentInteractionController
取决于文件扩展名。临时文件的扩展名为 .tmp
下载后重命名文件可解决问题。快速而肮脏的例子:
let task = session.downloadTask(with: url!) { (tempLocalUrl, response, error) in
if let tempLocalUrl = tempLocalUrl, error == nil {
do {
let filemgr = FileManager.default
let newUrl = tempLocalUrl.appendingPathExtension("ics")
try filemgr.moveItem(at: tempLocalUrl, to: newUrl)
DispatchQueue.main.async {
self.documentController.url = newUrl
self.documentController.presentPreview(animated: true)
}
} catch let error {
print("Error!!!: \(error.localizedDescription)")
}
}
}
task.resume()
在这种情况下,建议您自己清理,因为在任务完成后文件不会被删除,尽管操作系统最终会在需要空间时将其删除。如果您经常访问相同的网址,Library/Caches/
可能是这个文件的更好位置,只需提出良好的命名方案,并检查该文件是否已经存在。