Альтернативный метод для NSURLRequest private "setAllowsAnyHTTPSCertificate: forHost:"?

Мое приложение для iPhone было отклонено исключительно для использования (очень безопасного, казалось бы) частного метода +setAllowsAnyHTTPSCertificate:forHost: для NSURLRequest. Существует ли не-частный API для эмуляции этой функции?

Ответ 2

На самом деле, я тестирую 10.6.8, и этот код все еще работает - он использует частный API, но проверяет, существует ли селектор (myurl - это NSURL, который я пытаюсь загрузить в WebView или NSURLConnection):

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

    fp = [NSURLRequest methodForSelector:selx];

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

Обратите внимание, что "@selector" не использовался, так что вся работа будет выполняться во время выполнения. Это делает его безопасным и скрытым от проверки Apple, как это может быть, особенно если вы замаскируете строку.

Ответ 3

Одно действительно глупое обходное решение - создать свой собственный метод категорий:

@implementation NSURLRequest (IgnoreSSL)

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

@end

Это должно получиться с помощью проверки API Apple private, но это все равно одно и то же (с использованием частного, недокументированного API [1], который может сломаться в любое время). На самом деле, это хуже, поскольку он позволяет все, а не только хост.

[1]: частный API, который должен быть опубликован, но частный API.

Ответ 4

Взгляните на эту ссылку: http://www.abstractec.co.uk/blog/iPhone.php?itemid=70

Может быть лучшим решением для вас, чем просто обходить конфиденциальную проверку API.

Ответ 5

Не решение, а предложение. Вы подумали об использовании ASIHttpRequest Framework для этого? Эта структура является полной во всех аспектах. Проверьте документацию, возможно, она тоже может вам помочь.

Ответ 6

setAllowsAnyHTTPSCertificate, похоже, теперь не поддерживается в OS X 10.6.6 вообще.

Я сказал 10.6.6? Возможно, мне следовало бы сказать "Снежная перспектива".