だいたい47度

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

【Objective-C】Restkitなどでのアカウントのログアウトでハマった

アカウント登録型のiOSアプリを作っていたのですが、ログアウト周りでハマりました。

Aさんでログインしたあと、ログアウトし、Bさんでログインして情報をサーバから受け取ろうとすると、なぜかAさんの結果が帰って来てしまうというバグがどうしても取れなかったのです。なお通信はBASIC認証を使って行なっています。

まずサーバ側に問題がないか確認しました。コマンドラインからサーバ問い合わせをすると、アカウントごとにちゃんと違う結果が返ってきます。またwiresharkを使って通信をみていると、どうもアプリから発信している要求がおかしいことがわかりました。

しかし、アプリ側でログ出力させてみても、きちんと違うクエリを発行しているように見えます。AFNetworkingを使用していたのですが、setAuthorizationHeaderWithUsername:password:がきちんと呼ばれていますし、その後の交信でも使われていそうです。

すわキャッシュか!と思い、ログアウトのときに大いにキャッシュ削除を記述してみましたが、うまくいきません。以下のように念入りにCookieも消していますが、うまくいきません。

NSDictionary *credentialsDict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];

if ([credentialsDict count] > 0) {
NSEnumerator *protectionSpaceEnumerator = [credentialsDict keyEnumerator];
id urlProtectionSpace;

while (urlProtectionSpace = [protectionSpaceEnumerator nextObject]) {
NSEnumerator *userNameEnumerator = [[credentialsDict objectForKey:urlProtectionSpace] keyEnumerator];
id userName;

while (userName = [userNameEnumerator nextObject]) {
NSURLCredential *cred = [[credentialsDict objectForKey:urlProtectionSpace] objectForKey:userName];
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:cred forProtectionSpace:urlProtectionSpace];
}
}
}

[[NSURLCache sharedURLCache] removeAllCachedResponses];

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [cookieStorage cookies];

id cookie;
for (cookie in cookies) {
[cookieStorage deleteCookie:cookie];
}


他にもセッションのAuthorizationを書き換えてみたり、と色々やってみましたが全然ダメでした。

困り果てた結果、以下のブログに行き着きました。
HTTP Basic Authentication "Logout" with NSURLConnection
http://www.springenwerk.com/2008/11/i-am-currently-building-iphone.html

なんとURLの一番最後に#をつけることでキャッシュさせなくするという方法。

[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:3000/something.json"]]

[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:3000/something.json#"]]


で、これでやってみると確かにうまくいく!

2日ほどここで困っていたのですが解消しました。特にRestkitとCoreDataの導入を試しでやっていたときだったので、問題がNSURLConnectionにあるという切り分けにも手間取りました。なお、パラメータをつけるときは、URLの一番最後に#がくるようにうまく調整しないといけないので注意してください。
関連記事
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。