Последние несколько часов я бью головой о стену и нигде не могу найти ни малейшего проблеска решения.Я работаю над приложением, чтобы узнать, как работать с JSON, поэтому я просто создаю простое приложение, которое сначала просто возвращает список всех моих репозиториев на GitHub.Я могу извлечь ответ JSON из данных, возвращаемых NSURLConnection, без проблем, к сожалению, когда я пытаюсь получить доступ ко всему, что требует аутентификации, ответ всегда {
message = "Not Found";
}
Если я отправляю запрос, чтобы просто получить общедоступную информацию о моем имени пользователя, я получаюверните правильный ответ со всей правильной информацией, чтобы я знал, что я успешно общаюсь с api.github.com.Прежде всего, чтобы запустить запрос, который я использую:
-(IBAction)retriveRepos:(id)sender
{
responseData = [[NSMutableData data] retain];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.github.com/user/repos"]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
Когда вызывается - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
, метод аутентификации возвращается как NSURLAuthenticationMethodServerTrust
(что мне кажется странным, поскольку я чувствую, что должен указать имя пользователя и парольчтобы залогиниться).Согласно документации Apple, мне нужно создать NSURLCredential
с initWithTrust:
.Я гуглил ответы и, наконец, нашел несколько мест, где сказано, что нужно просто взять serverTrust
из protectionSpace
переданного NSURLAuthenticationChallenge
. Выполнение этого не показывает никаких признаков какого-либо эффекта вообще, на самом деле это выглядиткак в моем NSURLCredential
почти ничего нет.
if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
NSLog(@"challenge.protectionSpace.serverTrust: %@", challenge.protectionSpace.serverTrust); // This logs "challenge.protectionSpace.serverTrust: <SecTrust 0x10340b2e0 [0x7fff7cc12ea0]>"
NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:challenge.protectionSpace.serverTrust];
NSLog(@"credential: %@", credential); // Always logs something like "credential: <NSURLCredential: 0x1002d2f20>: (null)"
NSURLCredential *otherCredential = [[NSURLCredential alloc] initWithUser:@"user" password:@"password" persistence:NSURLCredentialPersistencePermanent];
NSLog(@"otherCredential: %@", otherCredential); // This logs otherCredential: <NSURLCredential: 0x1018d0840>: user"
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
Я также использовал более обширное ведение журнала, которое показывало, что credential
действительно существовал (сначала я думал, что он не был создан ввсе) но он не имеет ни одного из своих атрибутов certificates: (null)
hasPassword: 0
identity: (null)
password: (null)
.Я могу только предположить, что проблема в моей аутентификации, но я следовал примерам, которые я нашел к письму.Я использую предварительный просмотр GM Lion, так что, возможно, я обнаружил ошибку или обнаружил какую-то ошибку в GitHub API, но, учитывая мой уровень квалификации, я нахожу гораздо более вероятным, что я идиот, который ищетнад ответом сидит прямо передо мной.Если кто-то знает хорошее руководство, которое на самом деле проведет вас через все этапы аутентификации (желательно во всех стилях), а не строго отсутствующее руководство по загрузке URL-адресов Apple, в котором просто сказано использовать метод, но не сказано, где SecTrustRef
Исходя из этого, будет принята с благодарностью.