IOS Webkit для отслеживания URL, который используется, и URL URL Scheme - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь перенести мой iOS UIWebview в Webkit, но в результате я столкнулся с множеством проблем. У меня есть код в webView:shouldStartLoadWithRequest:navigationType:, до которого я использовал для мониторинга urls and url-scheem, как tell:, exit:, refresh:, mailto:, и чтобы убедиться, что только мой URL может открываться в WebView. Но, пытаясь реализовать тот же самый способ с помощью webkit, это не сработало, пожалуйста, я не уверен, что если я делаю это в методе write, может кто-нибудь мне помочь.

/ Попытка реализовать его с помощью webkit /

- (BOOL)webView:(WKWebView *)inWeb decidePolicyForNavigationAction:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType{
    NSLog(@"Event: %@", @"shouldStartLoadWithRequest inType called");
    NSArray *schemeArray = @[@"share", @"map", @"rate", @"reload", @"exit"];
    NSString *url = [[inRequest URL] query];
    NSString *scheme = [[inRequest URL] scheme];
    NSString *StrPurl = [NSString stringWithFormat:@"%@",url];

    NSLog(@"[inRequest URL] == %@", StrPurl);
    NSLog(@"[inRequest NSURL] == %@", url);
    NSLog(@"[[inRequest URL] scheme] == %@", scheme);

    if ([StrPurl containsString:@"mysite.com"]){
        //coninue open
    }else if ( [schemeArray containsObject:[[inRequest URL] scheme]] ){
        //open share intent
        NSLog(@"Event: Share URL %@", [[inRequest URL] scheme]);
    }

    NSLog(@"Event: Request URL %@", url);
    return NO;
}

Используя приведенный выше пример в UIWebview, он работает

- (BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType{

    if (self.validatedRequest || inType != UIWebViewNavigationTypeLinkClicked){
        NSString *url = [[inRequest URL] query];
        NSString *scheme = [[inRequest URL] scheme];
        NSString *StrPurl = [NSString stringWithFormat:@"%@",url];

        NSLog(@"[inRequest URL] == %@", StrPurl);
        NSLog(@"[inRequest NSURL] == %@", url);
        NSLog(@"[[inRequest URL] scheme] == %@", scheme);
    }
}

Также у меня есть этот метод, но он не вызывается, когда я нажимаю на tel: или другой внешний URL

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    NSLog(@"Event: %@", @"shouldStartLoadWithRequest navigationType called");
        //if (navigationAction.navigationType == WKNavigationTypeLinkActivated) {
        if (navigationAction.navigationType == UIWebViewNavigationTypeLinkClicked) {

        }
    NSString *url = [navigationAction.request.URL query];
    NSLog(@"Event: Request URL %@", url);
    decisionHandler(WKNavigationActionPolicyAllow);
}

1 Ответ

0 голосов
/ 15 мая 2019

Попробуйте этот метод делегата:

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

Вместо возврата NO вам нужно будет позвонить либо decisionHandler(WKNavigationActionPolicyAllow), либо decisionHandler(WKNavigationActionPolicyCancel)

Вы можете получить доступ к NSURLRequest, используяnavigationAction.request.

Источник: https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455641-webview?language=objc

...