アプリ内に複数またがるWebViewのセッション管理方法のひとつとしてメモしておきます。
前提
- Alamofire 4.2.0を使用
1. 認証セッション取得
ログイン画面などでコール
// Swift 3.0
// Alamofire 4.2.0
/**
認証セッション(Cookie)を取得・保存する
- parameter authUrlString: 認証(ログイン)URL
- parameter authParams: 認証情報ディクショナリ
- returns: void
*/
func getAuthSession(_ authUrlString:String,authParams:Dictionary<String,String>) {
let storage = HTTPCookieStorage.shared
// Cookieリセット
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
var parameters:Dictionary<String,String> = [:]
for (key, value) in authParams {
parameters.updateValue(value, forKey: key)
}
Alamofire.request(authUrlString, method:.post, parameters:parameters ).response { response in
let res = response.response
let cookies = HTTPCookie.cookies(withResponseHeaderFields: res?.allHeaderFields as! [String : String], for: (res?.url!)!)
// Cookie保存
for i in 0 ..< cookies.count {
let cookie = cookies[i]
HTTPCookieStorage.shared.setCookie(cookie)
}
}
2. 認証セッション付きでURLロード
あらかじめ上記(getAuthSession)にて取得したセッションを付与してURLをロード
/**
認証セッション付きでURLをロードする
- parameter urlString: URL文字列
- parameter authUrlString: URL文字列
- returns: void
*/
func loadRequestWithAuthSession(_ urlString:String,authUrlString:String,webView:UIWebView) {
// セッション付きでロードしたいURL
let url = URL(string: urlString)
// 認証(ログイン)URL
let authUrl = URL(string: authUrlString)
var request = URLRequest(url: url! as URL)
let cookies = HTTPCookieStorage.shared.cookies(for: authUrl! as URL)
let header = HTTPCookie.requestHeaderFields(with: cookies!)
request.allHTTPHeaderFields = header
// ロード
webView.loadRequest(request as URLRequest)
}
おおいに参考にさせていただいた記事
【Swift】ユーザー認証APIを通した後、同一セッションとしてUIWebViewを表示する