iOS 8.x で window.open() したタブで window.close() できない問題と Facebook JS SDK の対応


[2014/11/18 追記] window.close() できない問題は、iOS 8.1.1 で解消した。

今かかわっているプロダクトでは、JavaScript の window.open() で別ウィンドウを開いた上で Facebook ログインダイアログを表示させ、認証完了時に window.close() で閉じているが、iOS 8.0 がまだベータだったころに検証したところ、window.close() で閉じられないという問題があった。

Apple の場合は突然仕様を色々変えてくるので仕様なのかバグなのか分からなかったが、チームメンバーがフォーラムに書き込んだところ、どうやらバグだということが分かった。

そしてこれの影響が出ていたのが他でもない Facebook JavaScript SDK。類似のチケットがいくつか切られていたが、「iOS8 on Safari: FB Auth with Javascript SDK redirects to blank page」が対策本部だと思われる。当初は調査中だったが、「iOS 側のバグじゃねーの?」的なことをコメントしたところ、最終的に window.close() すべきところで「タブを閉じてください」的なメッセージを出すということに落ち着いたらしい……

We’re in the process of adding a message to not confuse users. Thanks for your patience.

We have a fix for this issue to make the error on the mobile web more prominent. It will be fixed by end of day tomorrow.

Thanks for your patience!

ということで、今日からそういうメッセージが出るよ! という話。だがしかし、いわゆる「普通」のユーザにとって、そんなメッセージを出されても何のことか分からないと思う。おそらくは引き続き window.close() そのものは残っていて、Apple 側が対応すれば閉じるようにはなるのだろうが……

実は同じことは今のプロダクトでも考えていて、iOS 8 リリース前では同様のメッセージを出そうとしていた時期もあった。

close_this_window

しかし、これを出されてもエンドユーザはこれが何を意味するのか、どうやればいいのかさっぱり分からないと思う。確かに真っ白な画面よりはいいとは思うが、ある程度以上のリテラシーがないとつまづくのは間違いないと思う。(○○味の○○を食べるかカレー味の○○を食べるかの違いでしかない、と書いて止めた。)

結局、今のプロダクトでは、iOS 8.x の場合はログインウィンドウを開くのではなく、画面遷移でログインさせるように仕様変更した。iOS 側が修正されれば元に戻せばいい話だし、特に日本における iOS のシェアとユーザ層を考えた場合、多少導入側には画面遷移させるために UI を「閉じられない」ページがあるというマイナスがあったとしても、これのほうが正しいと思う。

ちなみに、この問題、8.1 beta 2 では未検証だが beta 1 ではまだ残っているらしい。