web-dev-qa-db-ja.com

コルドバ、システムブラウザでリンクを開くためにInAppBrowserプラグインが必要なのはなぜですか

私はCordovaアプリを持っています、それは単一のHTMLファイルを持つ単一ページアプリケーションです。

すべてのリンクがシステムブラウザで開くはずです。 「埋め込まれた」InAppBrowserは必要ありませんが、実際にはネイティブシステム/外部ブラウザが必要です。

どこでも、次のようなInAppBrowserを使用したコードの例を見つけることができます。

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

しかし、組み込みブラウザーを使用する予定がないのに、なぜInAppBrowserをインストールする必要があるのでしょうか。

リンクのターゲットに関して、誰かがWebViewの動作と思われるものを実際に説明できますか? target=_blankで何をするのかは明確ではありませんが、新しいブラウザウィンドウを開く以外にできることは何もありません。

Android(Crosswalkプラグインを使用)でtarget=_blankを使用すると、常に正常に動作し、新しいネイティブブラウザウィンドウで開くように見えるため、問題はiOSでのみ発生するようです。

10

だから私は自分の質問に私が見つけたもので答えています。 Cordova 5.1.1iOSおよびAndroid(Crosswalkプラグインを使用)のみを扱っていることに注意してください。他のプラットフォーム/バージョンには適用されない場合があります。

InAppBrowserが必要です

埋め込みブラウザが必要ない場合でも、InAppBrowserプラグインが必要です。これにより、_systemターゲットが使用可能になり、ネイティブプラグインコードがトリガーされてシステム/外部ブラウザが開きます。

したがって、プラグインはどういうわけか「2 in 1」プラグインのようです。組み込みブラウザの使用を許可し、外部システムブラウザを安全に強制的に開くことを許可します。

デフォルトのWebViewの動作が_blankリンクに関連してどうあるべきかは明確ではありませんが(WebViewに対して何らかの方法で標準化されているかどうかも)、このプラグインまたはネイティブなしでiOSで外部ブラウザーを開く方法が見つかりませんでしたコード。

WebViewで_selfを開き、ネイティブブラウザで_blankを開きます

私のように、埋め込みブラウザは気にしませんが、既存のアプリでネイティブ外部ブラウザのすべての_blankターゲットを、それほど苦労せずに開きたいだけです(特に、アプリがモバイルWebサイトの場合)。 ..)、アプリの先頭で次のコードを実行できます。

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'));
    });
}
12