UIWebView:未处理ics和vcard-Links

时间:2017-07-14 11:45:39

标签: swift3 vcard

我有一个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
}

1 个答案:

答案 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)
}

这是在模拟器中

enter image description here

修改

回应对此答案的评论: 它不适合你的原因是因为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/可能是这个文件的更好位置,只需提出良好的命名方案,并检查该文件是否已经存在。