2016-09-27 10 views
0

Ich habe eine Swift iOS-App mit dem einzigen Zweck, eine Website mit Hilfe von WKWebView anzuzeigen.WKWebView Links funktioniert nicht

Dies funktioniert gut, aber das Drücken auf Links (z. B. auf einer [mailto:] Schaltfläche) funktioniert nicht, weil es nichts öffnen kann!

Hat jemand eine Lösung dafür?

Ich habe viel über das Lösen dieses gelesen, aber ich weiß nicht, wo ich anfangen soll.

Danke für die Hilfe

[UPDATE:]

Der folgende Code zeigt die Lösung

import UIKit 
import WebKit 

class ViewController: UIViewController, WKNavigationDelegate { 

    @IBOutlet var containerView : UIView! = nil 
    var webView: WKWebView? 

    override func loadView() { 
     super.loadView() 

     self.webView = WKWebView() 
     self.view = self.webView! 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     webView?.navigationDelegate = self 
     let url = NSURL(string:"https://google.de") 
     let req = NSURLRequest (URL: url!) 
     self.webView!.loadRequest(req) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 

    func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) { 

     let url = navigationAction.request.URL?.absoluteString 
     let url_elements = url!.componentsSeparatedByString(":") 

     switch url_elements[0] { 
     case "mailto": 
      openCustomApp("mailto://", additional_info: url_elements[1]) 
      decisionHandler(.Cancel) 

     default: 

     } 

     decisionHandler(.Allow) 
    } 

    func openCustomApp(urlScheme:String, additional_info:String){ 

     if let requestUrl:NSURL = NSURL(string:"\(urlScheme)"+"\(additional_info)") { 
      let application:UIApplication = UIApplication.sharedApplication() 
      if application.canOpenURL(requestUrl) { 
       application.openURL(requestUrl) 
      } 
     } 
    } 
} 
+1

Sieht gut aus. Haben Sie die decidePolicyForNavigationAction debuggt? Die URL zum Beispiel? Im Grunde brauchen Sie nur mailto: //[email protected] – OhadM

+0

Sie haben gerade das Problem gelöst. Die Antwort unten ist der richtige Weg und der obige Code zeigt die Lösungen. Mein einziges Problem war, dass der mailto: link nicht richtig formatiert wurde! Danke an euch alle –

Antwort

2

Sie haben die folgende Methode (Teil von WebKit) zu implementieren, die verwendet werden kann, um solche URLs zu analysieren:

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) 

Die Idee ist, if-Anweisungen zu schreiben, um nach bestimmten URL-Typen zu suchen, bevor die Entscheidung getroffen wird. Mehr Infos hier:

Beachten Sie, dass einige der Syntax für die Teilnehmer leicht in Swift 3 geändert hat - etwas im Auge zu behalten, wenn Tutorials mit . Wenn Sie dies bereits gefunden haben, aber ein Fehler aufgetreten ist, geben Sie Ihren Code ein.

EDIT: nur ein Update für andere, die auf diese Frage stolpern. Denken Sie daran, dass Sie die richtige Formatierung für mailto z. mailto://[email protected] (wie von OhadM in den Kommentaren des OP erwähnt)

+0

Danke für die Hilfe bis jetzt, ich fand das GitHub-Beispiel, das du gepostet hast, aber ich bin mir nicht sicher, wie und wo es zu setzen ist und wie man es benutzt –

+0

@ChrisNeumaier Du musst es im ViewController benutzen, wo du WebKit verwendest . Beginnen Sie mit der Eingabe in Ihrer Klasse und Xcode hilft Ihnen beim Code-Skelett. Die Methode ist bereits Teil von WebKit - wie viewDidLoad ist ein Teil von UIKit. decidePolicyForNavigationAction hilft Ihnen bei der Entscheidung, was mit URLs geschehen soll. – tech4242

+0

Ich habe meinen ursprünglichen Beitrag mit meinem ViewController aktualisiert. Ich habe mit der Funktion gespielt, die Sie vorgeschlagen haben, aber ich kann nicht richtig funktionieren –

Verwandte Themen