Приложение для iPhone было отклонено исключительно для использования (очень безопасно, похоже) частного метода +setAllowsAnyHTTPSCertificate:forHost:
для NSURLRequest
. Существует ли не-частный API для эмуляции этой функции?Альтернативный метод для частного «setAllowsAnyHTTPSCertificate» для NSURLRequest: forHost:??
ответ
Там, кажется, является публичным API для этого;) How to use NSURLConnection to connect with SSL for an untrusted cert?
Спасибо! Странно, что Google этого не сделал. – Michael
Один действительно глупо обходной путь, чтобы сделать свой собственный метод категории:
@implementation NSURLRequest (IgnoreSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
Это должно получить от Apple, частные проверки API, но это по-прежнему то же самое (с использованием частной, недокументированные API [1], что которые могут сломаться в любое время). На самом деле, это хуже, потому что он позволяет все, а не только хозяина.
[1]: частный API, который должен быть обнародован, но частный API все же.
Из того, что я знаю об этом, это все равно не пройдет проверку Apple, поскольку они, похоже, используют довольно простой анализ, основанный исключительно на селекторах, а не на их использовании. –
@Mike: Вы уверены? Я вообще не «использую» селектор, только переопределяя его. Об этом говорят внутренние сотрудники Apple. Конечно, это совсем не безопасно, но я не понимаю, как он не пройдет проверку Apple. – Michael
Этот способ определенно отклонит ваше приложение. – Franklin
Посмотрите на эту ссылку: http://www.abstractec.co.uk/blog/iPhone.php?itemid=70
Может быть лучшим решением для вас, чем просто обманывая частный чек API.
Возможно ли использовать NSURLConnection вместо CFHTTPMessageRef? Я бы предпочел, чтобы загрузка была асинхронной. – Michael
Не решение, а предложение. Думали ли вы об использовании ASIHttpRequest Framework? Эта структура является полной во всех аспектах. Проверьте документацию, может быть, она тоже может вам помочь.
setAllowsAnyHTTPSCertificate, кажется, в настоящее время не будет поддерживаться OS X 10.6.6 в целом.
Я сказал 10.6.6? Возможно, мне следовало бы сказать «Снег Виста».
На самом деле, я тестирую 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, как это может быть, особенно если вы затмеваете строку.
Работает! Спасибо – Chris
Не рекомендуемое решение: (1) вы не даете своему пользователю возможность принять или нет. (2) Вы пишете на публичном форуме, если Apple случится с ним, они могут стать мудрыми. (3) См. Ответ Yonel: http://stackoverflow.com/a/2145367/818352 – George
Просто хотел сказать, что это сработало для меня до тех пор, пока не выйдет 5S и iPad Air - здесь выходят (на литье) ни на одну из этих устройства. – Luke
Почему вы хотите в первую очередь разрешить недействительные сертификаты HTTP? –
Привет .. ваша проблема решена, но для этого вы исключаете метод выше в своем исходном коде? –