Ouvrir les liens externe à  la webview dans safari

Par0teckPar0teck Membre
Bonjour à  tous,

Je suis à  la recherche depuis plusieurs jours sur comment forcer l'ouvrir des liens externe à  la webview dans safari (ou au mieux dans un mini navigateur)
Car la pour le moment quand une personne clique sur un liens externe sa luis ouvre le site dans la webview...

Donc j"ai trouvez ce petit bout de code pour faire cela :

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request<br /><br /> navigationType:(UIWebViewNavigationType)navigationType {<br />&nbsp; &nbsp; // if the new content is due to click on a link<br />&nbsp; &nbsp; if (navigationType == UIWebViewNavigationTypeLinkClicked) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // standard way to launch external app, in this case safari<br />&nbsp; &nbsp; &nbsp; &nbsp; [[UIApplication sharedApplication] openURL:request.URL];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // tell the web view that we have handle it, so it should stop loading<br />&nbsp; &nbsp; &nbsp; &nbsp; return false;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // otherwise, tell the web view to load the content<br />&nbsp; &nbsp; return true;<br />}


Que je place dans mon Delegate mes rien n'y fait les liens externe à  ma webview s'ouvre toujours dans la même webview (Tester sur mon device)

Merci beaucoup à  la personne qui pourra m'aider ;)

Edit : j'ai essayer de m'être le code dans mon ViewController.h comme sa :

@implementation MonAppViewController<br />@synthesize webView;<br /><br /><br /><br />/*<br />// The designated initializer. Override to perform setup that is required before the view is loaded.<br />- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {<br />&nbsp; &nbsp; self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];<br />&nbsp; &nbsp; if (self) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Custom initialization<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br />*/<br /><br />/*<br />// Implement loadView to create a view hierarchy programmatically, without using a nib.<br />- (void)loadView {<br />}<br />*/<br /><br /><br /><br />// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.<br />- (void)viewDidLoad {<br />	[super viewDidLoad];<br /><br />	<br />	// Créer une URL<br />	NSURL *urlAddress = [NSURL URLWithString: @&quot;http://www.google.com&quot;];<br />	<br />	// Faire une requête sur cette URL<br />	NSURLRequest *requestObject = [NSURLRequest requestWithURL:urlAddress];<br />	<br />	// Charger la requête dans la UIWebView<br />	[webView loadRequest:requestObject];<br />}<br /><br />- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request<br /><br /> navigationType:(UIWebViewNavigationType)navigationType {<br />&nbsp; &nbsp; // if the new content is due to click on a link<br />&nbsp; &nbsp; if (navigationType == UIWebViewNavigationTypeLinkClicked) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // standard way to launch external app, in this case safari<br />&nbsp; &nbsp; &nbsp; &nbsp; [[UIApplication sharedApplication] openURL:request.URL];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // tell the web view that we have handle it, so it should stop loading<br />&nbsp; &nbsp; &nbsp; &nbsp; return false;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // otherwise, tell the web view to load the content<br />&nbsp; &nbsp; return true;<br />}<br /><br /><br />/*<br />// Override to allow orientations other than the default portrait orientation.<br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />&nbsp; &nbsp; // Return YES for supported orientations<br />&nbsp; &nbsp; return (interfaceOrientation == UIInterfaceOrientationPortrait);<br />}<br />*/<br /><br />- (void)didReceiveMemoryWarning {<br />	// Releases the view if it doesn&#39;t have a superview.<br />&nbsp; &nbsp; [super didReceiveMemoryWarning];<br />	<br />	// Release any cached data, images, etc that aren&#39;t in use.<br />}<br /><br />- (void)viewDidUnload {<br />	// Release any retained subviews of the main view.<br />	// e.g. self.myOutlet = nil;<br />}<br /><br /><br />- (void)dealloc {<br />	[webView dealloc];<br />&nbsp; &nbsp; [super dealloc];<br />}<br /><br />@end


Et sa ne fonctionne toujours pas malheureusement :(

Ai-je Fais Une Erreur ?

Merci beaucoup de votre aide ;)

Bonne journée à  vous

Réponses

  • extremtouchextremtouch Membre
    19:46 modifié #2
    Tu as vérifié en debug que tu passais bien dans la fonction 'shouldStartLoadWithRequest' ?
    Si ton delegate a bien été fixé, il n'y a rien d'autre à  ajouter à  priori, j'ai le même code avec un filtrage d'url pour ne rediriger que certaines adresses.
  • AliGatorAliGator Membre, Modérateur
    19:46 modifié #3
    A tous les coups tu n'as pas indiqué que ta classe était le delegate de ta webview.
  • Par0teckPar0teck Membre
    février 2011 modifié #4
    Merci de votre aide ;)

    dans 1297534155:

    A tous les coups tu n'as pas indiqué que ta classe était le delegate de ta webview.


    Je ne voit pas trop ce que tu veux dire, comment faire cela?

    Merci ;)
  • AliGatorAliGator Membre, Modérateur
    19:46 modifié #5
    Hello

    Comment faire cela bah par IB en tirant l'outlet "delegate" de la webview vers l'objet que tu utilises comme delegate.
    Par code sinon, c'est comme tu veux.

    Si tu ne sais pas faire cela, ou que ça ne te parle pas, je te conseille vivement de relire la doc et de te replonger dans les bouquins/tutos sur Cocoa : l'utilisation des delegates mais aussi les outlets, c'est un concept de base de Cocoa qui ne s'explique pas en une phrase, et si tu ne le maà®trises pas tu auras un peu du mal pour la suite.
  • Par0teckPar0teck Membre
    19:46 modifié #6
    Merci, Je vois à  peu près, je dois encore bouquiner c'est vrai :)

    Mais ce que je voudrais juste, C'est ouvrir tous les liens externes dans Safari.
  • extremtouchextremtouch Membre
    19:46 modifié #7
    par code dans ton viewcontroller :

    webView.delegate = self;

  • Par0teckPar0teck Membre
    février 2011 modifié #8
    Un grand merci, J'ai déjà  bien avancé dans ce que je voulais faire grâce a vous. :)

    Mais il reste encore un petit problème. En faite, maintenant il m'ouvre tous les liens dans safari. Comment faire pour qu'il n'ouvre dans Safari que les lien externes à  mon domaine.
  • extremtouchextremtouch Membre
    19:46 modifié #9
    ca peut t'aider ..
    avec ça je filtre les adresses iTunes ..

    if( (navigationType == UIWebViewNavigationTypeLinkClicked) )<br />{<br />&nbsp; &nbsp; &nbsp; NSUrl *url = [request URL];<br />&nbsp; &nbsp; &nbsp; if([[url absoluteString] rangeOfString:@&quot;http://itunes.apple.com&quot;].length &gt; 0)<br />	{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //.......<br />		return NO;<br />	}<br />}
    
  • AliGatorAliGator Membre, Modérateur
    février 2011 modifié #10
    Petits conseils au passage :

    1) Pour tester si une chaà®ne contient une autre chaà®ne, il est plutôt conseillé de tester, avec rangeOfString, si .location != NSNotFound plutôt que si .length>0, mais bon
    2) Pour tester un domaine, utiliser plutôt les méthodes de NSURL, comme la méthode "host" qui retourne l'hôte de l'URL ("apple.com"), ou baseURL ou quoi, pour accéder aux parties de la NSURL, puis utiliser isEqualToString pour comparer. Comme ça quel que soit le format de l'URL cela restera valable.
  • extremtouchextremtouch Membre
    19:46 modifié #11
    Ca m'apprendra à  repiquer du code pas terrible ;)

    merci pour les conseils
  • AliGatorAliGator Membre, Modérateur
    février 2011 modifié #12
    Lol non mais ton code est bien et marche quand même hein, c'est pas un drame ;)
    C'était juste pour info en passant ;)
    Et au moins ça a le mérite de donner une piste à  Par0teck
  • extremtouchextremtouch Membre
    19:46 modifié #13
    Pas de soucis, j'apprécie fortement tes remarques et en prend note ;)
  • Par0teckPar0teck Membre
    février 2011 modifié #14
    Merci, j'ai avancé encore d'un grand pas mais je me heure à  un problème. ;)

    Après quelque recherche, je me suis retrouvé avec un "hasPrefix"

    Du coup la demande est: Si l'url est égale à  "MonDomaine", Ouvrir celle-ci dans Safari.

    Alors que je voudrait faire exactement l'inverse. :s

    Il faudrait en fait un "hasNotPrefix"

    Mais je n'ai pas trouvé de solutions pour avec quelque chose de se genre.
  • AliGatorAliGator Membre, Modérateur
    19:46 modifié #15
    Heu oui mais si tu es bloqué par ce genre de problème, c'est même peut-être les bases de C qu'il faut réviser, et l'opérateur de négation...
  • Par0teckPar0teck Membre
    février 2011 modifié #16
    Bonjour :)

    Si mes souvenirs sont bons on utilise le point d'exclamation pour inverser le sens de l'expression.

    Du moins je pense. Mais du coup j'ai du tout ou rien, soit sa ouvre tout dans safari, soit rien :/

    Sa a pourtant l'air si simple :p

    Edit: Voilà  mon code:

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {<br />&nbsp; &nbsp; if (navigationType == UIWebViewNavigationTypeLinkClicked) {<br />&nbsp; &nbsp; &nbsp; &nbsp; NSURL *url = [request URL];<br />&nbsp; &nbsp; &nbsp; &nbsp; if (![[url scheme] hasPrefix:@&quot;http://apple.com&quot;]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[UIApplication sharedApplication] openURL:url];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return NO;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return YES;<br />
    
  • extremtouchextremtouch Membre
    19:46 modifié #17
    tu utilises hasprefix pour tester l'url c'est pas le bon plan !

    on t'avais orienté sur :

    NSUrl *url = [request URL];<br />if([[url absoluteString] rangeOfString:@&quot;http://itunes.apple.com&quot;].location != NSNotFound)<br />{<br /><br />}<br /><br />ou le contraire :<br /><br />if([[url absoluteString] rangeOfString:@&quot;http://itunes.apple.com&quot;].location == NSNotFound)<br />{<br /><br />}<br />
    

  • AliGatorAliGator Membre, Modérateur
    19:46 modifié #18
    hasPrefix marche aussi si ce qu'on recherche est au début de la chaà®ne (c'est même plus rapide que rangeofString dans ce cas là ), bien que ça base la comparaison sur la chaà®ne représentant l'URL et pas sur les composants de l'URL (donc en terme objet c'est pas le plus clean mais bon je chipotte)
    Après "fais ceci si la chaà®ne ne commence pas par toto" c'est pareil que "fait ceci s'il est faux que la chaà®ne commence par toto", le reste est du C de base, il suffit d'inverse ta condition avec "!".
  • extremtouchextremtouch Membre
    19:46 modifié #19
    J'ai répondu trop vite sur le coup la.
    je ne sais pas pourquoi j'étais persuadé que hasprefix prenait juste http / mailto

    autant pour moi
  • Par0teckPar0teck Membre
    19:46 modifié #20
    Merci pour vos réponses.

    Le "!" est déjà  placé (Voir le code au-dessus) Mais comme j'ai dit c'est tout ou rien. Il n'a pas l'air de prendre en compte le hasprefix.

    J'ai donc essayé la méthode de Extremtouch, ce qui a fonctionné.

    Un grand Merci a vous deux ;)

    Mais je n'arrive toujours pas à  comprendre où est mon erreur avec le hasprefix
  • Par0teckPar0teck Membre
    19:46 modifié #21
    Je reviens à  la charge (Décidément cette fonction ne m'aime pas)

    J'ai créé une nouvelle application, en partie basée sur une UIWebView.

    Et donc plus aucune méthode ne marche.

    Je pense que le problème vient du fait que la WebView affichée est appelée dans le Delegate. Et non dans un ViewController comme l'application précédente.

    Le problème est qu'avec mon niveau de débutant je n'arrive pas a faire en sorte qu'après le fadeScreen de mon premier view controller, et ensuite reomber sur un autre ViewController et ne pas charger la webView dans le délégate.

    Si je me suis bien exprimé.

    Merci a vous pour toute piste :)
Connectez-vous ou Inscrivez-vous pour répondre.