PhoneGap iOS アプリケーションでは、InAppBrowser プラグインを使用して一部のコンテンツを表示しており、InAppBrowser 内から Safari でページを開く必要があります。
InAppBrowser内からのリンクをSafari で開くにはどうすればよいですか?
PhoneGap iOS アプリケーションでは、InAppBrowser プラグインを使用して一部のコンテンツを表示しており、InAppBrowser 内から Safari でページを開く必要があります。
InAppBrowser内からのリンクをSafari で開くにはどうすればよいですか?
残念ながら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');
}
...私はテストしていません。
このメッセージは明確にするためのものです:
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 イベントは発生しません。
回避する別の方法を見つけていますが、まだ何も見つかりません..
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 で開くことができます。