[iOS] SFSafariViewControllerの制限事項について

本記事では、SFSafariViewControllerの制限事項の調査結果を紹介します。
2020.10.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんばんは。CX事業本部の平屋です。

最近、SFSafariViewControllerの制限事項を調査することがありました。本記事では、その調査の結果を紹介します。

SFSafariViewControllerとは

SFSafariViewControllerはiOS 9で追加されたクラスです。今に至るまで、いくつかの機能追加や仕様変更などが行われてきました。

検証環境

  • macOS Catalina 10.15.6
  • Xcode Version 12.0.1 (12A7300)
  • 検証端末
    • iPhone XS, iOS 14.0
    • iPhone SE, iOS 13.3

目次

今回は以下の内容を調査しました。これらの調査の結果を紹介していきます。

  • (1) SFSafariViewControllerとSafariとの間で認証情報は共有されるか?
  • (2) アプリからSFSafariViewControllerに認証情報を共有できるか?
  • (3) SFSafariViewController同士で認証情報は共有されるか?
  • (4) SFSafariViewControllerに独自のUAを設定することができるか?
  • (5) SFAuthenticationSessionはどんな場合に使えるか?

(1) SFSafariViewControllerとSafariとの間で認証情報は共有されるか?

Web版のGmailで試してみました。共有されませんでした。

確認した内容

Safari -> SFSafariViewController方向の共有

  • Safari上でログインする
    • Safariでhttps://mail.google.comを表示する
    • ログインする
    • ログイン状態になる
  • サンプルアプリ上のSFSafariViewControllerでログイン状態を確認する
    • SFSafariViewControllerを表示する(URLはhttps://mail.google.comを指定)
    • ページが表示される
      • 未ログイン状態になっている

SFSafariViewController -> Safari方向の共有

  • Safari上でログアウトする
    • SafariでGmailからログアウトする
  • サンプルアプリ上のSFSafariViewControllerでログインする
    • SFSafariViewControllerを表示する(URLはhttps://mail.google.comを指定)
    • ページが表示される
      • 未ログイン状態になっている
    • Gmailにログインする
    • ログイン状態になる
  • Safari上でログイン状態を確認する
    • Safariでhttps://mail.google.comを表示する
    • 未ログイン状態になっている

(2) アプリからSFSafariViewControllerに認証情報を共有できるか?

SFSafariViewControllerには認証情報を渡すためのインターフェースがないため、直接、アプリ(ネイティブ実装)から認証情報を共有することはできません。

(3) SFSafariViewController同士で認証情報は共有されるか?

こちらもWeb版のGmailで試してみました。共有されました。

確認した内容

  • サンプルアプリ上のSFSafariViewControllerでログインする
    • SFSafariViewControllerを表示する(URLはhttps://mail.google.comを指定)
    • 未ログイン状態になっている
    • ログインする
    • 一旦、SFSafariViewControllerを閉じる
  • サンプルアプリ上のSFSafariViewController(初回とは違うインスタンス)を再度開く
    • SFSafariViewControllerを表示する(URLはhttps://mail.google.comを指定)
    • ログイン状態になっている

(4) SFSafariViewControllerに独自のUAを設定することができるか?

できないようです。また、SFSafariViewControllerとSafariのUAは同じになりました。

SafariViewControllerとSafariのUAの例

  • iPhone XS, iOS 14.0
    • Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1
  • iPhone SE, iOS 13.3
    • Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.4 Mobile/15E148 Safari/604.1

(5) SFAuthenticationSessionはどんな場合に使用できるか?

SFAuthenticationSessionはiOS 11で追加された、アプリとSafariとの間で認証情報を共有するためのクラスです。例えば、以下のような場合に使用できそうです。

  • Safari側が持ってるGoogleアカウントの認証情報を使って、アプリ側でGoogleのAPI(認証必須のもの)を使用する

SFAuthenticationSessionはiOS 12でDeprecatedになっており、後継のクラスはASWebAuthenticationSessionのようです。

使い方や画面サンプルなどは以下の記事などで確認できます。

さいごに

本記事では、SFSafariViewControllerの制限事項の調査結果を紹介しました。SFSafariViewControllerの採用を検討している方の参考になれば幸いです。