[ios] CredStore 쿼리 수행 오류

내 앱 백엔드에 대한 API 호출을 수행하는 동안 문제가 발생했습니다. 이제 모든 연결에 다음 메시지가 표시됩니다.

CredStore - performQuery - Error copying matching creds.  Error=-25300, query={
    atyp = http;
    class = inet;
    "m_Limit" = "m_LimitAll";
    ptcl = http;
    "r_Attributes" = 1;
    srvr = "myappsurl.com";
    sync = syna;
}

이 문제의 원인이 무엇인지 또는 CredStore가 무엇을하는지 잘 모르겠 기 때문에 조금 길을 잃었습니다. CredStore는 iOS에서 어떤 용도로 사용됩니까?



답변

이 오류 는 알 수없는 URLCredential에서 를 검색하려고 할 때 발생합니다 . 예 :URLCredentialStorageURLProtectionSpace

let protectionSpace = URLProtectionSpace.init(host: host,
                                              port: port,
                                              protocol: "http",
                                              realm: nil,
                                              authenticationMethod: nil)

var credential: URLCredential? = URLCredentialStorage.shared.defaultCredential(for: protectionSpace)

생산하다

CredStore - performQuery - Error copying matching creds.  Error=-25300, query={
    class = inet;
    "m_Limit" = "m_LimitAll";
    ptcl = http;
    "r_Attributes" = 1;
    srvr = host;
    sync = syna;
}

보호 공간에 대한 자격 증명을 제공합니다.

let userCredential = URLCredential(user: user,
                                   password: password,
                                   persistence: .permanent)

URLCredentialStorage.shared.setDefaultCredential(userCredential, for: protectionSpace)

다음에 자격 증명을 검색하려고하면 오류가 사라집니다.

이 문제의 원인이 무엇인지 또는 CredStore가 무엇을하는지 잘 모르겠 기 때문에 조금 길을 잃었습니다. CredStore는 iOS에서 어떤 용도로 사용됩니까?

iOS의 자격 증명 저장소를 사용하면 사용자가 인증서 기반 또는 암호 기반 자격 증명을 장치에 일시적으로 또는 영구적으로 키 체인에 안전하게 저장할 수 있습니다.

백엔드 서버에 일종의 인증이 있고 해당 서버가 앱에 대한 인증 시도를 요청하고 있다고 생각합니다 (자격 증명이 존재하지 않음).

에서 nil을 반환하는 URLCredentialStorage것이 유효한 응답이므로 무시해도됩니다.


답변

Alamofire로 요청을 수행 할 때 왜이 오류가 발생하는지 잘 모르겠지만 HTTP 헤더에서 일부 토큰으로 API 요청을 수행하면 자격 증명 저장소가 전혀 필요하지 않을 수 있습니다. 따라서 요청에 대해 비활성화 할 수 있습니다.

let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = ourHeaders
// disable default credential store
configuration.urlCredentialStorage = nil

let manager = Alamofire.SessionManager(configuration: configuration)
...

이러한 변경 후 오류가 없습니다.


답변

이것은 전송 오류입니다. plist 파일에 다음과 같은 전송 권한을 추가해 보겠습니다.

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

앱에서 모든 서버에 연결할 수 있으므로 주의하십시오 . 계속하기 전에 앱 전송 보안에 대해 자세히 읽어보십시오. @kezi의 댓글보기


답변

이 같은 문제가 나에게 발생하며 API URL에 URL 끝에 “/”가 포함되어 있지 않으면 iOS가 “Authorization”값을 서버로 보내지 않는다는 것을 발견했습니다. 이로 인해 콘솔에 문제가 게시 된 것과 같은 메시지가 표시됩니다.

따라서 URL 끝에 “/”를 추가하면됩니다.

https://example.com/api/devices/


답변

이 문제를 해결하기 위해 URL이 포함 된 문자열을 편집했습니다.

var myUrl = "http://myurl.com"
myUrl = myUrl.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!

let url = URL(string: myUrl)


답변

이 오류가 발생하면 AVPlayer를 사용할 때 주 스레드에서 .play ()를 호출하십시오.


답변

이 오류가 발생하는 원인은 실수로 Authorization 헤더에서 “Bearer”와 액세스 토큰 사이에 두 개의 공백을 사용했기 때문입니다.

틀림 :

request.setValue("Bearer  \(accessToken)", forHTTPHeaderField: "Authorization")

옳은:

request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")

단순한 실수이지만 그것을 찾는 데 시간이 걸렸습니다.