Как открыть внешнюю ссылку в Safari, а не в приложении UIWebView? - PullRequest
29 голосов
/ 17 марта 2012

У меня есть приложение PhoneGap (Cordova), в котором я хочу загрузить некоторые внешние веб-страницы в PhoneGap WebView, и у меня есть другие внешние веб-страницы, которые я хочу загрузить в Safari, когда пользователь активирует их.

Как правило, большинствоу людей есть проблема, когда они хотят открыть внешнюю ссылку в WebView.Установка OpenAllWhitelistURLsInWebView в ДА (в Cordova.plist / Phongap.plist) решает эту проблему.

Но я не хочу открывать все ссылки на WebView, только некоторые.

Я надеялся, что могу просто позвонить window.open('http://someexternalsite'), чтобы открыть в Safari и window.parent.location.href = 'http://mysite', чтобы открыть его в WebView.

Любая идея, каксделать это?

Ответы [ 10 ]

19 голосов
/ 17 марта 2012

Если все ссылки, которые вы хотите открыть в Safari, содержат общую строку, вы можете использовать следующий фрагмент кода.

- (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, которые используютуказанная СХЕМА в Safari.

Боюсь, это все, что я мог придумать.

Надеюсь, это поможет

ОБНОВЛЕНИЕ:

Коддолжен быть помещен в MainViewControler, по крайней мере для cordova 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];
11 голосов
/ 06 мая 2013

Просто перехватите все ссылки в вашем 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');
});
9 голосов
/ 17 августа 2012

Это то, что у меня работает, основываясь на ответе @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;
}

Надеюсь, это поможет другим!

7 голосов
/ 23 июля 2012

Вы можете (начиная с phonegap 1.5.0) использовать:

<a href="some://external/url" target="_blank">Click Me</a>

Это должно привести к тому, что phonegap запустит собственный браузер.

Я думаю, что пользователь имел в виду то, чтовыше, чтобы работать, вам нужен внешний URL, чтобы быть в белом списке.Приложение, над которым я работал, открыло источник новостей в собственном браузере, поэтому мы использовали * в белом списке, чтобы не исключать какие-либо источники.

Надеюсь, это поможет.

6 голосов
/ 14 июля 2015

Правильный способ сделать это - использовать плагин inAppBrowser

установить его с помощью CLI-интерфейса cordova:

cordova plugin add org.apache.cordova.inappbrowser

Затем открыть ссылку на Safariпросто используйте:

window.open('http://apache.org', '_system');

Существует более новая версия плагина , размещенная на npm

для установки его из CLI Cordova:

cordova plugin add cordova-plugin-inappbrowser

Чтобы открыть веб-сайт в Safari, вы можете использовать

cordova.InAppBrowser.open('http://apache.org', '_system');

или, если вы хотите продолжить использовать window.open, как и более старую версию, вы можете просто сделать это на событии готовности устройства:

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    window.open = cordova.InAppBrowser.open;
}
2 голосов
/ 27 февраля 2013

Проверено на Cordova 2.4 + iOS

используйте "_system" и не нужно обновлять конфигурацию

http://docs.phonegap.com/en/2.3.0/cordova_inappbrowser_inappbrowser.md.html#InAppBrowser

target: целевой объект для загрузки URL-адреса (строка) (необязательно, по умолчанию: "_Self")

_self - открывается в Cordova WebView, если url находится в белом списке, иначе он открывается в InAppBrowser _blank - всегда открывать в InAppBrowser _system - всегда открываться в системном веб-браузере

0 голосов
/ 26 мая 2015

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 ]; }
}
0 голосов
/ 08 декабря 2013
  1. Добавьте target = "_ blank" к своим ссылкам.т.е.:

    <a href="http://www.brandonbrotsky.com/" target="_blank"></a>
    
  2. Убедитесь, что у доступа есть источник * /> в вашем файле config.xml (убедитесь, что он находится в корне каталога приложения над папкой wwwто есть:

    <access origin="*" />
    
  3. Добавьте следующий код в 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

Надеюсь, это поможет!

0 голосов
/ 04 октября 2013

Это работает для меня, это очень помогает

-(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;
}`
0 голосов
/ 11 ноября 2012

Если вы хотите открыть внешний URL в Safari, я думаю, что это полезно:Это 100% гарантированное решение, если вы используете телефонный разрыв - протестировано в ios6.Чтобы открыть внешний URL в Safari, сделайте следующее:

1 - добавьте вашу ссылку во внешний хост (белый список).например, http://google.com2-в Cordova.plist или Phonegap.plist, измените «OpenAllWhitelistURLsInWebView» с «Да» на «Нет»3-в вашем приложении добавьте (target = "_ blank") к вашей ссылкепример

    <a href="http://google.com" target="_blank">Google.com</a>

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...