2011-12-19 8 views
15

私はDevailsを認証に使用するRailsサーバに接続する私のiPhoneアプリのネットワーク層としてAFNetworkingを使用しています。ユーザー名/パスワードを提供して(POST呼び出しで)サインインした後、実行したGETはOKです。AFNetworking and Cookies

バックグラウンドではなくアプリケーションを閉じると、認証されていないと思われるため、すべてのGETリクエストが失敗します。

だから私はクッキーがどこかに保存されていると推測します。常にログインするのを避けるために、NSUserDefaultsに保存する方法がありますか?

答えて

9

Cookieは、実際に特定のサーバー上の後続のリクエストに対してアプリケーションの存続期間中自動的に格納されます。良い戦略は、キーチェーンにまたはこのようなNSUserDefaultsでユーザー名とパスワードを保存するために、次のようになります。

// Setting 
[[NSUserDefaults standardDefaults] setObject:username forKey:@"username"]; 
[[NSUserDefaults standardDefaults] synchronize]; 

// Getting 
NSString *username = [[NSUserDefaults standardDefaults] objectForKey:@"username"]; 

あなたはAuthorization HTTPヘッダー内のすべての要求と共に資格情報を送信するためにAFHTTPClientとの組み合わせでこれを使用することもできます。

+1

おかげで、はい、これは私が古い資格情報を保つために何をすべきかです。 私が避けたいのは、すべてのアプリの再起動時のログインの初期POSTです。私は、AFNetworkingで処理されるクッキーの有効期間を延長できるかどうか疑問に思っていました。 –

+26

実際には、NSUserDefaultsにユーザ名とパスワードを保存しないでください。代わりにキーチェーンを使用してください。 AppleはKeychainWrapperを配布していますが、これは基本的に同じことですが、より安全です。 – eddieroger

75

NSURLCredentialを使用する場合、NSUserDefaultsやキーチェーンラッパーを気にする必要はありません。 実際にはNSURLCredentialです。を使用する方がはるかに簡単です。は、キーチェーンにユーザ名とパスワードの両方を格納します。 2行のコードです。ユーザーがログインしている一度あなたのコードは、そのようなものになるだろう

:次に

NSURLCredential *credential; 

credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent]; 
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace]; 

、アプリが起動されるたびに、あなたはあなたのユーザーが既に任意の資格情報を検索することによってログインしたかどうかを確認することができます自動的にユーザーを再度ログインするために(必要であれば):

NSURLCredential *credential; 
NSDictionary *credentials; 

credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace]; 
credential = [credentials.objectEnumerator nextObject]; 
NSLog(@"User %@ already connected with password %@", credential.user, credential.password); 

あなたはまた、ユーザがログアウトしたいときに資格をきれいにする必要があります。

NSURLCredential *credential; 
NSDictionary *credentials; 

credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace]; 
credential = [credentials.objectEnumerator nextObject]; 
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:self.loginProtectionSpace]; 

loginProtectionSpaceがすべて1回作成されます。このサンプルコードでは、このスペースには1つの資格情報しかないと仮定していますが、これは通常、複数のアカウントを管理しない限りです。ここで

あなたはNSURLProtectionSpaceを作成する方法の例です:返信用

NSURL *url = [NSURL URLWithString:@"http://www.example.com"]; 
self.loginProtectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url.host 
                    port:[url.port integerValue] 
                   protocol:url.scheme 
                   realm:nil 
                authenticationMethod:NSURLAuthenticationMethodHTTPDigest]; 
+0

NSURLProtectionSpaceを作成するコードはどこですか?私はAppleのドキュメントを見ましたが、作成する方法はわかりません。私は "self.loginProtectionSpace"を参照しています – user798719

+0

私は、ポートとホスト名の関係やこれらの名前空間の意味を推測します。 – user798719

+4

私はNSURLProtectionSpaceの作成方法の例を使って答えを更新しました。 URLを自分のものに置き換え、サーバーで使用されている認証方法で認証方法パラメーターを更新してください。 – Phil