私のアプリ登録では、ユーザー認証のためにサーバーから Cookie を取得および設定しています。これは、サーバーから取得しているヘッダー フィールドです。
[Content-Type: application/json、Pragma: no-cache、X-Powered-By: PHP/5.5.29-1+deb.sury.org~precise+1、Set-Cookie: PHPSESSID_NEW=u3j95qff7100d87pimd56mfc37; expires=2024 年 4 月 12 日金曜日 10:31:46 GMT; 最大年齢 = 259200000; path=/、サーバー: nginx/1.1.19、コンテンツ エンコーディング: gzip、有効期限: 1981 年 11 月 19 日木曜日 08:52:00 GMT、キャッシュ コントロール: ストアなし、キャッシュなし、再検証が必要、ポスト-チェック = 0、事前チェック = 0、日付: 月、2016 年 1 月 25 日 10:31:46 GMT、コンテンツの長さ: 439、接続: キープアライブ、X-CDN: Incapsula、Vary: Accept-Encoding、X- Iinfo: 8-3374242-3308240 SNNY RT(1453717901817 3717) q(0 0 0 0) r(5 5) U5]
NSHTTPCookieStorage でこれらのフィールドを設定する 2 つの方法を試しました。
func setCookies(allHeaderFields:[String : String], url:NSURL){
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(allHeaderFields, forURL: url)
NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookies(cookies, forURL: url, mainDocumentURL: nil)
}
また:
func setCookies(allHeaderFields:[String : String], url:NSURL){
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(allHeaderFields, forURL: url)
for cookie in cookies {
var cookieProperties = Dictionary<String,AnyObject>()
cookieProperties[NSHTTPCookieName] = cookie.name
cookieProperties[NSHTTPCookieValue] = cookie.value
cookieProperties[NSHTTPCookieDomain] = cookie.domain
cookieProperties[NSHTTPCookiePath] = cookie.path
cookieProperties[NSHTTPCookieVersion] = NSNumber(integer: cookie.version)
cookieProperties[NSHTTPCookieExpires] = NSDate().dateByAddingTimeInterval(31536000)
if cookie.value != "deleted"{
let newCookie = NSHTTPCookie(properties: cookieProperties)
NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(newCookie!)
}
}
}
Cookie が適切に設定されているかどうかを確認して出力し、いくつかの目的で登録およびログイン後に NSHTTPCookie の配列を返す別の関数を設定しました。
func getCookies() -> [NSHTTPCookie]{
var cookiesArray:[NSHTTPCookie] = []
let cookieJar:NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in cookieJar.cookies!{
print("name : \(cookie.name)")
print("value : \(cookie.value)")
print("expiresDate : \(cookie.expiresDate)")
print("sessionOnly : \(cookie.sessionOnly)")
cookiesArray.append(cookie)
}
return cookiesArray
}
iOS 9 で実行されているデバイスでは、両方の場合にすべてが完全に正常に機能していますが、iOS 8 を実行しているデバイスでは、ほとんどの場合、システムまたはユーザーによってアプリが終了 (SIGKILL) され、PHPSESSID_NEWキーを保持している Cookie はCookie ストレージから削除され、すべてのサーバー呼び出しが認証されないため、アプリはエラー応答を取得しています。以前のバージョンの iOS では、システムがアプリを強制終了したときに Cookie も削除したことを知っていますが、この場合、ユーザーがアプリを強制終了したときにも発生します。なぜそれが起こるのですか?