Linqpad - я все время так использую. http://www.linqpad.net/
Не вводите в заблуждение название - оно просто описывает первоначальную мотивацию, а не его функциональность.
Совсем недавно он выпустил версию с правильным завершением выписки - это платное дополнение (основной инструмент бесплатный), но, думаю, за небольшую сумму денег, и оно того стоит.
Для этого есть поддерживаемый API! Добавьте что-нибудь подобное к вашему делегату NSURLConnection
:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
if ([trustedHosts containsObject:challenge.protectionSpace.host])
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
Обратите внимание, что соединение:didReceiveAuthenticationChallenge:
может отправить свое сообщение на challenge.sender (намного позже), после представления диалогового окна пользователю, если это необходимо, и т.д.
NSURLRequest
имеет частный метод под названием setAllowsAnyHTTPSCertificate: forHost:
, который будет делать именно то, что вам нужно. Вы можете определить метод allowAnyHTTPSCertificateForHost:
для NSURLRequest
через категорию и установить его так, чтобы он возвращал YES
для хоста, который вы хотите переопределить.
Если вы не желаете (или не можете) использовать частные API, существует библиотека с открытым исходным кодом (лицензия BSD) под названием ASIHTTPRequest , которая предоставляет оболочку для нижнего уровня API сети CFNetwork
. Недавно они представили возможность разрешать HTTPS-соединения
с использованием самоподписанных или ненадежных сертификатов с помощью API -setValidatesSecureCertificate:
. Если вы не хотите использовать всю библиотеку, вы можете использовать исходный код в качестве справочника для самостоятельной реализации тех же функций.
Я не могу взять на себя ответственность за это, , но тот, который я нашел , очень хорошо подходит для моих нужд. shouldAllowSelfSignedCert
- моя переменная BOOL
. Просто добавьте к своему делегату NSURLConnection
, и вы должны быть готовы к быстрому обходу для каждого соединения.
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)space {
if([[space authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) {
if(shouldAllowSelfSignedCert) {
return YES; // Self-signed cert will be accepted
} else {
return NO; // Self-signed cert will be rejected
}
// Note: it doesn't seem to matter what you return for a proper SSL cert
// only self-signed certs
}
// If no other authentication is required, return NO for everything else
// Otherwise maybe YES for NSURLAuthenticationMethodDefault and etc.
return NO;
}
Обходной путь категории, опубликованный Натаном де Вризом, пройдет проверку приватного API AppStore и будет полезен в случаях, когда вы не контролируете объект NSUrlConnection
.
Одним из примеров является NSXMLParser
, который откроет предоставленный вами URL, но не раскрывает NSURLRequest
или NSURLConnection
.
В iOS 4 обходной путь, похоже, все еще работает, но только на устройстве, симулятор больше не вызывает метод allowsAnyHTTPSCertificateForHost:
.