Ios CredStore执行查询错误

Ios CredStore执行查询错误,ios,xcode9,Ios,Xcode9,我在对我的应用程序后端进行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";

我在对我的应用程序后端进行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中的用途是什么?

当尝试从
URLCredentialStorage
检索未知
URLProtectionSpace
URLCredential
时,会发生此错误。 e、 g

产生

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上的凭据存储允许用户在设备上临时或永久地将基于证书或基于密码的凭据存储到密钥链

我怀疑您的后端服务器上有某种身份验证,并且该服务器正在请求对您的应用进行身份验证质询(不存在任何凭据)


可以安全地忽略它,因为从
urlcresidentialstorage
返回nil是一个有效的响应我编辑了包含URL的字符串以解决此问题:

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

let url = URL(string: myUrl)

这是传输错误,让我们在plist文件中添加如下传输权限:

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

请小心,因为这样可以从应用程序连接到任何服务器。继续之前,请阅读有关应用程序传输安全的详细信息。请参阅@kezi的评论在我的案例中,我并没有使用API密钥初始化Stripe SDK

        STPPaymentConfiguration.shared().publishableKey = publishableKey
在任何条带操作的情况下,我们可以打印错误日志,这很容易理解

        print(error.debugDescription)

如果您在使用AVPlayer时遇到此错误,只需在主线程上调用.play()

此错误也可能是由于内容安全策略(CSP)限制过严造成的。在我们的例子中,我们需要一个或多或少完全开放并允许一切的CSP。请记住,打开CSP可能是一个很大的安全问题(具体取决于您在应用程序中的具体操作)。

同样的问题也发生在我身上,我发现如果您的API URL在URL末尾不包含“/”,则iOS不会向服务器发送“授权”值。因此,您将在控制台中看到类似posted in Discussible的消息

所以只需在URL的末尾添加“/”

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

我不知道为什么在使用Alamofire执行请求时会出现此错误,但如果您使用HTTP头中的某些令牌执行API请求,则可能根本不需要凭据存储。因此,我们可以根据请求禁用它:

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

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

更改后没有错误。

导致我出现此错误的原因是我在授权标头中的“承载者”和访问令牌之间意外使用了两个空格

不正确:

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

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

很简单的错误,但找到它需要一段时间。

好的,我有这个错误,在与我的Ruby on Rails应用程序交互时与它斗争了很长一段时间(几年)

我已经按照接受的答案中所述设置了默认凭据,但仍然出现了错误,并且一直依赖didReceiveChallenge响应来提供凭据-幸运的是,这起到了解决问题的作用

但是!我刚刚找到了解决办法

我当时预感到protectedSpace字段与RubyonRails服务器的授权挑战不匹配,于是我查看了realm字段,它似乎是唯一一个未定义的字段

我从打印服务器响应头开始,虽然我能够检查这些响应头,但它们不包括WWW授权字段(本应包括领域字段)

我想这可能是因为我的Rails应用程序没有指定领域,所以我开始考虑Rails方面的问题

我发现我可以在调用中指定域

authenticate_or_request_with_http_basic
…我正在使用它进行HTTP基本身份验证

我还没有指定一个领域,所以添加了一个

authenticate_or_request_with_http_basic("My Rails App")
然后我将相应的字符串添加到protectionSpace

NSURLProtectionSpace *protectionSpace =
    [[NSURLProtectionSpace alloc] initWithHost:@"myrailsapp.com"
        port:443
        protocol:NSURLProtectionSpaceHTTPS
        realm:@"My Rails App"
        authenticationMethod:NSURLAuthenticationMethodHTTPBasic];
瞧!那起作用了,我不再得到

CredStore - performQuery - Error copying matching creds.  Error=-25300

即使在Rails应用程序中指定了域,我仍然没有看到它在HTTP头中传递,我不知道为什么,但至少它可以工作。

我在尝试在web视图中打开HTTP页面时遇到了这个问题。但是这个页面包含一个首先打开的弹出窗口


当后端团队删除此弹出窗口时,一切都正常了。

我的问题是对通过rest调用发送的图像进行base64编码

    let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)!
    let base64Credentials = credentialData.base64EncodedString(options: [])
    let headers = ["Authorization": "Basic \(base64Credentials)"]
    Alamofire.request(url, method: .get, parameters: params,encoding: URLEncoding.default,headers: headers)
                .responseJSON{
            response in
            guard let value =  response.result.value else {return}
                    print(value)
     }
我以前用过

let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
但是50%的时候我会得到上面的错误

我用下面的方法解决了我的问题

 let strBase64 = imageData.base64EncodedString()

Twitter登录也有同样的问题。原来我使用了错误的API密钥。

我在使用iOS 11+Xcode beta 6的模拟器中有相同的日志。“我希望这只是因为贝塔迪,你永远找不到解决这个问题的办法吗?”斯瓦尔克纳还没有,仍在努力寻找更多答案。我也有同样的问题。有什么消息吗?你正在播放视频吗?你将如何创建保护空间?@Brett你能提供保护空间的信息吗?如何在Moya和Alamofire中使用?我在使用Alamofire时也遇到了这个问题,我不知道在Alamofire中放置userCredential的位置:(@Brett,我在通过AFNetworking调用Twilio API时也遇到了这个问题。有什么建议,搜索什么才能抓住AFNetworking的问题吗?我不知道为什么这会获得否决票,这个解决方案帮了我的忙!我在通过FRadioPlayer@caffeinum调用audiostream时遇到了问题,因为这会消除任何安全问题。这不是一个好办法软件部分出错。添加此选项是为了给你的应用程序设置保护屏障。此答案没有说明这一点或任意加载的含义。苹果的应用程序评论可能会对此进行标记,并且会询问你的应用程序为什么需要连接到Arbia
 let strBase64 = imageData.base64EncodedString()