我在我的iPhone應用程序中嵌入了一個UIWebView。我希望能夠在該webview中的某些鏈接中打開完整的Mobile Safari應用程序(即不是我的嵌入式版本)。強制一個WebView鏈接啓動Safari?
有沒有一種簡單的方法來構建我的一些hrefs來強制這個,而不是在我的嵌入式webview中打開每個鏈接?
謝謝。
我在我的iPhone應用程序中嵌入了一個UIWebView。我希望能夠在該webview中的某些鏈接中打開完整的Mobile Safari應用程序(即不是我的嵌入式版本)。強制一個WebView鏈接啓動Safari?
有沒有一種簡單的方法來構建我的一些hrefs來強制這個,而不是在我的嵌入式webview中打開每個鏈接?
謝謝。
我還沒有嘗試過這個自己,但我認爲,你可以實現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的類的實例。
要在什麼蘭迪說擴大,這是我在我的應用程序使用,使每個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瀏覽器時不會遇到審閱過程中的問題。
是不是保留和釋放URL真的偏執? – morningstar 2011-10-21 01:31:09
@morningstar - 也許,它現在已經過時了,但是當時我在其他地方掙扎着與線程相關的崩潰(自動釋放的對象被傳遞到不同線程上的方法在該方法中被釋放),所以我錯在偏執狂的一面。再次,這是由ARC現在爲你完成的,所以我的代碼不再有它。 – 2011-10-21 14:26:39
是的,好的,我可以看到由於線程問題它可能是必需的。 – morningstar 2011-10-21 15:16:04
好的,我明白了。也許它不是完美的解決方案,但你可以做這樣的:
只有你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;
}
對於新手來說,設置關於代表的位很重要:) – firecall 2011-11-27 02:02:47
Thanku so much :) – 2014-05-30 12:48:46
這就是我們如何解決它,將它添加到您的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;
}
布拉德·拉爾森的回答斯威夫特版本:
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
}
}
[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