41 votes

La Force d'une WebView lien pour le lancement de Safari?

J'ai une UIWebView intégré au sein d'une application iPhone de la mine. Je veux être en mesure d'avoir certains liens dans ce webview ouvrir en plein Safari Mobile app (c'est à dire pas ma version intégrée de elle).

Est-il un moyen simple de la structure de certains de mes hrefs à force cela, au lieu de tous ouvrir un lien dans mon incorporé webview?

Merci.

61voto

Brad Larson Points 122629

Pour élargir ce que Randy l'a dit, c'est ce que j'utilise dans mon application pour faire de chaque http://, https://, et mailto:// URL de l'ouvrir à l'extérieur Safari ou les applications de Messagerie:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 
{
    NSURL *requestURL =[ [ request URL ] retain ]; 
    if ( ( [ [ requestURL scheme ] isEqualToString: @"http" ] || [ [ requestURL scheme ] isEqualToString: @"https" ] || [ [ requestURL scheme ] isEqualToString: @"mailto" ]) 
        && ( navigationType == UIWebViewNavigationTypeLinkClicked ) ) { 
        return ![ [ UIApplication sharedApplication ] openURL: [ requestURL autorelease ] ]; 
    } 
    [ requestURL release ]; 
    return YES; 
}

Randy dit, vous aurez envie de mettre en œuvre ce à l'intérieur quelle que soit la classe que vous définissez à être le délégué de la UIWebView. Pour avoir de sélectionner uniquement les Url de lancement de Safari, vous pouvez modifier leur régime de http:// safari://, ou quelque chose de similaire, et seulement à coup de pied ces Url off pour le système (après le remplacement de la coutume schéma d'URL avec l'adresse http://).

Je le fais dans ma interne à l'aide de la documentation, qui est HTML affiché dans une UIWebView, de sorte que je n'ai pas de problèmes dans le processus d'examen avec le fait d'avoir un navigateur web intégré dans mon application.

20voto

aqm Points 181

Ok je l'ai eu. C'est peut-être pas la solution idéale, mais vous pouvez le faire comme ceci:

Seulement dans votre WebViewController.m:

ajoutez la ligne webView.delegate = self; de la viewDidLoad procédure:

- (void)viewDidLoad {
    webView.delegate = self;
    .... your code ....
}

Ensuite, vous pouvez ajouter comme décrit ci-dessus, quelque part en Controller.m le Fichier booléennes suivantes résultant de la fonction:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        [[UIApplication sharedApplication] openURL:request.URL];
        return false;
    }
    return true;
}

12voto

Randy Simon Points 2387

Je n'ai pas essayé moi-même mais je pense que vous pouvez mettre en œuvre la méthode UIWebViewDelegate

webView:shouldStartLoadWithRequest:navigationType 

qui va être appelée à tout moment un lien dans la UIWebView est cliqué. Dans cette méthode, vous avez juste besoin de déterminer si le lien cliqué devrait se traduire dans le lancement de Safari ou pas et utilisez openURL si il le faut.

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

    // Check if this was a click event and then some other criteria for determining if you want to launch Safari.
    if (navigationType == UIWebViewNavigationTypeLinkClicked && [Some other criteria]) {
        [[UIApplication sharedApplication] openURL:request.URL];

        // Return false to indicate to the UIWebView to not navigate to the linked target
        return false;
    }

    // Return true so that the UIWebView loads the link target
    return true;
}

N'oubliez pas que vous devez définir votre UIWebView délégué de la propriété à une instance de la classe qui implémente l'UIWebViewDelegate.

1voto

Dwight Mix Points 1

C'est la façon dont nous l'avons résolu, ajoutez ceci à votre ViewController.m fichier:

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    first.delegate = (id)self;
                [first loadRequest:[NSURLRequest requestWithURL:[NSURL     URLWithString:@"http://my.FellowshipNWA.org?publicapp"]]];
}

// Add section below so that external links & PDFs will open in Safari.app
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request     navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeOther) {
        NSString *checkURL = @"http://my.fellowshipnwa.org/?givenowsafari";
        NSString *reqURL = request.URL.absoluteString;
        if ([reqURL isEqualToString:checkURL])
             {
                 [[UIApplication sharedApplication] openURL:request.URL];
            return false;
    }
        else {
            return true;
        }
    }
    return true;
}

0voto

AndreLung Points 31

Est-il aussi un moyen de le faire à partir de la vue de l'utilisateur (par exemple en ouvrant une fenêtre de safari à partir d'un tiers qr-code app)?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X