2010-03-28 36 views
40

我在我的iPhone應用程序中嵌入了一個UIWebView。我希望能夠在該webview中的某些鏈接中打開完整的Mobile Safari應用程序(即不是我的嵌入式版本)。強制一個WebView鏈接啓動Safari?

有沒有一種簡單的方法來構建我的一些hrefs來強制這個,而不是在我的嵌入式webview中打開每個鏈接?

謝謝。

+0

[http://stackoverflow.com/questions/4452719 /怎麼辦,我打開鏈接,在野生動物園 - INSTEAD-OF-的UIWebView/12103579#12103579] [1] [1]:HTTP://計算器。com/questions/4452719/how-do-i-open-links-in-safari-instead-of-uiwebview/12103579#12103579 – 2012-08-24 05:41:27

回答

12

我還沒有嘗試過這個自己,但我認爲,你可以實現UIWebViewDelegate方法

webView:shouldStartLoadWithRequest:navigationType 

將被稱爲隨時在UIWebView中的鏈接被點擊。在該方法中,您只需確定點擊的鏈接是否應導致啓動Safari,如果它應該使用openURL。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    // Check if this was a click event and then some other criteria for determining if you want to launch Safari. 
    if (navigationType == UIWebViewNavigationTypeLinkClicked && [Some other criteria]) { 
     [[UIApplication sharedApplication] openURL:request.URL]; 

     // Return false to indicate to the UIWebView to not navigate to the linked target 
     return false; 
    } 

    // Return true so that the UIWebView loads the link target 
    return true; 
} 

不要忘了您需要將您的UIWebView委託屬性設置爲實現UIWebViewDelegate的類的實例。

61

要在什麼蘭迪說擴大,這是我在我的應用程序使用,使每個HTTP://,https://開頭,並至mailto:// URL外部Safari或郵件應用程序中打開:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 
{ 
    NSURL *requestURL =[ [ request URL ] retain ]; 
    if (([ [ requestURL scheme ] isEqualToString: @"http" ] || [ [ requestURL scheme ] isEqualToString: @"https" ] || [ [ requestURL scheme ] isEqualToString: @"mailto" ]) 
     && (navigationType == UIWebViewNavigationTypeLinkClicked)) { 
     return ![ [ UIApplication sharedApplication ] openURL: [ requestURL autorelease ] ]; 
    } 
    [ requestURL release ]; 
    return YES; 
} 

正如Randy所說,您需要在您設置爲UIWebView代理的任何類中實現此目標。爲了只有選擇的URL啓動Safari,您可以將它們的方案從http://更改爲safari://或類似的方法,並且只將這些URL踢出系統(在用http://替換自定義URL方案後) 。

我在我的內部幫助文檔中完成這項工作,該工具將HTML顯示在UIWebView中,以便在應用程序中嵌入通用Web瀏覽器時不會遇到審閱過程中的問題。

+0

是不是保留和釋放URL真的偏執? – morningstar 2011-10-21 01:31:09

+0

@morningstar - 也許,它現在已經過時了,但是當時我在其他地方掙扎着與線程相關的崩潰(自動釋放的對象被傳遞到不同線程上的方法在該方法中被釋放),所以我錯在偏執狂的一面。再次,這是由ARC現在爲你完成的,所以我的代碼不再有它。 – 2011-10-21 14:26:39

+0

是的,好的,我可以看到由於線程問題它可能是必需的。 – morningstar 2011-10-21 15:16:04

20

好的,我明白了。也許它不是完美的解決方案,但你可以做這樣的:

只有你WebViewController.m

webView.delegate = self;添加到viewDidLoad過程:

- (void)viewDidLoad { 
    webView.delegate = self; 
    .... your code .... 
} 

那麼你可以添加如上所述Controller.m布爾結果函數之後的文件:

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

對於新手來說,設置關於代表的位很重要:) – firecall 2011-11-27 02:02:47

+0

Thanku so much :) – 2014-05-30 12:48:46

1

這就是我們如何解決它,將它添加到您的ViewController.m文件:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    first.delegate = (id)self; 
       [first loadRequest:[NSURLRequest requestWithURL:[NSURL  URLWithString:@"http://my.FellowshipNWA.org?publicapp"]]]; 
} 

// Add section below so that external links & PDFs will open in Safari.app 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request  navigationType:(UIWebViewNavigationType)navigationType { 
    if (navigationType == UIWebViewNavigationTypeOther) { 
     NSString *checkURL = @"http://my.fellowshipnwa.org/?givenowsafari"; 
     NSString *reqURL = request.URL.absoluteString; 
     if ([reqURL isEqualToString:checkURL]) 
      { 
       [[UIApplication sharedApplication] openURL:request.URL]; 
      return false; 
    } 
     else { 
      return true; 
     } 
    } 
    return true; 
} 
1

布拉德·拉爾森的回答斯威夫特版本:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 

    var url: NSURL = request.URL! 
    var isExternalLink: Bool = url.scheme == "http" || url.scheme == "https" || url.scheme == "mailto" 
    if (isExternalLink && navigationType == UIWebViewNavigationType.LinkClicked) { 
     return !UIApplication.sharedApplication().openURL(request.URL!) 
    } else { 
     return true 
    } 
}