SFSafariViewControllerのCookieの同期について検証してみた
iOS9で追加された「SFSafariViewController」を利用することでSafariのCookieの情報を共有できる(orできない)という情報がちらほらググると出てくるので、実際のところどうなのか検証してみました。
参考
SFSafariViewController はトラッキングの夢を見るか
[iOS 9] SFSafariViewControllerお試し
知りたいこと
SFSafariWebViewとSafariがWebブラウザの設定に準じてCookieが同期できるかどうか。そのために以下の2つを行いました。
- 1stパーティCookieの読み書き(Safari->App or App->Safari)ができるかどうか
- 3rdパーティCookieの読み書き(Safari->App or App->Safari)ができるかどうか
結論
Webブラウザの設定に準じてCookieの共有はされた!
(たまに共有されない時もあった。どんなパターンの時に共有されないのか引き続き調査中…きっとバグ!)
前提条件
検証環境
- Swift 2.2
- Xcode 7.3
- Safari 601.1
訪問先ドメイン
1stパーティCookie検証時
- 訪問先ドメイン: example.com
- CookieDomain: exapmle.com
example.comに適当なhtmlファイルを置いて試しました。
3rdパーティCookie検証時
- 訪問先ドメイン: s3-ap-northeast-1.amazonaws.com
- CookieDomain: exapmle.com
AWSのS3を利用してs3-ap-northeast-1.amazonaws.comからiframeに読みこんで試しました。
Cookieのブロック設定
- example.comのCookieがない状態&常に許可
- example.comのCookieがない状態&訪問したWebサイトを許可
- example.comのCookieがない状態&アクセス中のWebサイトのみ許可
- example.comのCookieがある状態&アクセス中のWebサイトのみ許可
Cookieの付与方法
- JavaScript(document.cookieを操作)
- PHP(setcookieを操作)
その他
- 確認はiPhoneとMacを繋いでSafariのWebインスペクタでexample.comにアクセスして確認
- 検証の際は毎回iPhoneの履歴とWebサイトデータを消去してから
- 今回はJavaScriptの結果をお伝えします。(PHPも同じでした)
- ソースコードは最後に載せております
イメージはこんな感じ。ボタンを押したらSFSafariViewControllerに遷移します。
1stパーティCookie結果
どのCookieのPolicyの場合でも以下の結果になりました。
- Safari->App 共有される
- App->Safari 共有される
ただし、Safari->Appに関しては共有されない時もありました。
共有されない時はランダムに起きたので(おそらく)、どんなパターンの時に共有されないのか調査中です…。
3rdパーティCookie結果
各パターンで以下のような結果になりました。
example.comのCookieがない状態&常に許可
- Safari->App 共有される
- App->Safari 共有される
example.comのCookieがない状態&訪問したWebサイトを許可
- Safari->App 共有されない
- App->Safari 共有されない
example.comのCookieがない状態&アクセス中のWebサイトのみ許可
- Safari->App 共有されない
- App->Safari 共有されない
example.comのCookieがある状態&アクセス中のWebサイトのみ許可
- Safari->App 共有されない
- App->Safari 共有されない
(追加)example.comのCookieがない状態&訪問したWebサイトを許可(過去にアクセスあり)
- Safari->App 共有されない
- App->Safari 共有されない
(追加)example.comのCookieがある状態&訪問したWebサイトを許可(過去にアクセスあり)
- Safari->App 共有される
- App->Safari 共有される
Cookieのブロック設定を常に許可にしている時とCookieがある状態で訪問したWebサイトを許可の場合はCookieが更新されました!
ただ、Safari->Appの時は1stパーティCookie検証時と同じように共有がされる時とされない時がありました。(調査中…)
SFSafariViewControolerの使い方
SafariServicesをimport
1 2 3 |
[sourcecode lang="JavaScript"] import SafariServices [/sourcecode] |
SFSafariViewControllerDelegateを追加
1 2 3 4 |
[sourcecode lang="JavaScript"] class ViewController: UIViewController, SFSafariViewControllerDelegate { ... [/sourcecode] |
インスタンスを作って遷移
1 2 3 4 5 6 |
[sourcecode lang="JavaScript"] let url = NSURL(string: "example.com")! let sfSafariViewController = SFSafariViewController(URL: url, entersReaderIfAvailable: true) sfSafariViewController.delegate = self presentViewController(sfSafariViewController, animated: false, completion: nil) [/sourcecode] |
Delegateメソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[sourcecode lang="PHP"] func safariViewController(controller: SFSafariViewController, activityItemsForURL URL: NSURL, title: String?) -> [UIActivity] { print("アクションボタン押されたよ") return [] } func safariViewControllerDidFinish(controller: SFSafariViewController) { print("完了が押されたよ") } func safariViewController(controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) { print("ロード完了したよ(最初のページのロード完了時のみ呼ばれるよ)") } [/sourcecode] |
一言
基本的にはWebブラウザの設定に応じてCookieの共有がされているっぽいです。
たまに、共有されない時があるのはおそらくバグだと思われます…。
引き続き何かわかったら追記します!