web-dev-qa-db-fra.com

Des liens ouverts dans Safari au lieu de UIWebVIew?

J'ai une application avec une UIWebView dans une UIViewController. Je charge du HTML depuis un service Web sous forme de chaîne comme celle-ci:

self.webView loadHTMLString:_string baseURL:nil

Est-il possible que les liens HTML de cette chaîne soient ouverts dans le navigateur et non dans UIWebView dans mon application? Comment puis-je faire ceci?

J'ai essayé ceci dans UIViewController qui "héberge" le UIWebVIew:

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

Cela ne semble pas fonctionner ....

Des idées?

27
treasure

Avez-vous défini le délégué de la UIWebView sur votre UIViewController? D'après ce que je peux voir, votre code n'a rien qui cloche, il est donc probable qu'il s'agisse d'un problème aussi petit.

23
Stephen Darlington

Ajoutez ceci en classe .. 

@interface yourViewController : UIViewController
<UIWebViewDelegate>

Ajouter ceci dans View as load

- (void)viewDidLoad
{
    [description loadHTMLString:string baseURL:nil];
        description.delegate = self;
}

Ajoutez ceci dans votre fichier .m

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
    if ( inType == UIWebViewNavigationTypeLinkClicked ) {
        [[UIApplication sharedApplication] openURL:[inRequest URL]];
        return NO;
    }

    return YES;
}

Remarque: 

UIWebView *description;
@synthesize description;

Ensuite, cela fonctionnera parfaitement comme vous le méritez .. !! :)

21
Rajesh_Bangalore

Définissez le délégué du UIWebView sur votre UIViewController après avoir utilisé cette méthode UIWebview et vérifiez la condition. Par exemple, l'URL actuelle de Webview est google.com, si vous avez cliqué sur Gmail l'URL contient la chaîne avec Gmail. Utilisez la méthode ci-dessous pour ouvrir un navigateur Safari et charger automatiquement cette URL. 

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
    if ( inType == UIWebViewNavigationTypeLinkClicked ) {
        NSURL *url = [inRequest URL];
        if ([[url absoluteString] rangeOfString:@"gmail"].location == NSNotFound) {
            [[UIApplication sharedApplication] openURL:[inRequest URL]];
            return NO;
        }
    }
    return YES;
}
1
Karthik

Apple a introduit Safari View Controller sur iOS 9. Safari View Controller apporte toutes les fonctionnalités que l'utilisateur attend de Safari à votre application sans même la quitter.

Nous devons d'abord importer les services Safari

#import <SafariServices/SafariServices.h>

Pour l'objectif C: -

NSString *yourUrl = @"http://yourURL";
SFSafariViewController *svc= [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString: yourUrl]];
[self presentViewController:svc animated:YES completion:nil];

Pour Swift: -

let svc = SFSafariViewController(URL: NSURL(string: self.urlString)!)
self.presentViewController(svc, animated: true, completion: nil)
0
Vincent Joy

Si vous avez déjà configuré correctement UIWebViewDelegate, il suffit de faire

self.webView loadHTMLString:_string baseURL:nil
self.webView.delegate = self;

devrait marcher

0

Ajouter cette ligne ( Self.webview.delegate = self; )

Par exemple dans viewController.m

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[self.webview loadHTMLString:htmlString baseURL:nil];
self.webview.delegate = self;
0
Carlos Parada