11

iOS 用の AFNetworking を使用して Cookie を永久に保存する方法を教えてください。私はios7を使用していますが、これは問題ではないと思いますか?

ユースケースは、Web サービスでの認証が成功すると、すべてのリクエストで渡す必要がある 2 つの Cookie を取得することです。これらの Cookie は期限切れにならないか、数年後に期限切れになります。各 HTTPS リクエストに Cookie がある限り、ユーザーは再度ログインする必要はありません。AFNetworking がアプリを終了するまで Cookie を自動的に保持することは理解していますが、ユーザーが電話からアプリを削除するまで Cookie を永続的に保持する必要があります。

1) 認証が成功すると、Web サービスから 2 つの Cookie が渡されます。それらにアクセスするにはどうすればよいですか? NSHTTPCookie ストレージに直接移動して、その名前で Cookie を取得しますか、またはこれを行うための AFNetworking の「方法」はありますか?

2) AFHTTPClient のサブクラスが各リクエストと共にこれら 2 つのマジック Cookie を渡すように、これら 2 つのマジック Cookie を永続的に保存するにはどうすればよいですか? それらをキーチェーンまたは NSUserDefaults または NSURLCredentialsStorage 内に保存するだけですか? または、これを行うための AFNetworking の方法はありますか? AFNetworking 内の setAuthorization() メソッドについて読みましたが、これがユーザー名/パスワードおよび Cookie にも当てはまるかどうかはわかりません。

3) AFNetworking の方法でこれらの Cookie を削除するにはどうすればよいですか?

ありがとう!!

4

1 に答える 1

20

AFNetworking は Cookie を明示的に処理しないため、Cookie を処理する「AFNetworking の方法」はありません。NSHTTPCookie と NSHTTPCookieStorage を使用します。

私のプロジェクトでは、リクエストを Cookie で動作させるために、リクエストに固有のことをする必要はありませんでした。AFNetworking がデフォルトで提供するものとは異なる要求動作が必要な場合は、サブクラスでオーバーライドrequestWithMethod:path:parameters:します。AFHTTPClient

  1. たとえば、AFJSONRequest から返された Cookie を取得するには

    NSURLRequest* request = <some request returned from your AFHTTPClient subclass>
    AFJSONRequestOperation* op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
     success:^(NSURLRequest* request, NSHTTPURLResponse* response, id userData) {
        NSArray* cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:url];
     }
     failure:...
    
  2. この回答では、Cookie に有効期限を設定するように指示されています。Cookie を自分で保持したい場合は、Cookie を辞書に変換して保存できます。この回答は、キーチェーンを使用するように言っています。

    NSMutableDictionary* cookieDictionary = [NSMutableDictionary dictionaryWithDictionary:cookiePrefs];
    for (NSHTTPCookie* cookie in cookies) {
       [cookieDictionary setValue:cookie.properties forKey:cookie.name];
    }
    
  3. NSHTTPCookieStorage から Cookie を削除します。注意すべきトリッキーさがあります。Cookie を自分で保存した場合は、保存された値を削除するのが適切ですが、

    NSArray* cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:theUrl];
    for (NSHTTPCookie* cookie in cookies) {
       [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
    
于 2013-09-04T01:50:30.943 に答える