Как открыть внешнюю ссылку в Safari, а не в приложении UIWebView?
У меня есть приложение Phonegap (cordova), где я хочу загрузить некоторые внешние веб-страницы в веб-браузере PhoneGap, и у меня есть другие внешние веб-страницы, которые я хочу загрузить в сафари, когда пользователь активирует их.
Обычно у большинства людей возникает проблема, когда они хотят открыть внешнюю ссылку в WebView. Настройка OpenAllWhitelistURLsInWebView на YES (в Cordova.plist/Phongap.plist) решает эту проблему.
Но я не хочу открывать все ссылки WebView, только некоторые.
Я надеялся, что просто позвоню window.open('http://someexternalsite')
, чтобы открыть в Safari и window.parent.location.href = 'http://mysite'
, чтобы открыть его в WebView.
Любая идея, как это сделать?
Ответы
Ответ 1
Если ссылки, которые вы хотите открыть в сафари, содержат общую строку, вы можете использовать следующий фрагмент кода.
- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSURL *url = [request URL];
// Intercept the external http requests and forward to Safari.app
// Otherwise forward to the PhoneGap WebView
if ([[url scheme] isEqualToString:@"SCHEME"]) {
[[UIApplication sharedApplication] openURL:url];
return NO;
}
else {
return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
}
}
Этот код, помещенный в AppDelegate.m
, откроет все URL-адреса, которые используют указанный SCHEME в Safari.
Я боюсь, что это все, что я мог придумать.
Надеюсь, что это поможет
ОБНОВЛЕНИЕ:
Код должен быть помещен в MainViewControler, по крайней мере для кордовы 2.2.0.
Метод изначально комментируется. Мне пришлось использовать его для перенаправления ссылок на карты Google:
NSRange isGoogleMaps = [[url absoluteString] rangeOfString:@"maps.google.com" options:NSCaseInsensitiveSearch];
NSRange isGoogleTerms = [[url absoluteString] rangeOfString:@"terms_maps.html" options:NSCaseInsensitiveSearch];
if(isGoogleMaps.location != NSNotFound || isGoogleTerms.location != NSNotFound ) {
[[UIApplication sharedApplication] openURL:url];
return NO;
}
else
return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
Ответ 2
Просто поймайте все ссылки в вашем javascript с target="_blank"
и передайте их в window.open с параметром "_system". Это будет работать как на iOS, так и на Android.
$(document).on('click', 'a[target="_blank"]', function(ev) {
var url;
ev.preventDefault();
url = $(this).attr('href');
window.open(url, '_system');
});
Ответ 3
Это то, что работает для меня на основе ответа @TDeBailleul. В принципе, любая ссылка, имеющая суффикс PDF, или, если это конкретная страница, которую я хочу открыть в Safari, ИЛИ, если она не является страницей внутри www.example.com/* (внешняя ссылка), она откроется в новое окно:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
// Open PDF files, Specific Pages, and External Links (not beginning with http://www.example.com) in Safari.app
if (
(navigationType == UIWebViewNavigationTypeLinkClicked) &&
([[[request URL] absoluteString] hasSuffix:@"pdf"] || [[[request URL] absoluteString] hasPrefix:@"http://www.example.com/specific-page.php"] || ![[[request URL] absoluteString] hasPrefix:@"http://www.example.com"])
) {
[[UIApplication sharedApplication] openURL:request.URL];
return NO;
}
return YES;
}
Надеюсь, это поможет другим!
Ответ 4
Вы можете (по номеру телефона 1.5.0) использовать:
<a href="some://external/url" target="_blank">Click Me</a>
Это приведет к тому, что phonegap запустит собственный браузер.
Я думаю, что, по словам пользователя868766, для того, чтобы выше работали, вам нужен внешний URL-адрес в белом списке.
Приложение, над которым я работал, открыл источник новостей в собственном браузере, поэтому мы использовали * в белом списке, чтобы гарантировать, что мы не исключили никаких источников.
Надеюсь, что это поможет.
Ответ 5
Правильный способ сделать это - использовать плагин inAppBrowser
установите его с помощью CLI cordova:
cordova plugin add org.apache.cordova.inappbrowser
Затем, чтобы открыть ссылку на сафари, просто используйте:
window.open('http://apache.org', '_system');
Существует более новая версия плагина, размещенная на npm
чтобы установить его из CLI cordova:
cordova plugin add cordova-plugin-inappbrowser
Чтобы открыть веб-сайт на сафари, вы можете использовать
cordova.InAppBrowser.open('http://apache.org', '_system');
или, если вы хотите продолжить использование window.open, как в старой версии, вы можете просто сделать это на событии готовности устройства:
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
window.open = cordova.InAppBrowser.open;
}
Ответ 6
Протестировано на кордове 2.4 + iOS
используйте "_system" и не нужно обновлять какую-либо конфигурацию
http://docs.phonegap.com/en/2.3.0/cordova_inappbrowser_inappbrowser.md.html#InAppBrowser
target: цель для загрузки URL-адреса в (String) (необязательно, по умолчанию: "_self" )
_self - открывается в Кордове WebView, если url находится в белом списке, иначе он открывается в InAppBrowser _blank - всегда открыт в InAppBrowser _system - всегда открывается в веб-браузере системы
Ответ 7
если вы хотите открыть внешний URL в сафари, я думаю, что это полезно:
Это гарантированное решение% 100, если вы используете телефонную трубку. Протестировано в ios6.
чтобы открыть внешний URL в сафари, выполните следующие действия:
1 - добавьте свою ссылку в External Host (белый список). например http://google.com
2-in Cordova.plist или Phonegap.plist, измените "OpenAllWhitelistURLsInWebView" с "Да" на "Нет",
3-в вашем приложении добавить (target = "_ blank" ) к вашей ссылке
пример
<a href="http://google.com" target="_blank">Google.com</a>
Спасибо.
Ответ 8
Это работает для меня, это помогает alot
-(void)viewDidLoad
{
[super viewDidLoad];
////////////////////////
NSString *urlAddress = @"http://www.playbuzz.org/";
//NSURL *myURL = [NSURL URLWithString:urlAddress];
myWebview.delegate = (id)self;
[myWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlAddress]]];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
// open External Links (not beginning with www.playbuzz.org/ in Safari.app
if (
(navigationType == UIWebViewNavigationTypeLinkClicked) &&
( ![[[request URL] absoluteString] hasPrefix:@"http://www.playbuzz.org/"])
) {
[[UIApplication sharedApplication] openURL:request.URL];
return NO;
}
//open Internal links in uiwebview
return YES;
}`
Ответ 9
-
Добавьте ссылку target = "_ blank" в ваши ссылки.
то есть:
<a href="http://www.brandonbrotsky.com/" target="_blank"></a>
-
Убедитесь, что у вас есть источник */" > в вашем файле config.xml(убедитесь, что он находится в корне каталога приложения над папкой www.
то есть:
<access origin="*" />
-
Добавьте следующий код в MainViewController.m
- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSURL *url = [request URL];
// Intercept the external http requests and forward to Safari.app
// Otherwise forward to the PhoneGap WebView
if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) {
[[UIApplication sharedApplication] openURL:url];
return NO;
}
else {
return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
}
}
Я сделал быстрое видео, объясняющее, как исправить эту проблему:
http://www.youtube.com/watch?v=zqbjXSnAR-Q&feature=c4-overview&list=UUefS6KLvFQVjhmL6hiBq4Sg
Надеюсь, что это поможет!
Ответ 10
iside xcode
//Поместите код в /Classes/MainViewController.m
- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{ NSURL *url = [request URL];
// Intercept the external http requests and forward to Safari.app
// Otherwise forward to the PhoneGap WebView
if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) { [[UIApplication sharedApplication] openURL:url]; return NO; } else { return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ]; }
}