Как открыть внешнюю ссылку в 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 ]; }
}