답변:
이것을 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
}
최신 정보
openURL
iOS 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;
}
switch
열거 형 유형에 a 가 바람직 하다고 생각 합니다.
궁금한 점이 있다면 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
}
UIWebViewDelegate
user306253의 답변에 대한 한 가지 간단한 설명 : UIWebView에 직접 (예 : 코드에서) 무언가를로드하려고하면이 방법으로 인해 발생하지 않도록주의하십시오.
이것을 방지하기 위해 할 수있는 일은 (Wade 덕분에) 다음과 같습니다.
if (inType == UIWebViewNavigationTypeLinkClicked) {
[[UIApplication sharedApplication] openURL:[inRequest URL]];
return NO;
}
return YES;
UIWebViewNavigationTypeFormSubmitted
및 UIWebViewNavigationTypeFormResubmitted
유형 을 처리 할 수도 있습니다.
다른 답변에는 한 가지 문제가 있습니다. 링크에 의존하지 않고 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;
}
}
물론 필요에 맞게 정규식을 조정할 수 있습니다.
if (request.URL?.scheme != "file")
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;
}
}
앱 거부 참고 :
마침내 UIWbView
애플은 죽었고 애플은 더 이상 받아들이지 않을 것이다.
Apple은 여전히 사용중인 모든 앱 소유자에게 이메일을 보내기 시작했습니다 UIWebView
.
더 이상 사용되지 않는 API 사용-Apple은 API를 사용하는 앱의 제출을 허용하지 않습니다 UIWebView
.
Apple은 사용자 개인 정보를 매우 중요하게 생각하며 안전하지 않은 웹뷰를 허용하지 않습니다 .
따라서 가능한 빨리 앱에서 UIWebView를 제거하십시오. UIWebView
새로 만든 앱에서 사용하지 말고 WKWebView
가능한 경우 사용 하는 것이 좋습니다
ITMS-90809 : 더 이상 사용되지 않는 API 사용-Apple은 UIWebView API를 사용하는 앱의 제출을 허용하지 않습니다. 자세한 내용은 https://developer.apple.com/documentation/uikit/uiwebview 를 참조하십시오.
예:
import UIKit
import WebKit
class WebInfoController: UIViewController,WKNavigationDelegate {
var webView : WKWebView = {
var webview = WKWebView()
return webview
}()
var _fileName : String!
override func viewDidLoad() {
self.view.addSubview(webView)
webView.fillSuperview()
let url = Bundle.main.url(forResource: _fileName, withExtension: "html")!
webView.loadFileURL(url, allowingReadAccessTo: url)
let request = URLRequest(url: url)
webView.load(request)
}
func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
print(error.localizedDescription)
}
func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print("Strat to load")
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
print("finish to load")
}
}
필자의 경우 웹로드의 모든 것이 초기로드를 제외하고 Safari를 열도록하고 싶습니다.
- (BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if(inType != UIWebViewNavigationTypeOther) {
[[UIApplication sharedApplication] openURL:[inRequest URL]];
return NO;
}
return YES;
}