※2014年11月のiOS 8.1.1アップデートで修正されています。(よかった…)
しかし、社内にも、アップデートしていない人がいたりしたので、メモを残します。
iOS 8.0.x, 8.1.0 のSafariでは、window.close()が動かないバグがあります。
EC-CUBEを使った案件で、このバグの対応をしました。
いろいろ調べてみたけれど、どうやらwindow.close()の使い方がおかしいのではなく、iOS8のSafariで、動かないようになっているみたいでした。
Appleの人は
This is a known bug. There isn’t a workaround, sorry.
(あー知ってる。回避策はない。すまん。)
と、言っています。。。
そっか、まじで閉じる方法ないんや…
待つしかないやん。でも、どう見てもおかしい!って感じるよね…
ってことで、なんとか頭ひねりました。
解決策(EC-CUBEスマホ)
不具合内容
- お届け先編集のページで、登録ボタンを押すと、エラーメッセージは出ず、編集画面が表示される。(画面が閉じない。)
- 親画面を見てみると、編集は正常に完了している。
対象ページ
-
/mypage/delivery.phpのページのお届け先編集ボタンを押して開かれる、/mypage/delivery_addr.phpのページ
ページの仕様
-
/mypage/delivery_addr.phpのページだけで完結する(完了用などの他ファイルはない)
ページ遷移方法
①編集画面
↓
②登録するボタンを押す
↓
③裏でチェックが走る(エラーあり)
↓
④エラー表示を追加し編集画面を表示する
↓
⑤裏でチェックが走る(エラーなし)
↓
⑥編集画面が表示されるが、裏で生成されたjsにより、画面が閉じる。親画面が更新されている。
- ⑥で生成されるjsに、
window.close()が記載してあり、通常であれば、ユーザーの体験は、登録ボタンを押すと(エラーがなければ)、画面が閉じる。
解決方法
- ⑥でjsが生成されていた場合、編集画面ではなく、「登録が完了しました。画面を閉じてください。」などの文言を表示する。
- つまり、
window.close()が正常に動くデバイスは、ボタンを押したら画面が閉じ、
window.close()が動かないデバイスは、ボタンを押したら、上記の文言が表示され、デバイスを操作して画面を閉じる。
編集ファイル
/mypage/delivery_addr.tpl
<!--{if $tpl_onload}-->
登録が完了しました。<br>
この画面を閉じ、元の画面を更新してください。
<!--{else}-->
(編集画面のコード)
<!--{/if}-->
補足すると、<!--{$tpl_onload}-->で生成されるjsは、popup_header.tplのファイルの中に表示されます。