Swift3 UIWebView:未处理ics和vcard链接
我确实有一个Swift3 UIWebView:未处理ics和vcard链接,swift3,vcf-vcard,Swift3,Vcf Vcard,我确实有一个UIWebView包含在加载公共URL的地方;不幸的是,vcard和ical链接未被处理,即当我单击它们时,不会发生任何事情 我试图设置所有的数据检测器,不幸的是没有运气 在Xcode日志中,单击这样的链接时,我在这里看到: 2017-07-14 13:43:00.982413+0200 xxx[2208:967973] WF: _userSettingsForUser mobile: { filterBlacklist = ( ); filterWh
UIWebView
包含在加载公共URL的地方;不幸的是,vcard和ical链接未被处理,即当我单击它们时,不会发生任何事情
我试图设置所有的数据检测器,不幸的是没有运气
在Xcode日志中,单击这样的链接时,我在这里看到:
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
}
在不离开应用程序的情况下使用预览。
我用一个.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()
在这种情况下,建议您自己清理,因为任务完成后不会删除该文件,尽管操作系统最终会在需要空间时将其删除。如果您经常访问相同的URL,
Library/Caches/
对于这些文件来说可能是一个更好的地方,只需提出一个好的命名模式,并检查文件是否已经存在。您是否尝试过这里接受的答案,让操作系统处理某些类型的链接?这个答案让操作系统尝试处理任何非http/https的内容;也许您可以将其更改为尝试让操作系统处理包含.vcard或.ics的任何URL。但这些链接是开始下载的https链接…由于保存文件的扩展名,编辑中的代码将无法工作。有关更多信息,请参阅我答案的编辑。请参阅我的评论,这对我不起作用(我确实有https
链接,而不是本地链接,因此我先下载)