目前我正在使用UIWebview来显示用户提供的Web内容。在此内容中,将链接到其他Web内容,我需要决定是在safari中还是在UIWebview中打开链接。
我目前的解决方案是在html中为网址添加一个queryString,例如<a href=http://www.w3schools.com?StayInApp target=_blank>Visit W3Schools</a>
当用户按下链接时,UIViewController中的以下方法决定如何打开链接。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = [request URL];
NSLog(@"%@",url);
NSLog(@"%@",[url scheme]);
NSLog(@"%@",[url user]);
NSLog(@"%@",[url query]);
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
if ([[url query]isEqualToString:@"OutOfAppApp"]) {
NSLog(@"go out");
[[UIApplication sharedApplication] openURL:url];
return NO;
}
else if([[url query]isEqualToString:@"StayInApp"])
{
return YES;
}
}
return YES;
}
我在Web开发方面没有太多经验,因此无法看到使用此方法的后果。这是一种有效的方法还是我应该采用其他方式?
此致
修改 我现在想出了另一种使用自定义URL方案的方法,但我仍然希望评论这是否是一个有效的解决方案:)
我在<a href=InAPP:http://www.w3schools.com target=_blank>Visit W3Schools</a>
等链接中添加了前缀
当用户按下链接时,应用程序会检查前缀并决定是在应用程序中还是在Safari中启动其余网址。这是通过以下方法完成的:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = [request URL];
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
if ([[url scheme]isEqualToString:@"InAPP"]) {
NSLog(@"go in");
NSURLRequest *req=[NSURLRequest requestWithURL:[self removeExtensionFromURL:url]];
[[self browserView] loadRequest:req];
return NO;
}
else if([[url scheme]isEqualToString:@"OutAPP"])
{
NSLog(@"go out");
[[UIApplication sharedApplication] openURL:[self removeExtensionFromURL:url]];
return NO;
}
}
return YES;
}
-(NSURL*)removeExtensionFromURL:(NSURL*)url
{
NSMutableString *urlString=[NSString stringWithFormat:@"%@",url];
NSString *newURLString;
if ([[url scheme]isEqualToString:@"InAPP"]) {
newURLString = [urlString stringByReplacingOccurrencesOfString:@"InAPP:" withString:@""];
}
else if([[url scheme]isEqualToString:@"OutAPP"])
{
newURLString = [urlString stringByReplacingOccurrencesOfString:@"OutAPP:" withString:@""];
}
return [NSURL URLWithString:newURLString];
}