Safari.appと挙動が同じにならない問題🚨
はじめに
アプリ開発をしているとクライアントからアプリ内部でWKWebViewController, SFSafariViewControllerを使って開いた時の挙動とSafari.appでWebページを開いた時の挙動が違うという問い合わせが発生する。
WKWebViewControllerはレイアウトが違うので別だということをすぐ理解してもらえます。
一方でSFSafariViewControllerは見た目がSafari.appなので同じ機能を使えると勘違いされて同じようにしてくださいと言われるが、SFSafariViewControllerの方が制約が多くSafari.appの挙動に近づけるのは難しい
SFSafariViewControllerについて
SFSafariViewControllerが何者かというのはドキュメントを見るとよくわかります
Safari.appに実装されている機能うち UI features include the following:
以下に記載の機能しかないアプリ内ブラウザという立ち位置です。
UI features include the following:
* A read-only address field with a security indicator and a Reader button
https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller
* An Action button that invokes an activity view controller offering custom services from your app, and activities, such as messaging, from the system and other extensions
* A Done button, back and forward navigation buttons, and a button to open the page directly in Safari
* On devices that support 3D Touch, automatic Peek and Pop for links and detected data
なので上記に記載されていない項目に関してはSFSafariViewControllerでは実現することができません!
わかりやすい例で言うとSafari.appにある別タブ/ウィンドウで開いた時のタブ管理はSafari.appにしかない機能です。
できない例
実際に遭遇したできない例を追加していきます、検証用に使用したWebページはこちら
Safari.app | SFSafariViewControlelr | 備考 | |
a タグのdownload属性 | aタグのdownload属性がついている時の挙動が異なります、SFSafariViewControllerではダイアログが出ずに添付した画像のような表示になるのでSafari.appと同じような挙動を実現したい場合はWKWebViewで同じような機能を実装する必要があります。 過去にそれっぽい記事を書いたので参考までにWebViewで画像のダウンロードボタンを押された時にアルバムに保存する | ||
window.print() | ❌ | ❌ | window.print()はiPhoneのSafari.appでも開くことができません。 Macで表示した場合は表示可能ですが、iPhoneでは表示することができません。 WKWebViewでUIPrintInteractionControllerを使えばiPhoneから印刷することは可能ですが、window.print()をアプリ側でハンドリングすることが不可能なのでWebページアプリ側でハンドリングできる形のjavascriptに修正する必要があります |