【Swift】Cookieの情報をログ出力する

##環境

- Swift4
- x-code9.4.1
- 対象はiOS9.0以上

##前提

- WKWebViewにcookieを保持したWebページを表示していること
- [WKWebView](https://developer.apple.com/documentation/webkit/wkwebview)と[WKWebsiteDataStore](https://developer.apple.com/documentation/webkit/wkwebsitedatastore)を使用
- 調べ調べなんとかした結果の備忘録


##WKWebViewとWKWebsiteDataStore

以下、公式より抜粋。

>**※WKWebViewの注意点**
iOS 8.0およびOS X 10.10以降では、WKWebViewを使用してWebコンテンツをアプリケーションに追加します。UIWebViewまたはWebViewは使用しないでください。

>**※WKWebsiteDataStore**
オブジェクトが選択されたウェブサイトで使用される各種のデータを表します。データ型には、Cookie、ディスクとメモリのキャッシュ、WebSQL、IndexedDBデータベース、ローカルストレージなどの永続データが含まれます。

## アプリに保存されているCookieの情報をログに出す
``` クッキー.swift
import WebKit

    /// 保存されているCookieの情報をログに出す
    ///
    /// - Parameters:
    ///   - webView: 表示先のWKWebView
    ///   - printDataTypes: 出力対象
    func printCookieName(webView: WKWebView, printDataTypes:Set<String>) {
        // dataStoreを取得 (WKWebsiteDataStoreはiOS 9.0以上対象)
        let dataStore = WKWebsiteDataStore.default()
        // データの取得
        dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { (records:[WKWebsiteDataRecord]) in
            for record in records {
                for printDataType in printDataTypes {
                    if record.dataTypes.contains(printDataType) {
                        let cookieStore = webView.configuration.websiteDataStore.httpCookieStore
                        // 格納されているすべてのCookieを取得 
                        cookieStore.getAllCookies() { (cookies) in
                            for cookie in cookies {
                                print("cookie名:" + cookie.name)
                                print("cookieの値:" + cookie.value)
                                print(cookie)
                            }
                        }
                    }
                }
            }
        }
    }

```
ネストが深い・・・・・・（ ｉ _ ｉ ）





```呼び出し.swift
printCookieName(webView: webView, printDataTypes: [WKWebsiteDataTypeCookies])
```

##出力結果
```出力結果.swift
cookie名：c0
cookieの値:hogehohe%2BkumZG2hogehoge

<NSHTTPCookie
	version:1
	name:c0
	value:hogehohe%2BkumZG2hogehoge
	expiresDate:'2019-08-21 02:58:07 +0000'
	created:'2018-08-21 11:58:49 +0000'
	sessionOnly:FALSE
	domain:hogehoge
	partition:none
	path:/
	isSecure:FALSE
 path:"/" isSecure:FALSE>
```

一応、保持しているすべてのCookieをログに出せることは確認できました。
※値は一部書き換えてます。


##cookie以外のデータ一覧
```.swift
/*! @constant WKWebsiteDataTypeFetchCache On-disk Fetch caches. */
@available(iOS 11.3, *)
public let WKWebsiteDataTypeFetchCache: String

/*! @constant WKWebsiteDataTypeDiskCache On-disk caches. */
@available(iOS 9.0, *)
public let WKWebsiteDataTypeDiskCache: String

/*! @constant WKWebsiteDataTypeMemoryCache In-memory caches. */
@available(iOS 9.0, *)
public let WKWebsiteDataTypeMemoryCache: String

/*! @constant WKWebsiteDataTypeOfflineWebApplicationCache HTML offline web application caches. */
@available(iOS 9.0, *)
public let WKWebsiteDataTypeOfflineWebApplicationCache: String

/*! @constant WKWebsiteDataTypeCookies Cookies. */
@available(iOS 9.0, *)
public let WKWebsiteDataTypeCookies: String

/*! @constant WKWebsiteDataTypeSessionStorage HTML session storage. */
@available(iOS 9.0, *)
public let WKWebsiteDataTypeSessionStorage: String

/*! @constant WKWebsiteDataTypeLocalStorage HTML local storage. */
@available(iOS 9.0, *)
public let WKWebsiteDataTypeLocalStorage: String

/*! @constant WKWebsiteDataTypeWebSQLDatabases WebSQL databases. */
@available(iOS 9.0, *)
public let WKWebsiteDataTypeWebSQLDatabases: String

/*! @constant WKWebsiteDataTypeIndexedDBDatabases IndexedDB databases. */
@available(iOS 9.0, *)
public let WKWebsiteDataTypeIndexedDBDatabases: String

/*! @constant WKWebsiteDataTypeServiceWorkerRegistrations Service worker registrations. */
@available(iOS 11.3, *)
public let WKWebsiteDataTypeServiceWorkerRegistrations: String

```


##参考
- [[iOS] WKWebViewのCookieとキャッシュを削除したい](http://www.kuma-de.com/blog/2018-06-07/7406)
- [【iOS11以降対応】WKWebViewのcookieの取得とセット](http://www.cl9.info/entry/2018/04/11/103716)
- - [WKWebViewのストレージに関するメモ](https://qiita.com/hotpepsi/items/e8813a9382e003cf89b3)