我在我的iPhone应用程序中嵌入了一个UIWebView。我希望能够将该webview中的某些链接打开到完整的Mobile Safari应用程序中(即不是我的嵌入式版本)。
是否有一种简单的方法来构建我的一些href来强制执行此操作,而不是在我的嵌入式Web视图中打开每个链接?
感谢。
答案 0 :(得分:61)
为了扩展Randy所说的内容,我在我的应用程序中使用这个来在外部Safari或Mail应用程序中打开每个http://,https://和mailto:// URL:
-(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方案之后)
我在内部帮助文档中执行此操作,该文档是在UIWebView中显示的HTML,因此我在审核过程中不会遇到问题,因为我的应用程序中嵌入了通用Web浏览器。
答案 1 :(得分: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;
}
答案 2 :(得分: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的类的实例。
答案 3 :(得分: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;
}
答案 4 :(得分:1)
Brad Larson答案的快速版本:
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
}
}