externe Links nicht in PhoneGap öffnen

phonegaplogoPhonegap ist ja der Webbrowser der deine App auf jedem Smartphone anzeigt – als App. Der Vorteil gegenüber einer mobilen Webseite ist die Tatsache, dass die App nun über den App Store vertrieben werden kann, man viele Plattformen bedienen kann und zusätzlich auf Eigenschaften zugreifen kann, die eine HTML5-App nicht kann.

Dazu gibt es plattformspezifische Plug-ins, welche Systemfunktionen in Javascript abbildet.

Möchte man nun aber einen Link außerhalb der app starten, möchte man einerseits auch wieder zurück.. müsste man also was über iFrame etc. basteln, aber der User wird nicht glücklich da seine Cookies etc im Safari oder so sind.

Deswegen wäre es ja sinnvoll den Link im Standard-Browser zu starten.

Dazu muss als erstes der Link mit target auf „_blank“ gesetzt werden.

Anschliesend muss die MainViewController.m ergänzt werden. In Zeile 112-130 sind kommentierte Funktionen (Cordoba 2.4), und das ist auch gut so. Sollte es eine Zeile geben wie:

- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType

dann ist das der Methodenkopf und die Gesamte Funktion muss kommentiert werden.

komplette Funktion:

- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{
    return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
}

und ersetzt werden durch:

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = [request URL];

    // die ext. URL wird geprüft und bei Bedarf an Safari weitergeleitet.. sonst öffnen im internem webView

    if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) {      
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    else {
        return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
    }

}

der Code ist relativ einfach:
In Zeile 3 wird eine Variable url definiert vom Typ NSURL und belegt mit der URL aus dem request den UIWebView erhalten hat (getriggert durch das Event shouldStartLoadWithRequest).
In Zeile 7 wird geschaut ob das Schema http bzw. https entspricht was bedeutet, dass es ein externer Link ist (target=“_blank“ ist trotzdem notwendig!). Wenn das der Fall ist wird die damit verknüpfte App gestartet(Zeile 8). Anderenfalls wird der Request weitergeleitet an die UIWebView-Komponente(Zeile 12).

Über den Autor Danny Sotzny

Hallo, ich bin Danny Sotzny und bin Software- entwickler und Fotograf. Dabei beschäftige ich mich mit aktuellen Technologien und bekannten Problemen. Schwerpunkte setze ich bei der Webentwicklung (PHP/JS) und der Software- entwicklung mit .NET (C#). Der Blog dient für mich selbst als Gedächtnishilfe für typische und alltägliche Probleme, aber auch persönliche Erlebnisse werden veröffentlicht. Ich betreibe zusätzlich noch Foto-Sotzny.de für meine Fotografien und sotzny.net, was meine Webseite für die Softwareentwicklung ist.

3 Responses to “externe Links nicht in PhoneGap öffnen”

  1. Grappa sagt:

    DANKE! Endlich ein Ansatz der funktioniert.
    Irgenwie schein ein riesen durcheinander bei diesem Problem zu herrschen. Die Phonegap Doku zeigt zwar Wge auf, wie man externe Links im browser öffnen kann, nur leider funktionieren die bei mir nicht (_blank sollte laut Doku reichen).
    Leider funktioniert dein Weg mit PG-Build nicht, … aber man kann nicht alles haben.

    THX Grappa

  2. Efren sagt:

    Leider funktioniert diese Lösung nicht mehr. Beim Einbinden des Codes erhalte ich eine Fehlermeldung in XCode bei der Else Schleife.
    „No visible @interface for CDView Controller declares the selector ‚webView:shouldStartLoadWithRequest:navigationType:“
    Haben Sie hier zufällig bereits eine andere Lösung?

  3. Danny Sotzny sagt:

    nein leider nicht – konzentriere mich aktuell mehr auf Xamarin für Cross-Plattform-Entwicklung.

Leave a Reply

See also:

%d Bloggern gefällt das: