2010-01-04 31 views
16

对于NSURLRequest,我的iPhone应用程序仅仅因为使用(非常安全,似乎)私有方法+setAllowsAnyHTTPSCertificate:forHost:而被拒绝。是否有一个非私有的API来模拟这个功能?NSURLRequest的私有“setAllowsAnyHTTPSCertificate:forHost:”的替代方法?

+2

为什么要首先允许无效的HTTPs证书? – 2012-06-20 17:49:26

+0

嗨..你的问题已经解决,但为了你有源代码排除上述方法? – 2013-07-25 06:26:41

回答

1

一个非常愚蠢的解决办法是让自己的类中的方法:

@implementation NSURLRequest (IgnoreSSL) 

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

@end 

这应该由苹果私有API的检查得到,但它仍然是同样的事情(使用私有,未公开的API [1]这是随时有可能中断)。事实上,这更糟糕,因为它允许一切,而不仅仅是该主机。

[1]:一个私人API,应该被公开,但是私人API。

+1

从我所了解的情况来看,这仍然不会通过苹果的检查,因为它们似乎使用纯粹基于选择器的相当简单的分析,而不是它们的使用。 – 2010-01-05 00:21:42

+0

@Mike:你确定吗?我不是“使用”选择器,只是重新定义它。苹果公司的内部人士称之为。当然,这并不安全,但我不明白它不会通过苹果的支票。 – Michael 2010-01-09 20:14:56

+1

这种方式肯定会让你的应用遭到拒绝。 – Franklin 2012-07-11 12:00:53

0

不是一个解决方案,而是一个建议。你有没有想过使用ASIHttpRequest Framework这个?这个框架在所有方面都是完整的。检查文档,也许它可以帮助你。

0

setAllowsAnyHTTPSCertificate似乎现在是不支持在OS X 10.6.6干脆。

我说10.6.6吗?也许我应该说“雪景”。

6

实际上,我使用10.6.8进行测试,并且此代码仍然有效 - 它使用私有API但检查选择器是否存在(myurl是我试图加载到WebView或NSURLConnection中的NSURL) :

SEL selx = NSSelectorFromString(@"setAllowsAnyHTTPSCertificate:forHost:"); 
if ([NSURLRequest respondsToSelector: selx]) 
{ 
    IMP fp; 

    fp = [NSURLRequest methodForSelector:selx]; 

    (fp)([NSURLRequest class], selx, YES, [myurl host]); 
} 

注意,“@选择”不使用,以便绝对所有工作会在运行时完成。这使得苹果的支票尽可能安全并且隐藏起来,特别是如果你遮住了字符串。

+0

作品一种享受!谢谢 – Chris 2012-04-20 01:15:43

+1

不是一个推荐的解决方案:(1)你不给你的用户选择接受或不接受。 (2)如果苹果公司发生这种情况,他们可能会明智地向公众开放。 (3)看Yonel的回答:http://stackoverflow.com/a/2145367/818352 – George 2012-05-04 20:08:51

+0

只是想说,这直到5S和iPad空气出来为止 - 我在这里(在演员阵容)上的任何一个崩溃设备。 – Luke 2013-12-02 14:17:21