我在UIWebView中嵌入了一个网站。在开发过程中,我指向localhost。问题是每当它命中“https://”url时它就不会加载。当我在移动safari中加载网址时,我会看到这个弹出窗口:
有没有办法用UIWebView覆盖它以允许未验证的URL?
答案 0 :(得分:59)
如果它仅用于开发期间的测试,您可以在NSURLRequest上创建一个类别并覆盖以下私有方法:
#if DEBUG
@implementation NSURLRequest (NSURLRequestWithIgnoreSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
#endif
将它放在你的.m文件中的任何位置(例如app delegate),或者将它放在它自己的.m文件中。您不需要匹配的头文件。
#if DEBUG
是一项预防措施,可以防止您在向Apple提交时意外将其置为启用状态,但是如果您需要它在发布版本中工作,请将其删除(并确保您记得恢复它或在提交给Apple之前删除此类别。
答案 1 :(得分:9)
Swift 3/4版本为Nick Lockwood回答。
这仅用于测试/开发目的:
extension NSURLRequest {
#if DEBUG
static func allowsAnyHTTPSCertificate(forHost host: String) -> Bool {
return true
}
#endif
}
答案 2 :(得分:8)
尼克的回答将使您的应用程序不被Apple在App Store中接受,而乔治的回答将无法加载具有.css或.js或任何其他二次下载的页面的其余部分。有一个完整的答案here,允许UIWebView从具有不受信任证书的站点加载页面。
答案 3 :(得分:8)
在iOS 9中,所有无效或自签名证书的SSL连接都将失败。这是iOS 9.0或更高版本以及OS X 10.11及更高版本中新App Transport Security功能的默认行为。
您可以在Info.plist
字典中将NSAllowsArbitraryLoads
设置为YES
,从而覆盖此行为。 但是,我建议仅将此设置覆盖以用于测试目的。
有关信息,请参阅App Transport Technote here。
答案 4 :(得分:3)
使用以下两种方法,我们可以在UIWebview中允许未经验证的ssl
-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
我已经详细解答了如何实现这个here
答案 5 :(得分:2)
有一种方法可以合法地执行此操作(至少通过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建议适用于此:
- 不要在生产服务器上使用未签名的证书!
- 始终发出警告,让您的用户决定是否接受证书。
答案 6 :(得分:0)
我知道它有点晚了但它可以帮助其他人,我发现一篇文章绕过iOS应用程序中的ssl,所有你需要做的就是设置你的webview并从应用程序到你的服务器做一个帖子请求,如果你得到一个ssl错误,这意味着你的服务器上没有有效的证书,为了绕过你必须使用webview委托的方法,这是 1.)可以对保护空间进行身份验证 2.)应该按要求开始加载 3.)接收认证挑战 你可以从这个URL复制这些功能,对我而言,它的效果非常好。希望它有所帮助