Загрузка больших файлов на 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.