2015-08-06 2 views
0

Я пытаюсь загрузить изображение на сервер, используя NSURLSession со следующим кодомРазличие в NSURLSession между прошивкой 8 и прошивкой 7 и проблемами

NSString *key = [NSString stringWithFormat:@"Key-value"]; 
NSString *boundary = @"----WebKitFormBoundarycC4YiaUFwM44F6rT"; 

NSString *url = [NSURL URLWithString:@"photos/" relativeToURL:"full-url"]  
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:key forHTTPHeaderField:@"Authorization"]; 
NSString *contentTypeString = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[request setValue:contentTypeString forHTTPHeaderField:@"Content-Type"]; 

NSURLSession *session = [MYUploadManager sharedInstance].session; 
NSURL *fullPath = [NSURL fileURLWithPath:photo.bodyRequestPath]]; 

NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:fullPath]; 
[uploadTask resume]; 

Это работает безупречно на прошивке 8, но, к сожалению, не представляется для работы с iOS 7.
Глядя на делегатов NSURLSession, я вижу, что задача URLSession: task: didReceiveChallenge вызывается, когда она запускается на iOS 7 до того, как загрузка застряла, но я не могу получить полезную информацию из ее значений.

В чем может быть проблема?

ответ

0

Мое первое предположение (без просмотра исходного URL) заключалось в том, что сертификат вашего сервера находится в сертификате, который не поддерживался iOS 7. Если это так, либо переключитесь на другого поставщика сертификатов, либо выполните обработчик вызова, который выполняет проверку, используя альтернативный набор доверенных сертификатов привязки (идеально скомпилированный в двоичный файл приложения как необработанную строку, но более реалистично загруженный из файла в вашем приложении расслоение).

Смотрите следующие документы для получения дополнительной информации:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/AuthenticationChallenges.html

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html#//apple_ref/doc/uid/TP40012544

При этом сказал, когда я посмотрел на вопрос во второй раз, то сигналом тревоги. Заголовок авторизации не является чем-то, что вы должны изменить, по нескольким причинам:

  • iOS, по-видимому, сбрасывает заголовок авторизации для URL-адресов, не заканчивающихся на косую черту.
  • Система загрузки URL-адресов создает заголовки авторизации и не обязательно проверяет, указали ли вы ее сами.

Из документов для SetValue: forHTTPHeaderField: классы

Класс, NSURLConnection и NSURLSession предназначены для обрабатывать различные аспекты протокола HTTP для вас. В результате, вы не должны изменять следующие заголовки:

Авторизация

Подключение

Хост

WWW-Authenticate

Поэтому в основном вы должны использовать не- зарезервированный заголовок, например X-Auth-Token, вместо заголовка Authorization, который имеет определенное значение в стандарте HTTP и что ваш код сильно нарушает среди прочего, не включая метод аутентификации.

Смежные вопросы