Links in WKWebView zufällig nicht anklickbar

9

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

fredpi 09.01.2016, 12:12
quelle

3 Antworten

1

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:

%Vor%

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:

%Vor%

Vergessen Sie nicht, das div am Ende der HTML-Zeichenfolge hinzuzufügen:

%Vor%     
fredpi 30.01.2016, 09:24
quelle
1

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%     
Allen 18.01.2016 17:38
quelle
1

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.

    
Victor Sigler 21.01.2016 15:20
quelle

Tags und Links