【发布时间】:2012-02-10 03:14:05
【问题描述】:
我在 UIWebView 中嵌入了一个网站。在开发过程中,我将它指向本地主机。问题是,只要它点击“https://”网址,它就不会加载。当我在移动 Safari 中加载 url 时,我得到了这个弹出窗口:
有没有办法用 UIWebView 覆盖它以允许未经验证的 url?
【问题讨论】:
我在 UIWebView 中嵌入了一个网站。在开发过程中,我将它指向本地主机。问题是,只要它点击“https://”网址,它就不会加载。当我在移动 Safari 中加载 url 时,我得到了这个弹出窗口:
有没有办法用 UIWebView 覆盖它以允许未经验证的 url?
【问题讨论】:
如果只是为了在开发过程中进行测试,您可以在 NSURLRequest 上创建一个类别并覆盖以下私有方法:
#if DEBUG
@implementation NSURLRequest (NSURLRequestWithIgnoreSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
#endif
只需将其放在您的一个 .m 文件(例如应用程序委托)中的任何位置,或将其放在它自己的 .m 文件中。您不需要匹配的头文件。
#if DEBUG 是一种预防措施,可防止您在提交给 Apple 时意外启用它,但如果您需要它在发布版本中工作,请删除它(并确保您记得恢复它或删除它类别,然后再提交给 Apple)。
【讨论】:
Nick Lockwood 答案的 Swift 3/4 版本。
这仅用于测试/开发目的:
extension NSURLRequest {
#if DEBUG
static func allowsAnyHTTPSCertificate(forHost host: String) -> Bool {
return true
}
#endif
}
【讨论】:
Nick 的回答将阻止您的应用在 App Store 中被 Apple 接受,而 George 的回答将无法加载具有 .css 或 .js 或任何其他二次下载的页面的其余部分。有一个完整的答案here 允许 UIWebView 从具有不受信任证书的站点加载页面。
【讨论】:
在 iOS 9 中,所有无效或自签名证书的 SSL 连接都将失败。这是 iOS 9.0 或更高版本以及 OS X 10.11 及更高版本中新的App Transport Security 功能的默认行为。
您可以通过在NSAppTransportSecurity 字典中将NSAllowsArbitraryLoads 设置为YES 来覆盖Info.plist 中的此行为。 但是,我建议仅出于测试目的覆盖此设置。
有关信息,请参阅应用传输技术说明here。
【讨论】:
使用以下两种方法我们可以在 UIWebview 中允许未经验证的 ssl
-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
我已经详细回答了如何实现这个here
【讨论】:
有一种方法可以合法地做到这一点(至少根据 App Store 法律)。当您使用 NSURLConnection 时,有两种方法可用于允许使用自签名 SSL 证书:
How to use NSURLConnection to connect with SSL for an untrusted cert?
如果你实现 UIWebViewDelegate 使用
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
返回 NO 以使 WebView 不会自行加载。然后构造一个 NSURLConnection(可以通过上面的链接与未签名的证书一起使用)。
当然,通常的 SSL 建议在这里适用:
- 不要在生产服务器上使用未签名的证书!
- 始终显示警告,让您的用户决定是否接受证书。
【讨论】:
我知道它有点晚了,但它可以帮助其他人,我发现一篇文章在 iOS 应用程序中绕过 ssl,你需要做的就是设置你的 webview 并从应用程序向你的服务器发出一个发布请求,如果你得到一个ssl 错误,这意味着您的服务器上没有有效的证书,为了绕过您必须使用 webview 委托方法,这些方法是 1.) 可以针对保护空间进行身份验证 2.) 应根据请求开始加载 3.) 是否收到身份验证质询 你可以从这个URL 复制这些函数,对我来说效果很好。希望对你有帮助
【讨论】: