Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift3 UIWebView:未处理ics和vcard链接_Swift3_Vcf Vcard - Fatal编程技术网

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
链接,而不是本地链接,因此我先下载)