2010-01-04 3 views
16

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

+2

Почему вы хотите в первую очередь разрешить недействительные сертификаты HTTP? –

+0

Привет .. ваша проблема решена, но для этого вы исключаете метод выше в своем исходном коде? –

ответ

1

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

@implementation NSURLRequest (IgnoreSSL) 

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

@end 

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

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

+1

Из того, что я знаю об этом, это все равно не пройдет проверку Apple, поскольку они, похоже, используют довольно простой анализ, основанный исключительно на селекторах, а не на их использовании. –

+0

@Mike: Вы уверены? Я вообще не «использую» селектор, только переопределяя его. Об этом говорят внутренние сотрудники Apple. Конечно, это совсем не безопасно, но я не понимаю, как он не пройдет проверку Apple. – Michael

+1

Этот способ определенно отклонит ваше приложение. – Franklin

1

Посмотрите на эту ссылку: http://www.abstractec.co.uk/blog/iPhone.php?itemid=70

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

+0

Возможно ли использовать NSURLConnection вместо CFHTTPMessageRef? Я бы предпочел, чтобы загрузка была асинхронной. – Michael

0

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

0

setAllowsAnyHTTPSCertificate, кажется, в настоящее время не будет поддерживаться OS X 10.6.6 в целом.

Я сказал 10.6.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, как это может быть, особенно если вы затмеваете строку.

+0

Работает! Спасибо – Chris

+1

Не рекомендуемое решение: (1) вы не даете своему пользователю возможность принять или нет. (2) Вы пишете на публичном форуме, если Apple случится с ним, они могут стать мудрыми. (3) См. Ответ Yonel: http://stackoverflow.com/a/2145367/818352 – George

+0

Просто хотел сказать, что это сработало для меня до тех пор, пока не выйдет 5S и iPad Air - здесь выходят (на литье) ни на одну из этих устройства. – Luke