2

私のアプリ登録では、ユーザー認証のためにサーバーから 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 も削除したことを知っていますが、この場合、ユーザーがアプリを強制終了したときにも発生します。なぜそれが起こるのですか?

4

0 に答える 0