2017-10-31 2 views
0

Ich habe eine WKWebView in meiner Anwendung. Ich benutze UIWebView nicht, weil es aus irgendeinem seltsamen Grund nicht richtig eine Webseite mit viel JS-Code darin öffnet.WKWebView nicht benutzerdefinierte URL-Schema zu öffnen (Js öffnet benutzerdefinierte Schema-Link in einem neuen Fenster)

Wenn ich mit benutzerdefinierten URL-Schema auf den Link tippen Sie auf "scm: //", tut es nichts ...

Mein Code:

- (void)viewDidLoad { 
    // ... 

    WKWebViewConfiguration *configuration = [WKWebViewConfiguration new]; 
    if ([configuration respondsToSelector:@selector(setDataDetectorTypes:)]) 
     [configuration setDataDetectorTypes:WKDataDetectorTypeLink]; 

    myWebView = [[WKWebView alloc] initWithFrame:webFrame configuration:configuration]; 
    myWebView.navigationDelegate = self; 

    [self.view addSubview:myWebView]; 
} 

#pragma mark - WKNavigationDelegate 

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 
{ 
    NSURL *requestURL = navigationAction.request.URL; 
    UIApplication *app = [UIApplication sharedApplication]; 
    if ([requestURL.scheme.lowercaseString isEqualToString:@"scm"] && [app canOpenURL:requestURL]) { 
     [app openURL:requestURL]; 
     decisionHandler(WKNavigationActionPolicyCancel); 
    } 
    else 
     decisionHandler(WKNavigationActionPolicyAllow); 
} 

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation 
{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error 
{ 
    [self handleError:error]; 
} 

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error 
{ 
    [self handleError:error]; 
} 

#pragma mark - Handle web view errors. 

- (void)handleError:(NSError *)error 
{ 
    UIApplication *app = [UIApplication sharedApplication]; 
    app.networkActivityIndicatorVisible = NO; 

    NSURL *failedUrl = error.userInfo[NSURLErrorFailingURLErrorKey]; 

    if ([failedUrl.scheme.lowercaseString isEqualToString:@"scm"]) { 
     [app openURL:failedUrl]; 
    } 
} 

Wenn ich benutzerdefinierte URL klicken , handleError() wird nie aufgerufen, weder decidePolicyForNavigationAction().

Antwort

2

Ok, dachte this out ... kommt vor, dass der Link in einem neuen Fenster geöffnet wird, so dass beim nächsten Code hinzufügen zusammen mit Einstellung UIDelegate machte es Arbeit

// Somewhere in viewDidLoad()... 
    myWebView.UIDelegate = self; 
} 

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures 
{ 
    NSLog(@"createWebViewWithConfiguration %@ %@", navigationAction, windowFeatures); 
    if (!navigationAction.targetFrame.isMainFrame) { 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
     [(WKWebView *)_webView loadRequest:navigationAction.request]; 
    } 
    return nil; 
} 
+0

'Versuchte Einstellung UIDelegate ohne Glück 'scheinen, als hätten Sie etwas falsches in der Vergangenheit gemacht;) – trungduc

+0

Ja, ich habe nicht die Methode _createWebViewWithConfiguration_ hinzugefügt, weil das Tutorial _Complete Guide zur Implementierung von WKWebView_ es leider nicht hatte. – Borzh

2

Ich denke, das alles, was Sie über benutzerdefiniertes Schema wollen;)

https://medium.com/glose-team/custom-scheme-handling-and-wkwebview-in-ios-11-72bc5113e344

Sie können setURLSchemeHandler:forURLScheme: zu fügen ein URL-Schema Handler-Objekt für ein bestimmtes URL-Schema.

Wenn Sie benutzerdefinierte Schema von Swift hinzufügen möchten, erfahren Sie mehr http://samwize.com/2016/06/08/complete-guide-to-implementing-wkwebview/

+0

Dies ist nur für iOS 11 + ... Wie kann ich es in früheren iOS-Versionen beheben? – Borzh

+0

Wenn Sie einen kleinen Swift-Code lesen können, werfen Sie einen Blick auf diesen Link. Dies ist ein 'Complete Guide zur Implementierung von WKWebView' http://samwize.com/2016/06/08/complete-guide-to-implementing-wkwebview/. Wenn nicht, sagen Sie es mir;) – trungduc

+0

passiert, dass ich meinen Code implementiert, mit der gleichen Tutorial-Link, die Sie zur Verfügung gestellt, aber es funktioniert nicht ... überprüfen Sie meinen Code, sogar HandleError-Methode ist das gleiche – Borzh

0
-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{ 

    NSURLRequest *request = navigationAction.request; 
    if(![request.URL.absoluteString hasPrefix:@"http://"] && ![request.URL.absoluteString hasPrefix:@"https://"]) { 
     if([[UIApplication sharedApplication] canOpenURL:request.URL]) { 
      //urlscheme, tel, mailto, etc. 
      [[UIApplication sharedApplication] openURL:request.URL]; 
      decisionHandler(WKNavigationActionPolicyCancel); 
      return; 
     } 
    } 
    decisionHandler(WKNavigationActionPolicyAllow); 
} 

Hinweis: Diese Antwort ist nur Fokus auf urlscheme, aber vielleicht zu anderen Problemen führen. Vielen Dank für Ihr Feedback!

Verwandte Themen