9
votes

Liens WebView d'ouverture dans Safari

Je développe une demande en cacao, et j'aimerais savoir s'il y a un moyen / comment effectuer tout lien cliqué sur My Webview pour lancer dans Safari (ou le navigateur par défaut). Merci d'avance!


0 commentaires

4 Réponses :


23
votes

Je viens de courir dans ce problème moi-même et je l'ai résolu de cette façon:

Mon objet de contrôleur principal a été défini comme la stratégieDélégate de WebView.

puis implémentez cette méthode: < PRE> XXX

J'ai besoin d'avoir la vérification de l'hôte là-bas, car sinon lorsque je charge le contenu initial de la WEBView (juste une page HTML statique de mon projet), il a été lancé dans Safari. Maintenant, juste des liens avec des hôtes réels (liens externes) sont envoyés à Safari, qui est le comportement que je voulais. Je pense que je ne pouvais pas non plus définir la stratégieDélégate qu'après le chargement de la page initiale.


0 commentaires

8
votes

Je suis tombé sur le même problème et la solution que j'ai trouvée n'est pas trop intuitive.

Comme réponse précédente indiquée, vous devez utiliser le protocole WebpolicyDelegate code> défini dans code>. C'est un protocole informel, vous ne pouvez donc pas écrire @interface mydelegate: NsObject code>. P>

#import code> ( ou l'ensemble de la webkit.h) et implémentez le webview: DépartPolicyForNAVIGHIERNAVIGATION: DEMANDE: CADRE: DISCITLISTENER: CODE> Méthode de suivi: P>

- (void)webView:(WebView *)webView 
decidePolicyForNavigationAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request 
          frame:(WebFrame *)frame 
decisionListener:(id <WebPolicyDecisionListener>)listener
{
  if ([actionInformation objectForKey:WebActionElementKey]) {
    [listener ignore];
    [[NSWorkspace sharedWorkspace] openURL:[request URL]];
  }
  else {
    [listener use];
  }
}


0 commentaires

7
votes

Merci pour la pointe! Je n'ai pas dû naviguer uniquement les liens externes vers Safari. Pour obtenir un nom Ancreur (avec #) pour afficher dans la WEBVIEW, j'ai suivi:

 - (void)webView:(WebView *)webView 
decidePolicyForNavigationAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request 
          frame:(WebFrame *)frame 
decisionListener:(id <WebPolicyDecisionListener>)listener
{
    NSDictionary *info = actionInformation;
    NSURL *url = [info objectForKey:WebActionOriginalURLKey];
    NSString *path = [url absoluteString];
    NSRange range;

    range = [path rangeOfString:@"file://"];

    if (range.location != 0) {
        // open in Safari ö
        [listener ignore];
        [[NSWorkspace sharedWorkspace] openURL:[request URL]];
    }
    else {
        // open in webView because link starts with file://...
        [listener use];
    }
}


0 commentaires

0
votes

SWIFT

EXEMPLE SWIFT ci-dessous: P>

override func webView(webView: WebView!, decidePolicyForNavigationAction actionInformation: [NSObject : AnyObject]!, request: NSURLRequest!, frame: WebFrame!, decisionListener listener: WebPolicyDecisionListener!) {
    //Check action action type, if click, open an external view
    let info:NSDictionary = actionInformation as NSDictionary
    let mode:Int = info.valueForKey(WebActionNavigationTypeKey) as Int
    if mode == 0 {
        NSWorkspace.sharedWorkspace().openURL(request.URL)
        self.mainFrame.reload()
    }else{
        listener.use()
    }
}


1 commentaires

J'ai essayé cela, mais le rappel de la stratégie ne s'appelle pas de liens cliqués, uniquement lors du chargement d'une page.