在UIWebview中允许未验证的ssl证书

Chr*_*ker 25 ssl uiwebview ios

我在UIWebView中嵌入了一个网站.在开发过程中,我指向localhost.问题是每当它命中"https://"url时它就不会加载.当我在移动safari中加载网址时,我得到这个弹出窗口:

在此输入图像描述

有没有办法用UIWebView覆盖它以允许未验证的URL?

Nic*_*ood 59

如果它仅用于开发期间的测试,您可以在NSURLRequest上创建一个类别并覆盖以下私有方法:

#if DEBUG

@implementation NSURLRequest (NSURLRequestWithIgnoreSSL) 

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
    return YES;
}

@end

#endif
Run Code Online (Sandbox Code Playgroud)

只需将它放在你的.m文件中的任何位置(例如app delegate),或者将它放在它自己的.m文件中.您不需要匹配的头文件.

#if DEBUG是一个预防措施,以防止您在提交到Apple时意外地将其保留为启用状态,但如果您需要它在发布版本中工作,请将其删除(并确保在提交给Apple之前记得恢复它或删除此类别).

  • 这个解决方案对我不起作用.当我把它写入我的代码时,应用确实忽略了引发涉及安全证书的错误,但它也没有完成加载页面.我不确定它在做什么.我已经在我能找到的每个相关方法(didFailLoadWithError,didFinishLoading等)中设置了NSLog,并且它永远不会到达任何一个.这可能是我网站的问题吗? (2认同)

Ole*_*rov 9

Swift 3/4版本为Nick Lockwood回答.

这仅用于测试/开发目的:

extension NSURLRequest {
    #if DEBUG
    static func allowsAnyHTTPSCertificate(forHost host: String) -> Bool {
        return true
    }
    #endif
}
Run Code Online (Sandbox Code Playgroud)


Pro*_*gle 8

Nick的回答将使您的应用程序不被Apple在App Store中接受,而George的回答将无法加载具有.css或.js或任何其他二次下载的页面的其余部分.有一个完整的答案在这里,它允许一个UIWebView加载从网站的页面与一个不受信任的证书.

  • +1,我刚刚因为使用"私有api"(allowsAnyHTTPSCertificateForHost方法)而拒绝了我的应用 (4认同)

joh*_*ieb 8

在iOS 9中,所有无效或自签名证书的SSL连接都将失败.这是iOS 9.0或更高版本以及OS X 10.11及更高版本中新的App Transport Security功能的默认行为.

您可以Info.plist通过在字典中设置NSAllowsArbitraryLoads为覆盖此行为.但是,我建议仅为测试目的覆盖此设置.YESNSAppTransportSecurity

在此输入图像描述

有关信息,请参阅应用交通运输技术说明这里.