[ios] Safari에서 UIWebView 열린 링크

내 응용 프로그램 번들의 내용이 포함 된 매우 간단한 UIWebView가 있습니다. 웹보기의 링크가 웹보기 대신 Safari에서 열리기를 원합니다. 이게 가능해?



답변

이것을 UIWebView 델리게이트에 추가하십시오 :

(탐색 유형을 확인하도록 편집되었습니다. file://상대 링크 인 요청을 통과 할 수도 있습니다)

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

    return YES;
}

스위프트 버전 :

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if navigationType == UIWebViewNavigationType.LinkClicked {
            UIApplication.sharedApplication().openURL(request.URL!)
            return false
        }
        return true
    }

스위프트 3 버전 :

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.linkClicked {
        UIApplication.shared.openURL(request.url!)
        return false
    }
    return true
}

스위프트 4 버전 :

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
    guard let url = request.url, navigationType == .linkClicked else { return true }
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
    return false
}

최신 정보

openURLiOS 10에서 더 이상 사용되지 않는 것처럼 :

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

        return YES;
}


답변

궁금한 점이 있다면 Drawnonward의 솔루션은 Swift 에서 다음과 같이 보일 것입니다 .

func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.LinkClicked {
        UIApplication.sharedApplication().openURL(request.URL)
        return false
    }
    return true
}


답변

user306253의 답변에 대한 한 가지 간단한 설명 : UIWebView에 직접 (예 : 코드에서) 무언가를로드하려고하면이 방법으로 인해 발생하지 않도록주의하십시오.

이것을 방지하기 위해 할 수있는 일은 (Wade 덕분에) 다음과 같습니다.

if (inType == UIWebViewNavigationTypeLinkClicked) {
    [[UIApplication sharedApplication] openURL:[inRequest URL]];
    return NO;
}

return YES;

UIWebViewNavigationTypeFormSubmittedUIWebViewNavigationTypeFormResubmitted유형 을 처리 할 수도 있습니다.


답변

다른 답변에는 한 가지 문제가 있습니다. 링크에 의존하지 않고 Safari 또는 웹보기에로드할지 여부를 결정하는 링크 자체가 아닙니다.

때때로 이것은 정확히 당신이 원하는 것입니다. 그러나 다른 경우, 특히 페이지에 앵커 링크가있는 경우 내부 링크가 아닌 Safari에서 외부 링크 만 열어야합니다. 이 경우에는URL.host 요청 속성을 합니다.

해당 코드를 사용하여 구문 분석중인 URL에 호스트 이름이 있는지 또는 html이 포함되어 있는지 확인합니다.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    static NSString *regexp = @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9])[.])+([A-Za-z]|[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9])$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexp];

    if ([predicate evaluateWithObject:request.URL.host]) {
        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    } else {
        return YES;
    }
}

물론 필요에 맞게 정규식을 조정할 수 있습니다.


답변

Swift에서는 다음 코드를 사용할 수 있습니다.

extension YourViewController: UIWebViewDelegate {
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
        if let url = request.url, navigationType == UIWebView.NavigationType.linkClicked {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
            return false
        }
        return true
    }

}

URL 값과 navigationType을 확인하십시오.


답변

다음은 drawnonward의 답변과 동일한 Xamarin iOS입니다.

class WebviewDelegate : UIWebViewDelegate {
    public override bool ShouldStartLoad (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) {
        if (navigationType == UIWebViewNavigationType.LinkClicked) {
            UIApplication.SharedApplication.OpenUrl (request.Url);
            return false;
        }
        return true;
    }
}


답변

수락 된 답변이 작동하지 않습니다.

페이지가 자바 스크립트를 통해 URL을로드하는 경우 navigationType는입니다 UIWebViewNavigationTypeOther. 불행히도 분석과 같은 백그라운드 페이지로드도 포함됩니다.

페이지 탐색을 감지하려면와를 비교해야 [request URL]합니다 [request mainDocumentURL].

이 솔루션은 모든 경우에 작동합니다.

- (BOOL)webView:(UIWebView *)view shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)type
{
    if ([[request URL] isEqual:[request mainDocumentURL]])
    {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    else
    {
        return YES;
    }
}