web-dev-qa-db-ja.com

キャプティブWifiポップアップ:リンクをクリックしてSafariを開きます

IOSデバイス(iPad、iPhoneなど)を使用したネットワークで問題が発生しています:SSIDに接続すると、iPhone/iPadはすぐにキャプティブネットワークアシスタント(CNA)を開きます-これは、ナビゲーションボタンのない縮小されたブラウザーのようなものです-ウェルカムページが表示されます(ユーザーがネットワークでMACを認証してインターネットを利用できるようになります)。このCNAはiOSの機能であり、自動的に実行されます。

私はこのフォーラムで、ユーザーがリンクをクリックして(CNAで)Safariブラウザーを開き、CNAから離れてSafariに送信する方法(私は彼になりたい場所です)を探していました。

「サファリで開くリンクを設定する方法」などのフレーズを検索しましたが、そのようなことをするために電話ギャップを使用している人々に関する結果が得られます...
1人のユーザーがwindow.open(myURL、 '_system')の使用について話しましたが、それが私の問題を解決しているかどうかはわかりません。

基本的に、私の計画は次のとおりです。-ウェルカムページ(ユーザーが私のSSIDに接続した後に表示されるページ)に、ユーザーのデバイスに搭載されているブラウザーの種類を検出させる。私のウェルカムページは、コントローラーのウォールドガーデンにあるサイトでホストされているため、すべてのデバイスが(ウェルカムページが完全にインターネットにアクセスしているかどうかにかかわらず)ウェルカムページを表示できます。 -ユーザーがiOSデバイスを持っている場合、CNAブラウザーが自動的に開きます。私のコントローラーは、デバイスにCNAブラウザーが搭載されていることを検出し、メッセージ(など)を含む単純なページをロードします:「ここをクリックしてナビゲートを開始します」-次の数秒間(ユーザーがメッセージを要約している間)、コントローラーはユーザーにMACフルインターネットアクセス-ユーザーがCNAブラウザーでそのリンクをクリックすると、CNAはSafariを閉じてから開きます。また、Safariに宛先ウェルカムページを開くように強制します(ユーザーが接続するアンテナに応じて、ユーザーがアクセスする場所を指定します)。接続されています)。

すべてが理にかなっていることを本当に願っています...

このフォーラムでCNAブラウザーに関するこのリンクを見つけました: バイパスApple iOS 7でのキャプティブネットワークアシスタントログイン

しかし、それはユーザーが最初からSafariを開く(CNA機能を無効にする)ように話し、ユーザーがSafariを開く(代わりに自分のアプリの1つに直接移動する)ことを期待しています。ユーザーが「クリックして続行」する必要があることを好みます。これにより、Safariが開き、ウェルカムページが表示されます。

25
user3570787

[〜#〜] edit [〜#〜]:このソリューションはiOS 10.3以降では機能しません。それが機能なのかバグなのか不明: https://forums.developer.Apple.com/thread/75498

EDIT2:iOS 11で再び機能するようです


キャプティブポータルサーバーを制御できる場合は、簡単な方法があります。

Wifiネットワークに接続するとき、iOSデバイスは事前定義された一連のURL(_http://www.Apple.com/library/test/success.html_、...)にGETリクエストを送信して、インターネット接続(wisprリクエスト)があるかどうかを確認します。 iOSデバイスは_<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>_の回答を期待しています。要求は成功したが、答えが異なる場合(たとえば、キャプティブポータルページ)、CNAが起動します。

この段階では、CNAは接続されていないと見なし、上部にCancelボタンを表示します。すべてのリンクは、何をしても、SafariウィンドウではなくCNA内で開きます。 CNAは、ログインプロセスを通じてユーザーを取得できるように行われます。ログインプロセスが完了し、接続が最終的に確立されたかどうかを確認するために、iOSデバイスは今度は別のwisprリクエストを送信します。これは、40秒ごと、またはHTTP要求が発行されるたびに発生します(CNA内のナビゲーション)。

サーバーがwisprリクエストに最終的にSuccessと応答すると、CNAはconnectedとマークし、上部のボタンがDoneに変わります。この段階で、外部URLへのリンクはCNAを閉じ、Safariで開きます:)

つまり、要約すると、次の接続手順で必要なことを実現できます。

  1. サーバーはCNAページで最初のwisprリクエストに応答します。
  2. cNAでページが開きます。そのページで、CNA内でナビゲーションをすぐにトリガーするJavaScriptをいくつか用意します。例:<script>window.location.reload(true)</script>これにより、iOSデバイスがトリガーされ、すぐに別のwisprリクエストが送信されます
  3. サーバーはこの2番目のwispr要求に_<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>_で応答します。これにより、CNAが接続済みとしてマークされます。
  4. cNAページに外部URLへのリンクを表示する
5
sebpiq

アプリのUIWebViewではなくSafariで外部リンクを開くにはどうすればよいですか?

Safariへの特定のリンクスイッチを設定するには、次のようにリンクにtarget = "_ system"を追加するだけです

<a href="http://www.domain.com/" target="_system">Link Text</a>

または、javascriptでtarget = "_ blank"を持つすべてのリンクをキャッチするには、jQueryを含めて、「_ system」パラメーターを指定してwindow.openに渡します。これはiOSとAndroidの両方で機能します。

$(document).on('click', 'a[target="_blank"]', function(ev) {
  var url;

  ev.preventDefault();
  url = $(this).attr('href');
  window.open(url, '_system');
});
3
glpj

JavaScriptはCNAでは完全には機能しません。セキュリティ上の理由から無効になっています。 target = "_ system"はsafari機能であり、CNA機能ではありません。 ==>簡単に言うと、CNAで_systemが失敗します。

3
3pic