ブラウザ内で動作するウェブアプリケーションの中で「別ウィンドウで画面を開く」という操作をしたい場合に大きく以下の2つの方法があります:
(1)target="_blank" 属性のついた <a> タグをクリック/タップする
(2)JavaScript の window.open 関数を実行する


より一般的な方法は(1)だと思っています。リンク時に使う <a> タグに target="_blank" という属性を含めておくことで常に新しいブラウザウィンドウを(ブラウザによっては別タブを)開いて、その新ウィンドウの中でリンク先ページが表示されるというものです。比較的簡単に実装できる方法です。

※ <a> タグの target 属性は本来は「ウィンドウを指定して開く」機能です。例えば <a target="abc" ..> というタグをクリックすると abc という名前のウィンドウを探して(存在していない場合は新ウィンドウを作って abc という名前で管理して) abc ウィンドウの中で目的先のリンクを開きます。再度同じ <a> タグをクリックすると、(ユーザーが消していない限り)既に abc ウィンドウは存在しているのでその abc ウィンドウの中で目的のリンクが再び開く、という動作をします。 ただし taget="_blank" という指定があった場合のみ例外的に「常に新しいウィンドウを開く」という挙動になります。


一方の(2)は「 JavaScript の処理の一環として新しいウィンドウを指定した属性と URL で開く」という関数を使って実現する方法です。利用者から見た挙動はあまり変わらないのですが、内部的には「ポップアップ」という扱いになり、違いは多くあります:
・ウィンドウサイズが指定できる(わざと小さいウィンドウで開く、といったこともできる)
・スクロールバーやメニュー、アドレスバーの有無などを指定できる
・タブブラウザであっても新しいウィンドウを作って開く
・JavaScript だけで実現できる(ライブラリ化できる)

例えば SDK などの機能をライブラリとして提供する側の立場で新しいウィンドウで何かを表示する、という機能を実現しようとすると、前述の <a> タグを使う方法は(利用者がわざわざ指定どおりの <a> タグを記述しないとできないため)逆に不便だったりします。一方で JavaScript だけでできるこの方法であれば SDK の一部としてその機能を実装しておき、その機能ごと JavaScript ライブラリを提供すればよいので利用者の負担を軽くすることができます(結果的にサポートの負担も減ると思われます)。

といった違いがあって、実装の違いにも現れることになります。


さて、この後者の方法は「ポップアップ」として扱われると書きましたが、このポップアップは特に iOS の Safari ブラウザでは扱いが面倒なものの1つです。具体的にはポップアップ機能自体がデフォルトでオフになっており動きません(つまり上述の window.open で別ウィンドウを開こうとしても開きません)。ここまでは他のブラウザでも同様なのですが、他ブラウザの場合はポップアップをしなかった旨を画面に通知して(そこで利用者は気づくことになって)ポップアップを許可することができ、次回以降の window.open 実行時にポップアップウィンドウが表示できるようになります。しかし iOS の Safari ブラウザではポップアップをしなかったことをユーザーに通知することもないため、ユーザーからすると「何も起こらなかった」ようにしか見えない(エラーメッセージが表示されるわけでもないため、許可すればよいと気づくこともない)のでした。


iOS Safari でポップアップが開くようにするには、あらかじめ Safari アプリケーションの設定でポップアップを許可する(ポップアップブロックを無効にする)必要があります。以下その手順の紹介をします:


iOS Safari でポップアップブロックの設定を変更するには「設定」-「Safari」を選択し、「ポップアップブロック」と書かれた設定項目を探します。過去に一度も変更したことがなければ下図のように「ポップアップブロックは有効(= window.open では新しいウィンドウは開かない)」になっているはずです:
2020031601


ポップアップウィンドウを表示するよう変更したい場合は、この設定を下図のように OFF に切り替えます。設定はこれだけです:
2020031602


この状態で再度 Safari を使って window.open が実行される状態を作ると、まず以下のような確認ウィンドウが表示されます。ここで「許可」をタップすると初めて window.open が実行されて新しいウィンドウが開いて処理を続けることができるようになります:
2020031603



なお、ここで書かれた手順を実行しておくと、先日のブログエントリで紹介した LIFF の新機能を実装したアプリケーションを iOS の Safari からも実行することができるようになります(つまりポップアップを有効にしないと LIFF の shareTargetPicker が動かないようです):
http://dotnsf.blog.jp/archives/1077179113.html