- iPhoneのGmailアプリで確認コードを使用したログインが、SFSafariViewControllerの仕様により正常に機能しない場合があります。
- この問題を解決するには、リンクをSafariアプリで開くか、Gmailアプリのデフォルトブラウザ設定をSafariに変更する必要があります。
- SFSafariViewControllerはメモリ使用量を抑えるため状態保持が難しく、アプリ切り替え時にログイン情報が失われてしまいます。
1. 【疑問】Gmailに届いたリンクからログインできない?
iPhoneのGmailアプリを使って、メールを閲覧しています。
先日、届いたメールのリンクからログインしようとすると、うまくいきませんでした。
パスワードを入れると確認コードがGmailに送られてきたのですが、確認コードを見るとログインが始めからやり直しになってしまうのです。
これは、Gmailのアプリ内ブラウザが「SFSafariViewController」という機能を使っていることが原因です。
確認コードを見るためにGmailの受信トレイに戻ろうとすると「SFSafariViewController」の表示状態がクリアされてしまうのです。
2. 【対処法】GmailからSafariに切り替える
Gmailの受信トレイを確認するためには、ログインページが表示されたら、あらかじめ Safariで開き直すことが大事です。
画面右下にある「Safari(羅針盤)」ボタンをタップすると、独立したSafariアプリでページが開きます。
Safariアプリなら、アプリ切り替えをしても状態が保持され、Gmailと自由に行き来できるようになります。
独立したSafariアプリでページを開くと、画面左上に「Gmail」という戻り先の表示が出てくるね。
2-1. 【別解】リンクを長押しする方法
画面右下にある「Safari」ボタン以外に、メール本文のリンクを長押しする方法もあります。
リンク長押しメニューにある「リンクを開く」を選択すると、最初からSafariアプリでログインページを開くことができます。
2-2. 【設定】Gmailのデフォルトブラウザを設定
ただし、このように毎回 Safari で開き直すのは手間ですし、間違いのもとです。
そこで有効なのが、Gmailアプリの「デフォルトのブラウザアプリ」設定を「Safari」に変更しておくこと。
そうすると、独立した Safariアプリが開くようになります。
同じように「Safari」を選んでいるように見えるけど、SFSafariViewControllerを使わないんだね。
3. 【背景】GmailアプリとSFSafariViewControllerの仕組み
どうして、GmailからSafariを開いたときに、ちゃんとしたSafariアプリになっていなかったの?
iPhoneのGmailアプリでリンクを開くと、アプリの中に組み込まれたブラウザ(SFSafariViewController)が起動します。
「SFSafariViewController」は、iOSの特別なブラウザ機能で、アプリを離れることなくウェブページを表示するための仕組みです1。
「SFSafariViewController」は、Safariアプリと同じ基本技術を使っています。
アプリ切替が必要ないにもかかわらず、ログイン情報などのデータを共有できます。
ただし、安全にウェブページを閲覧できるように、元のアプリ(Gmail)とウェブページの内容は別々に管理されます。
Safariアプリと同じレベルのセキュリティ機能も持っているのです。
画面左上に「完了」ボタンが表示され、アプリ切り替え時にはGmailのアイコンで表示されるのが特徴です。
画面上部のアドレスを表示する部分も、通常のSafariよりもシンプルになっています。
3-1. SFSafariViewControllerは状態を保持しない
ただし、SFSafariViewControllerには注意点があります。
メモリ使用量を抑えるため、状態を保持しにくい設計になっています。
つまり、見ているウェブページが「タブ」として残らないのです。
Gmailの受信トレイに戻ると、アプリの一部として動作しているSFSafariViewControllerの状態は失われます。
メール確認後に再びログインページに戻ろうにも、最初からやり直しになってしまうのです。
3-2. 【補足】iOSのリンク処理の仕組み
Gmailで開いたリンクは、どうやってSafariアプリに情報を伝えるの?
アプリ間でリンクを受け渡すのは、iOSの役割です。
Gmail(送信側)からSafari(受信側)へリンク情報を渡すときは、
- Gmailアプリの「デフォルトブラウザ」を設定された状態で、メール内のリンクをタップすると、リンク情報はiOSに送られます
- システムは設定に従ってアプリを選択し、リンク情報を渡します
- 受け取ったアプリが、リンク先のコンテンツを表示します
アプリ間でのリンク情報の受け渡し方が変わり、ユーザー体験が微妙に変わるっているんです。
このとき、UIApplicationDelegate
プロトコル がアプリ側の窓口となります。
リンクの受け渡しには、「URLスキーム」や「Universal Links」という2つの仕組みが使われます。
URLスキームは古くからある仕組みで、Universal Linksの方がより安全性を考慮した仕組みになっています。
(補足)
- 「SFSafariViewController」は、SafariServicesフレームワークの一部分です。この API を使用することで、ユーザーはApp内でウェブページまたはウェブサイトを閲覧することができます。また、パスワードの自動入力、リーダー、セキュアブラウジングなどの機能を含むSafariと同様のウェブブラウジング体験を、Appを終了させることなく提供できます。Safariに移動することなくApp内でウェブサイトを表示する場合、SFSafariViewControllerを使用するのがベストな方法です。このAPIを使用することで、Safariのインターフェイスをはじめとして、Safariの主要な機能とプライバシー保護をアプリケーション内に効果的に統合することができます。 – Appにおけるウェブビューを実現するには、WKWebViewとSFSafariViewControllerのどちらを使うべきですか – 見つける – Apple Developer