2017-07-14 1 views
3

公開URLがロードされる場所にはUIWebViewが含まれています。残念ながら、vcardとical-Linksは処理されません。つまり、クリックすると何も起こりません。UIWebView:icsとvcard - リンクが処理されない

私はすべてのデータ検出器を設定しようとしましたが、残念なことに運はありません。 Xcodeのログで

ようなリンクをクリックしたとき、私はここにこれを取得:Safariでは

2017-07-14 13:43:00.982413+0200 xxx[2208:967973] WF: _userSettingsForUser mobile: { 
    filterBlacklist =  (
    ); 
    filterWhitelist =  (
    ); 
    restrictWeb = 1; 
    useContentFilter = 0; 
    useContentFilterOverrides = 0; 
    whitelistEnabled = 0; 
} 

、期待通りに同じものが動作します。

私はUIApplication.shared.openURL(icsOrVcardUrl)を使用する場合はSafariが開かれますし、そこから再びすべてが期待どおりに動作しますが、私は、ユーザーがアプリを離れたくない...

EDIT これはどちらか動作しません。

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

OSで特定の種類のリンクを処理するには、ここで受諾された回答を試しましたか?https://stackoverflow.com/a/4442594/2141666その答えは、http/https以外のものを処理しようとしています。おそらくあなたはそれを変更して、.vcardや.icsを含むURLをOSが処理できるようにすることができます。 – Kdawg

+0

これらのリンクはダウンロードを開始するhttpsリンクです... – swalkner

+0

保存されたファイルが拡張されているため、編集中のコードは機能しません。詳細については、私の答えの編集を参照してください。 –

答えて

2

UIDocumentInteractionControllerを使用すると、アプリを離れることなくプレビューできます。 私はそれを.icsファイルですばやくテストしても問題ありません。

対話コントローラのインスタンスを作成しますUIDocumentInteractionControllerDelegateプロトコル

extension MainViewController: UIDocumentInteractionControllerDelegate { 
    func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController { 
     return self; 
    } 
} 

を実装します。shouldStartLoadWithRequestであなたのUIWebViewでクリックインターセプト

let documentController = UIDocumentInteractionController() 

、あなたは内で処理したいリンクについてはfalseを返します-appプレビューと残りのすべてについて真。そして最後に:この回答へのコメントを受けて

: それが動作しない理由

func previewDocument(_ url: URL) { 
    documentController.url = url 
    documentController.presentPreview(animated: true) 
} 

ここでは、シミュレータ

enter image description here

EDITであります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() 

OSは、最終的にそれを削除しますが、タスクが完了した後にスペースが必要になったときに、ファイルが、削除されませんので、自分の後にきれいにすることをお勧めします。同じURLに頻繁にアクセスする場合は、Library/Caches/がこのファイルのより良い場所になるかもしれません。良い名前付けスキーマを用意して、ファイルがまだ存在しないかどうかを確認してください。

+0

私のコメントを参照してください、これは私のためには機能しませんでした(私は 'https'リンクはローカルのものではないので、まずダウンロードを行います) – swalkner

関連する問題