2

AFNetworking の 2.0 バージョンで認証を処理する方法を知っている人はいますか? 以下を試してみましたが成功しませんでした。ブロックが呼び出されています (そこに NSLog がありました) が、応答はまだ 401 エラーです

[self setTaskDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential *__autoreleasing *credential) {
    *credential = [[NSURLCredential alloc] initWithUser:username password:password persistence:NSURLCredentialPersistenceForSession];
    return NSURLSessionAuthChallengeUseCredential;
}];
4

2 に答える 2

4

これは AFNetworking 2.0 のバグだと思います。実装は次のとおりです。

- (void)URLSession:(NSURLSession *)session
              task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
    NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
    __block NSURLCredential *credential = nil;

    if (self.taskDidReceiveAuthenticationChallenge) {
        disposition = self.taskDidReceiveAuthenticationChallenge(session, task, challenge, &credential);
    } else {
        [self URLSession:session didReceiveChallenge:challenge completionHandler:completionHandler];
        return;
    }

    if (completionHandler) {
        completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, credential);
    }
}

NSURLSessionAuthChallengeUseCredentialを指定していても、AFNetworking は を返していることに注意してください。NSURLSessionAuthChallengePerformDefaultHandlingこれには、「チャレンジのデフォルト処理 - このデリゲートが実装されていないかのように、資格情報パラメーターは無視されます」と記載されています。

于 2013-08-25T02:24:36.890 に答える
0

スイフト3.0

指定されたメソッドをオーバーライドし、

override func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

    completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))

}
于 2017-01-12T16:43:17.463 に答える