4

私が REST 呼び出しを行うサーバーが Cookie を iPhone に渡すことを発見しました。また、HTTP Basic Auth も採用しています。

認証に使用するアカウントを変更できるアプリがありますが、didReceiveAuthenticationChallenge呼び出されることはないため、資格情報を変更しても問題ないことがわかりました。

私は2つの潜在的な修正を調べました:

  • 資格情報が変更されるたびに手動で Cookie を削除する
  • 設定[request setHTTPShouldHandleCookies:NO]

私はこれを正しく理解しているのだろうか。これでキャッシュが処理されると思っNSURLRequestReloadIgnoringCacheDataていましたが、そうではないようです。

どうすればこれを解決できますか?

編集:に設定しようとしましたshouldHandleCookiesNO、Cookie がまだサーバーに渡されているようです。

4

2 に答える 2

7

ロブ、あなたの言う通りです。これには問題があるようです。場合によっては、古い認証資格情報を保持する Cookie が設定されます。他の人は、そのように Cookie をクリアする必要があるかもしれないと提案しましたが、これで問題は解決しました。

 - (void)clearCookiesForURL {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *cookies = [cookieStorage cookiesForURL:_URL];
    for (NSHTTPCookie *cookie in cookies) {
        NSLog(@"Deleting cookie for domain: %@", [cookie domain]);
        [cookieStorage deleteCookie:cookie];
    }
  }

より多くのdidReceiveAuthenticationChallenge が一度だけ呼び出されるようにするには、この質問を見てください iPhone

于 2012-05-16T08:51:10.607 に答える
2

安全なスウィフト:

func clearCookies(forURL URL: NSURL) -> Void {
    let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
    let cookies = cookieStorage.cookiesForURL(URL) ?? []
    for cookie in cookies {
        print("Deleting cookie for domain: \(cookie.domain)")
        cookieStorage.deleteCookie(cookie)
    }
}

受け取りたい場合は、StringいつflatMapでも失敗可能なNSURL初期化子を使用できます。

let cookies = NSURL(string: string).flatMap(cookieStorage.cookiesForURL) ?? []
于 2016-03-24T02:12:37.550 に答える