iOS не может загружать изображения на сервер в сети Mobile Data/4G, где в Wi-Fi все работает нормально

Я использую задачу загрузки NSURLSesssion для загрузки изображений на сервер, отправляя байты. Он отлично работает в Wi-Fi, но когда я загружаю через сеть MobileData/4G LTE, он показывает код ошибки -1001.

Я старался:

  1. Время ожидания на стороне сервера увеличено до 4 минут.
  2. Пробовал с изображением небольшого размера в килобайтах.

Тем не менее, проблема существует только в сетях 4G LTE.

Примечание. Тот же API сервиса работает и в Android.

Подскажите пожалуйста в чем может быть дело?

NSMutableURLRequest * request = [[NSMutableURLRequest alloc] init];
NSString *boundary = @"---------------------------14737809831466499882746641449";
[request setCachePolicy:cachePolicy];
[self prepareMethod:methodURL methodType:methodType dataInBody:dataInBody contentType:contentType withRequest:request];
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];


NSMutableData * bodyData = [[NSMutableData alloc] init];

params = [[[NSUserDefaults standardUserDefaults]objectForKey:@"userparams"]mutableCopy];

for (NSString *param in params)
{
    if (![param isEqualToString:@"file"]) {
        [bodyData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [bodyData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
        [bodyData appendData:[[NSString stringWithFormat:@"%@\r\n", [params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
    }
}

// add image data
[bodyData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpeg\"\r\n", @"file"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[params objectForKey:@"file"]];
[bodyData appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];


//NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
// sessionConfiguration.timeoutIntervalForRequest = 120.0;
NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionUploadTask* uploadtask = [session uploadTaskWithRequest:request fromData:bodyData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){

  if (!error)
  {
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
      HttpResponse * response = [[HttpResponse alloc] initWithHttpURLResponse:httpResponse withData:data];

      dispatch_async(dispatch_get_main_queue(), ^{
          if ([delegate respondsToSelector:@selector(connectionFinishedLoading:)]) {
              [delegate connectionFinishedLoading:response];
          }
      });

  }
  else
  {
      dispatch_async(dispatch_get_main_queue(), ^{
          if ([delegate respondsToSelector:@selector(connectionFailedWithError:)])
          {
              [delegate connectionFailedWithError:error];
          }
      });
  }


}];
[uploadtask resume];

person mik    schedule 31.07.2018    source источник


Ответы (1)


1001 - это тайм-аут. Это может означать, что у вас плохое сотовое соединение или что ваш тестовый хост недоступен из сотовой сети.

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

Кроме того, загрузка больших файлов по сотовой сети, как правило, является плохой идеей, поскольку спецификация HTTP не поддерживает возобновление загрузки при сбоях в сети. Если загрузка файла в среднем занимает более пяти секунд, вам следует внести изменения на стороне сервера, чтобы вы могли загружать этот файл несколькими фрагментами, а затем собирать его заново.

person dgatwood    schedule 06.08.2018