2017-07-14 1 views
3

J'ai un UIWebView inclus où une URL publique est chargée; Malheureusement, vcard et ical-Links ne sont pas gérés, c'est-à-dire que rien ne se passe lorsque je clique dessus.UIWebView: ics et vcard-Liens non gérés

J'ai essayé de régler tous les détecteurs de données, malheureusement pas de chance.

Dans le Xcode-log, je reçois ce ici en cliquant sur ce lien:

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

Dans Safari, la même chose fonctionne comme prévu.

Si je UIApplication.shared.openURL(icsOrVcardUrl) Safari s'ouvre et de là, tout fonctionne comme prévu à nouveau, mais je ne veux pas que l'utilisateur de quitter l'application ...

EDIT Cela ne fonctionne pas non plus:

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

Avez-vous essayé la réponse acceptée ici https://stackoverflow.com/a/4442594/2141666 pour que le système d'exploitation gère les liens de certains types? Cette réponse a le système d'exploitation essayer de gérer tout ce qui n'est pas http/https; Peut-être que vous pourriez le changer pour essayer que le système d'exploitation gère n'importe quelle URL contenant .vcard ou .ics. – Kdawg

+0

mais ces liens sont des liens https commençant un téléchargement ... – swalkner

+0

Le code de votre modification ne fonctionnera pas, en raison de l'extension du fichier enregistré. Voir la modification de ma réponse pour plus d'informations. –

Répondre

2

Utilisez un UIDocumentInteractionController pour prévisualiser sans quitter votre application. Je l'ai testé rapidement avec un fichier .ics et ça marche très bien.

Mettre en oeuvre le protocole UIDocumentInteractionControllerDelegate

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

Créer une instance du contrôleur d'interaction:

let documentController = UIDocumentInteractionController() 

Intercept les clics dans votre UIWebView à shouldStartLoadWithRequest, return false pour les liens que vous voulez traiter avec le dans -app aperçu et vrai pour tout le reste. Et enfin:

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

Ici, il est dans le simulateur

enter image description here

EDIT:

En réponse au commentaire à cette réponse: La raison pour laquelle il ne fonctionne pas pour vous est parce que le UIDocumentInteractionController dépend de l'extension de fichier. L'extension du fichier temporaire est .tmp

Renommer le fichier après le téléchargement résout le problème. Exemple rapide et sale:

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() 

Dans ce cas, il est conseillé de nettoyer après vous, car le fichier ne sera pas supprimé après la tâche complète bien le système d'exploitation supprimer éventuellement, lorsque l'espace est nécessaire. Si vous accédez souvent aux mêmes URLs, Library/Caches/ peut être un meilleur endroit pour ces fichiers, venez avec un bon schéma de nommage, et vérifiez si le fichier n'existe pas déjà.

+0

s'il vous plaît voir mon commentaire, cela n'a pas fonctionné pour moi (j'ai des liens 'https' pas locales, donc je fais un téléchargement d'abord) – swalkner