Загрузка больших файлов на iOS с помощью AFNetworking - ошибка Время ожидания запроса

Я сталкиваюсь со следующей проблемой. В моем проекте я использую AFNetworking для всех сетевых операций. Одним из них является загрузка видео на сервер. Затем я пытаюсь загрузить большое видео (около 100 Мб), я получаю сообщение об ошибке тайм-аута запроса.

Ошибка домена =NSURLErrorDomain Code=-1001 "Время ожидания истекло". UserInfo = 0x15641b30
{NSErrorFailingURLStringKey = http://server.name/path, NSErrorFailingURLKey = http://server.name/path, NSLocalizedDescription = Время ожидания истекло. NSUnderlyingError=0x16f7a000 "Время ожидания истекло."}

Сейчас я использую AFNetworking v1.3.3, и я не могу использовать v2.0, потому что требуется поддержка iOS5.

Когда загрузка только начинается, прогресс загрузки выглядит нормально (я вижу это через UploadProgressBlock). Но через несколько мегабайт загрузка начинает замедляться, а затем останавливается. SpeedTest дает мне 5 Мбит / с для загрузки и 5 Мбит / с для загрузки.

Загрузка видео через веб-браузер работает нормально, поэтому я не думаю, что это проблема сервера.

Вот мой код:

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL: 
            [NSURL URLWithString:@"http://server.name/"]];
NSString *appid = [[self class] sharedProvider].ApplicationId;

ALAssetRepresentation *representaion =
             [videoData.videoAsset defaultRepresentation];
NSURL *url =
 [BRDataProvider getVideoAssetURLForTempFileWithAsset:
                                 videoData.videoAsset];

AFHTTPRequestOperation *operation;

if (url) {
NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" 
    path:@"some/path" parameters:nil

constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

  NSData *hdnADCID = [appid dataUsingEncoding:NSUTF8StringEncoding];
     [formData appendPartWithFormData:hdnADCID name:@"hdnADCID"];
    NSData *txtTitle =
         [videoData.title dataUsingEncoding:NSUTF8StringEncoding];

 [formData appendPartWithFormData:txtTitle name:@"txtTitle"];

      NSData *txtDescription =
             [videoData.description dataUsingEncoding:NSUTF8StringEncoding];
    [formData appendPartWithFormData:txtDescription name:@"txtDescription"];

  NSData *txtKeywords =
       [videoData.tags dataUsingEncoding:NSUTF8StringEncoding];
    [formData appendPartWithFormData:txtKeywords name:@"txtKeywords"];
       [formData
     appendPartWithFileURL:url name:representaion.filename error:nil];
 }];
[request setTimeoutInterval:600];
operation = [fliqzClient HTTPRequestOperationWithRequest:request
   success:^(AFHTTPRequestOperation *operation, id responseObject) {

  [[NSFileManager defaultManager] removeItemAtURL:url error:nil];

   NSString *assetID = [operation.responseString
 stringByReplacingOccurrencesOfString:@"&\r\n" withString:@""];
       assetID = [assetID stringByReplacingOccurrencesOfString:@"id=
                           " withString:@""];
       videoData.assetId = assetID;
       [BRDataProvider registerVideoWithInfo:videoData completion:^(id result,
              NSError *error) {
          block(result,error);
           }];
         } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

               NSLog(@"error - %@", error);

                block(nil,error);
    [[NSFileManager defaultManager] removeItemAtURL:url error:nil];
                                                 }];

[operation setUploadProgressBlock:^(NSUInteger bytesWritten,
long long totalBytesWritten, long long totalBytesExpectedToWrite) {
   NSLog(@"bytesWritten - %d, totalBytesWritten - %lld,
     totalBytesExpectedToWrite - %lld", bytesWritten,
           totalBytesWritten, totalBytesExpectedToWrite);
}];
[client enqueueHTTPRequestOperation:operation];
} else {
NSError *error = [NSError errorWithDomain:kBRErrorDomainOwnDomain
                                     code:0



 userInfo:@{NSLocalizedDescriptionKey:kPreprocessingErrorUploadVideoMessage}];
    block(nil, error);
    }

Может кто знает способ как это исправить? Спасибо за вашу помощь!

1 ответ

У меня была похожая проблема с AFNetworking: NSURLErrorDomain Code=-1001 "Время ожидания истекло". При получении с внешнего сервера, когда устройство находится в подсети с маршрутизатором, подключенным к глобальной сети, запрос работает отлично (192.168.1.0 подсеть-1 -> WAN). Однако, если он подключен к подсети, которая подключена к маршрутизатору, подключенному к WAN, запрос завершится неудачно с приведенным выше сообщением (192.168.0.0 subnet-2 -> 192.168.1.0 subnet-1 -> WAN). Все операции браузера работают нормально через подсеть-2, AFNetworking, кажется, соединяется, но получает тайм-аут. Я подозреваю, что проблема заключается в конфигурации маршрутизатора подсети-2.

Другие вопросы по тегам