7

アプリのログアウトボタンが必要です。次のコードがあります。

        while ([[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] count] != 0) {
            for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
                [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
            }
        }

(しばらくの間は削除されることを確認するためだけにありますが、実行されるのは1回だけです)

上記のコードの後に​​共有Cookieストレージの説明をNSLogすると、配列が空であることが出力されます。ただし、アプリを終了するか、アプリを閉じるだけで、アプリの起動後、最初に共有Cookieストレージの説明をNSLogしますが、すべてのCookieはまだそこにあります。

私はCookieforループでnilに設定しようとしましたが、deallocをCookieに送信しようとしました(そうすべきではないことはわかっていますが、今は何でも試しています)

4

3 に答える 3

10

問題は、Cookie がキャッシュされ、すぐにファイルに保存されないことです。

この問題を再現するサンプル プロジェクトを作成しましたが、Xcode 内からデバッガーが停止された場合など、アプリが SIGKILL シグナルを受信した場合にのみ発生することがわかりました。私の実験では、未処理の例外、クラッシュ、exit() および abort() によって NSHTTPPCookieStorage がデータを失うことはありません。

これはデバッグのみの問題のように見えるため (デバッガーを使用している場合にのみ発生します)、以前に入力したレーダーを閉じました。

すべてをテストすることはできませんでしたが、サンプル プロジェクトを使用して、他のクラッシュの原因が Cookie の損失を引き起こす可能性があるかどうかを確認してください。

于 2013-03-04T10:01:45.407 に答える
3

問題は、Cookie がキャッシュされ、すぐにファイルに保存されないことです。

呼び出しを追加すると、機能し[storage _saveCookies]ます-後でアプリを直接終了しても、それらは完全になくなります。もちろん、そのメソッドはプライベート API であるため、App Store では役に立ちません。それを誘発する何らかの方法を見つけるのは良いことです!

また、次の CoreFoundation API がうまく機能することもわかりましたが、残念ながら、Apple からも公開されていません。

extern CFTypeRef _CFHTTPCookieStorageGetDefault();
extern void CFHTTPCookieStorageDeleteAllCookies( CFTypeRef storage );
extern void CFHTTPCookieStorageSyncStorageNow( CFTypeRef storage );

...

CFTypeRef storage = _CFHTTPCookieStorageGetDefault();
CFHTTPCookieStorageDeleteAllCookies( storage );
CFHTTPCookieStorageSyncStorageNow( storage );
于 2012-04-07T12:21:47.150 に答える
1

次のコードが機能することがわかりました。

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookieJar = [storage cookies];

for (NSHTTPCookie *cookie in cookieJar)
{
    [storage deleteCookie:cookie];
}
于 2012-02-08T00:49:08.227 に答える