我使用Cordova 3.2和jquery mobile 1.3创建了一个iOS应用程序。我使用jquery ajax将请求发送到RESTfull服务以检索/更新信息。
我有许多测试设备,各种iPhone,各种不同的iOS版本。在运行iOS 7的iPhone 4S上,当发送任何ajax请求时,我收到以下错误:
NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
这只发生在这台设备上,在另一台运行iOS 7的iPhone 4S上,它完全正常,就像我正在使用的所有其他测试设备一样。
我已经读过,这表明证书在某种程度上是无效的,在这种情况下,这可以被忽略,为什么会影响到一台设备?
任何人都可以建议为什么会发生这种情况以及可能会阻止它仅在我的某个设备上工作的设备有什么不同。感谢
答案 0 :(得分:33)
我有一个类似的问题,但在我的情况下,所有设备都曾经发生这种情况,并且仅在使用https的ajax调用期间发生。
如果是这种情况,在appDelegate.m文件末尾添加以下代码可以缓解您的问题。
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
但我怀疑如果它在其他设备上工作,我给出的解决方案可能没有效果。但是试一试。
答案 1 :(得分:12)
如果它在某些设备而不是其他设备上运行,那么这些设备的证书验证参数会有所不同。以下是一些要注意的事项:
如果您在不愉快的设备上的浏览器中访问您的终端URL,它会给您带来什么错误? (注意:显然你的服务器也会给你一些错误,因为你没有请求正确的标题和参数。我在谈论Safari本身 - 它应该提供一个更详细的信息,关于它(它认为)是什么证书有问题。)
*编辑纠正我错误记录的内容:如果你转到Safari中的URL,你不可以选择接受叶子证书,如果你尝试,你只能选择接受中间证书直接加载它们。
答案 2 :(得分:2)
Swift版Markivs answer(摘自here):
extension NSURLRequest {
static func allowsAnyHTTPSCertificateForHost(host: String) -> Bool {
return true
}
}
答案 3 :(得分:2)
Xcode 7.3 Swift 2.2
要实现这一点,我必须做三件事:
答案 4 :(得分:1)
我在模拟器中运行应用程序时遇到了同样的问题。这背后的原因是模拟器中没有可信任的证书。
只需拖放即可将.cer文件拖放到正在运行的模拟器窗口中。您将看到Safari闪烁,然后是证书(或证书颁发机构)的导入对话框...