In meiner in Swift 2.1 geschriebenen iOS-App verwende ich ein WKWebView, um eine HTML-Zeichenfolge zu laden, die mit einem JSON-Parser aus einem Wordpress-Blog geladen wird.
Ich habe die Delegate-Methode func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
implementiert und den Navigationsdelegaten von WKWebView auf self gesetzt, um Link-Druckvorgänge zu verarbeiten.
Wenn ich jetzt den ViewController öffne, der das WKWebView enthält, wird diese Delegate-Methode einmal aufgerufen. Dies ist das Verhalten, das Sie beim Laden von webView erwarten würden - also scheint der Delegat richtig eingestellt zu sein.
Mein Problem ist jetzt, dass die Links, die das WebView enthält, meistens nicht anklickbar sind. Sie würden normalerweise erwarten, dass ein grauer Hintergrund angezeigt wird, wenn Sie auf einen Link klicken, wie auf dem Bild unten zu sehen ist. Aber die meiste Zeit, wenn ich einen Link drücke, erscheint der graue Hintergrund nicht, also wenn ich aufbessere, wird die Delegate-Methode nicht aufgerufen. Dieses Problem muss sicherlich nicht mit einer Fehlkonfiguration von WKNavigationDelegate
zu tun haben, da manchmal die Linkauswahl richtig funktioniert (ca. 10%).
Haben Sie eine Idee, warum Links zufällig manchmal nicht anklickbar und manchmal anklickbar sind (10% der Fälle)?
Die Lösung besteht darin, die Verwendung von contentInset
zu entfernen. Leider ist WKWebView
nicht darauf ausgelegt, die Verwendung zu handhaben (wenn contentInset
negativ ist), also müssen wir eine Umgehungslösung verwenden, indem wir einfach eine leere div
zu der htmlString hinzufügen:
Wenn der untere Einschub geändert werden sollte, ohne die gesamte Seite neu zu laden, könnte man am Anfang einen riesigen div
einfügen und ihn dann durch Hinzufügen eines positiven contentInset
ersetzen. Genau das macht diese Erweiterung:
Vergessen Sie nicht, das div
am Ende der HTML-Zeichenfolge hinzuzufügen:
Wenn Sie Ihren Inhalt in WKWebView laden, setzen Sie möglicherweise die falsche baseURL für Ihre Webseite und dies führt zu einem ungültigen Link. Damit Ihr baseURL korrekt funktioniert, sollten Sie ihn auf die richtige http- oder https-URL für Ihre Website setzen Inhalt, für diejenigen, die Link arbeiten, nur weil sie volle URL in ihrem href hatten.
Hier ist der HTML-Text in die WKWebView geladen, um den Effekt zu veranschaulichen:
%Vor%Inhalt:
%Vor% Ich nehme an, dass das, was Sie wollen, eine Beschreibung oder Text an einer Stelle haben und erlauben, dass ein Teil des Textes anklickbar / getappt ist und Sie dafür WKWebView
verwenden möchten.
Ich löste dieses Problem mit WKWebView
auch in einer App, die ich vor langer Zeit gemacht habe, natürlich gibt es mehrere Lösungen, es ist nur eine davon, sonst nichts.
Wie einige Leute zu Ihnen sagten, können Sie die loadHTMLString
-Funktion verwenden, um die HTML-Zeichenfolge von Ihrem Server in JSON oder auf irgendeine andere Weise zu laden, aber es ist sehr wichtig, dass der HTML-Code fehlerfrei formatiert ist.
Ein sehr wichtiger Punkt über die Funktion loadHTMLString
in Bezug auf Ihren Kommentar ... Sie würden normalerweise erwarten, dass ein grauer Hintergrund angezeigt wird, wenn Sie auf einen Link klicken, wie in der folgenden Abbildung zu sehen ist. Es passiert nicht, wenn der HTML-Code keine Art von CSS-Stil hat, denn wenn nicht, hat er den Standard-Stil von <a><\a>
.
Sehen wir uns den folgenden Code an:
%Vor% Im obigen Code habe ich die Variable description
mit einem Text mit anklickbaren Elementen darin gesetzt und die beiden Delegate-Methoden didStartProvisionalNavigation
und didFinishNavigation
hinzugefügt, um in den Statusbalken einen networkActivityIndicatorVisible
anzuzeigen, um den Fortschritt anzuzeigen über das Laden der Seite, wenn der klickbare Text angetippt wird. Es ist gut zu bemerken, dass ich in der Variable htmlString
einige Stile gesetzt habe, um die <a>
mit etwas Farbe und Schriftart anzuzeigen, es liegt an dir.
Ich habe auch die didFailProvisionalNavigation
-Funktion hinzugefügt, um eine Warnung anzuzeigen. In einigen Fällen ist die URL nicht gültig für etwas wie das neue HTTPTransportSecurityLayer
hinzugefügt ist iOS 9, um in einigen Fällen nur Ссылка zuzulassen Sie können es verwenden, um die URL zu validieren und den Grund des Fehlers zu kennen.
Das Ergebnis ist der folgende Text in einem normalen UIViewController
:
Und wenn Sie auf einen grauen Text tippen, wird die URL in dasselbe WKWebView
geladen. Natürlich können Sie dies personalisieren, um es in einem internen Browser zu öffnen, den Sie machen oder etwas anderes, es liegt an Ihnen du.
Und dann können Sie das Ergebnis sofort sehen, wenn Sie auf Apple :
tippen Wenn Sie stattdessen auf Entwickler-Apple tippen, können Sie die Warnung in Aktion sehen, da das Protokoll Ссылка einen Fehler in HTTPTransportSecurityLayer
in iOS 9 verursacht:
Ich habe das Projekt bereit, um es auf Github hochzuladen, wenn Sie es brauchen. Ich hoffe, das hilft dir.