4

PhoneGap iOS アプリケーションでは、InAppBrowser プラグインを使用して一部のコンテンツを表示しており、InAppBrowser 内から Safari でページを開く必要があります。

InAppBrowserからのリンクをSafari で開くにはどうすればよいですか?

4

4 に答える 4

3

残念ながらtarget=_system、InAppBrowser 内からは機能しません。(ただし、リンクが親アプリで発生した場合、これは機能します。)

IAB にイベント リスナーを追加し、ユース ケースに適合する場合は、コメントに記載されているように、特定の URL パターンをスニッフィングできます。

iab.addEventListener('loadstart', function(event) {
   if (event.url.indexOf("openinSafari") != -1) { 
        window.open(event.url, '_system'); 
    } 
}

ここでの「イベント」は実際のブラウザ イベントではありません。これは IAB プラグインの構成要素であり、サポートされていないevent.preventDefault()ため、IAB は (Safari に加えて) URL も読み込みます。次のような方法で、 IAB 内でそのイベントを処理しようとする場合があります。

iab.addEventListener('loadstop', function(event) {
   iab.executeScript('functionThatPreventsOpenInSafariLinksFromGoingAnywhere');  
}

...私はテストしていません。

于 2014-04-25T16:28:35.013 に答える
2

このメッセージは明確にするためのものです:

loadstart でリンクをキャッチして window.open で別のものを開くと、最初の IAB に割り当てられたイベント ハンドラが強制終了されます。

例えば、

iab = window.open('http://example.com', '_blank', 'location=no,hardwareback=yes,toolbar=no');
iab.addEventListener('loadstop', function(event) {console.log('stop: ' + event.url);});
iab.addEventListener('loaderror', function(event) { console.log('loaderror: ' + event.message); });
iab.addEventListener('loadstart', function(event) {
    if (event.url.indexOf("twitter") != -1){
        var ref2 = window.open(event.url, '_system', null);

    }
});

2 番目の window.open が実行されると、以前にバインドしたすべてのイベント リスナーが強制終了されます。また、その window.open が実行された後、loadstop イベントは発生しません。

回避する別の方法を見つけていますが、まだ何も見つかりません..

于 2014-06-11T10:07:17.020 に答える
0

window.open()のサポートを取得するために cordova.js へのスクリプト参照を追加するかどうかに関係なく、InAppBrowser 内からは機能しませんwindow.open(...'_system')。ハッシュタグを付けて、そこで開くことができるようにします。

InAppBrowser インスタンス内 (私は AngularJS を使用していますが、jQuery を使用している場合は or に置き換えることができangular.elementますjQuery) $:

angular.element(document).find('a').on('click', function(e) {
    var targetUrl = angular.element(this).attr('href');
    if(targetUrl.indexOf('http') === 0) {
        e.preventDefault();
        window.open('#' + targetUrl);
    }
});

これは上記のネイティブwindow.openであり、cordova.js のwindow.open. また、ハンドラー コードは、 で始まるすべての URL をhttp外部から読み込む必要があると想定しています。フィルタを変更して、一部の URL を IAB にロードし、他の URL を Safari にロードできるようにすることができます。

次に、InAppBrowser を作成した親からのコードで:

inAppBrowser.addEventListener('loadstart', function(e) {
    if(e.url.indexOf('#') > 0) {
        var tunneledUrl = e.url.substring(e.url.indexOf('#') + 1);
        window.open(tunneledUrl, '_system', null);
    }
});

このソリューションでは、IAB は元のページに残り、戻るナビゲーションの矢印が表示されることはなく、loadstartハンドラーは要求された URL を Safari で開くことができます。

于 2014-09-26T22:56:59.330 に答える