2015-08-25 3 views
9

У меня есть приложение Cordova, это одностраничное приложение с одним HTML-файлом.Кордова, зачем нужен плагин InAppBrowser для открытия ссылок в системном браузере

Все ссылки должны открываться в системном браузере. Я не хочу «встроенный» InAppBrowser, но действительно собственный системный/внешний браузер.

Везде можно найти пример кода с использованием InAppBrowser что-то вроде:

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

Но почему нам нужно установить InAppBrowser, даже если мы даже не планируем использовать встроенный браузер?

Может ли кто-то действительно узнать, что должно быть поведением WebView, относительно цели ссылки. Неясно, что он должен делать с target=_blank, но я не вижу ничего другого, кроме него, кроме открытия нового окна браузера.

Обратите внимание, что проблема, похоже, связана только с iOS, потому что с Android (с плагином Crosswalk) с использованием target=_blank, похоже, всегда работает нормально и открывается в новом окне собственного браузера.

+0

Ну, с моей точки зрения, вы всегда находитесь в веб-просмотре. Теперь вы хотите запросить главный системный браузер. Теперь нормальная ошибка _target может не всегда работать особенно на всех платформах поддержки cordova. Чтобы преодолеть это, мы используем inappbrowser, который проходит через собственный слой, чтобы вызвать браузер. Таким образом, мы можем гарантировать рабочее решение на всех поддерживаемых платформах. –

+0

@SaniYusuf, но тогда почему бы не создать плагин, который просто не является «InAppBrowserPlugin» и открывает все ссылки с _blank в системном браузере?Я чувствую, что плагин пытается решить две различные проблемы, одна из которых не была четко указана в имени плагина (но не совсем уверен, как это не объяснено) –

+0

@jcesarmobile Я сделал, и на самом деле это заставило все запросы Ajax терпеть неудачу Android, насколько я знаю. Также он не документирован здесь: https://github.com/apache/cordova-plugin-whitelist –

ответ

11

Так что я отвечаю на свой вопрос с тем, что я узнал. Примечание. Я имею в виду только iOS и Android (с плагином для переходов) на Cordova 5.1.1, и он может не распространяться на другие платформы/версии.

InAppBrowser требуется

Даже если вам не нужен встроенный браузер, требуется InAppBrowser плагин. Это делает доступной цель _system, которая запускает собственный код плагина, чтобы открыть системный/внешний браузер.

Итак, похоже, что плагин - это как-то плагин «2 в 1»: он позволяет использовать встроенный браузер +, что позволяет безопасно принудительно открыть внешний браузер системы.

Непонятно, какое поведение по умолчанию WebView должно относиться к _blank ссылкам (и если оно стандартизировано каким-либо образом для WebView), но я не нашел способа открыть внешний браузер на iOS без этого плагина или родного код.

Открытия _self в WebView и _blank в родном браузере

Если, как я вам не заботиться о встроенном браузере, а просто хотят, чтобы открыть все _blank целей на родной внешний браузер в существующем приложении, без слишком много боли (особенно, если приложение также является мобильным веб-сайтом ...), вы можете запустить следующий код в начале вашего приложения:

function openAllLinksWithBlankTargetInSystemBrowser() { 
    if (typeof cordova === "undefined" || !cordova.InAppBrowser) { 
     throw new Error("You are trying to run this code for a non-cordova project, " + 
       "or did not install the cordova InAppBrowser plugin"); 
    } 

    // Currently (for retrocompatibility reasons) the plugin automagically wrap window.open 
    // We don't want the plugin to always be run: we want to call it explicitly when needed 
    // See https://issues.apache.org/jira/browse/CB-9573 
    delete window.open; // scary, but it just sets back to the default window.open behavior 
    var windowOpen = window.open; // Yes it is not deleted ! 

    // Note it does not take a target! 
    var systemOpen = function(url, options) { 
     // Do not use window.open becaus the InAppBrowser open will not proxy window.open 
     // in the future versions of the plugin (see doc) so it is safer to call InAppBrowser.open directly 
     cordova.InAppBrowser.open(url,"_system",options); 
    }; 


    // Handle direct calls like window.open("url","_blank") 
    window.open = function(url,target,options) { 
     if (target == "_blank") systemOpen(url,options); 
     else windowOpen(url,target,options); 
    }; 

    // Handle html links like <a href="url" target="_blank"> 
    // See https://issues.apache.org/jira/browse/CB-6747 
    $(document).on('click', 'a[target=_blank]', function(event) { 
     event.preventDefault(); 
     systemOpen($(this).attr('href')); 
    }); 
} 
+1

Поведение по умолчанию на веб-обозревателе iOS - это открыть ссылку в том же веб-браузере, не имеет значения, какую цель вы используете. – jcesarmobile

+0

На iOS8 с Cordova 5.3.3, окно .open с целевым «_blank» открывает мой локальный pdf в InAppBrowser, а не в собственном браузере. –

+0

@ RémyDAVID правильно ли вы выполнили мою функцию 'openAllLinksWithBlankTargetInSystemBrowser'? потому что он отлично работает для нас с iOS8 –

 Смежные вопросы

  • Нет связанных вопросов^_^