NSURLRequest的私有“setAllowsAnyHTTPSCertificate:forHost:”的替代方法?

时间:2010-01-04 19:25:14

标签: iphone cocoa cocoa-touch nsurlrequest iphone-privateapi

我的iPhone应用程序仅因使用NSURLRequest的(非常安全,似乎)私有方法+setAllowsAnyHTTPSCertificate:forHost:而被拒绝。是否有非私有API来模拟此功能?

6 个答案:

答案 0 :(得分:7)

答案 1 :(得分: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]);
}

请注意,未使用“@selector”,因此绝对所有工作将在运行时完成。这使得它与Apple的支票一样安全且隐藏,特别是如果你遮掩了字符串。

答案 2 :(得分:1)

一个非常愚蠢的解决方法是制作自己的类别方法:

@implementation NSURLRequest (IgnoreSSL)

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

@end

这应该通过Apple的私有API检查获得,但它仍然是相同的(使用可能随时中断的私有的,未记录的API [1])。实际上,它更糟糕,因为它允许一切,而不仅仅是那个主机。

[1]:公开的私有API,但仍然是私有API。

答案 3 :(得分:1)

请看一下这个链接:http://www.abstractec.co.uk/blog/iPhone.php?itemid=70

除了欺骗私有API检查之外,它可能是一个更好的解决方案。

答案 4 :(得分:0)

不是解决方案,而是建议。您是否考虑过使用ASIHttpRequest Framework?这个框架在各个方面都是完整的。查看文档,也许它也可以帮到你。

答案 5 :(得分:0)

现在,OS X 10.6.6中似乎不支持

setAllowsAnyHTTPSCertificate。

我说10.6.6吗?也许我应该说“Snow Vista”。