Заставить ссылку WebView для запуска Safari?
У меня есть UIWebView, встроенный в мое приложение iPhone. Я хочу иметь определенные ссылки в этом веб-браузере, которые можно открыть в полном приложении Mobile Safari (т.е. Не в моей встроенной версии).
Есть ли простой способ структурировать некоторые из моих hrefs, чтобы заставить это, а не каждое открытие ссылок внутри моего встроенного веб-представления?
Спасибо.
Ответы
Ответ 1
Чтобы расширить то, что сказал Рэнди, это то, что я использую в своем приложении, чтобы каждый внешний URL-адрес http://, https://и mailto://открывался во внешних приложениях Safari или Mail:
-(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;
}
Как говорит Рэнди, вы захотите реализовать это в любом классе, который вы назначили делегатом UIWebView. Чтобы только выбрать URL-адреса, запустите Safari, вы можете изменить их схему с http://на safari://или что-то подобное, и только удалите эти URL-адреса в систему (после замены схемы пользовательских URL с помощью http://).
Я делаю это в своей внутренней справочной документации, которая отображается в HTML в UIWebView, поэтому я не сталкиваюсь с проблемами в процессе обзора с использованием встроенного в мое приложение универсального веб-браузера.
Ответ 2
Хорошо, я понял. Возможно, это не идеальное решение, но вы можете сделать это вот так:
Только в 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;
}
Ответ 3
Я не пробовал это сам, но я думаю, что вы можете реализовать метод 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.
Ответ 4
Вот как мы его решили, добавим в файл 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;
}
Ответ 5
Быстрая версия ответа Брэда Ларсона:
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
}
}