iOS - Amazon S3 - Сообщение об ошибке: «Сетевое соединение было потеряно», когда дата телефона установлена ​​на определенную дату - PullRequest
3 голосов
/ 22 февраля 2012

Я использую AWS-iOS-SDK-1.1.0 для загрузки файлов в Amazon S3. Также я использую торговый автомат для анонимных токенов Amazon S3.

При попытке загрузить файл на Amazon S3 с моего iPhone появляется следующее сообщение об ошибке.

AmazonServiceRequest didFailWithError:
Ошибка домена = NSURLErrorDomain Code = -1005 «Сетевое соединение потеряно.»
UserInfo = 0x7290 {NSErrorFailingURLStringKey = https: //.....amazonaws.com/img.jpg, NSErrorFailingURLKey = https: //.....amazonaws.com/img.jpg,
NSLocalizedDescription = Сетевое соединение было потеряно.,
NSUnderlyingError = 0x72a4320 "Сетевое соединение потеряно."}

Вот код, который я использую для загрузки на S3

if ([[AmazonClientManager validateCredentials] wasSuccessful]) {       
    s3PutRequest = [[S3PutObjectRequest alloc] initWithKey:[NSString stringWithFormat:@"images/%@.jpg", [user filename]] inBucket:@"bucket"];

    [s3PutRequest setCannedACL:[S3CannedACL publicRead]];        
    [s3PutRequest setFilename:[[self videoURL] path]];
    [s3PutRequest setDelegate:self];

    [[AmazonClientManager s3] putObject:s3PutRequest];
}
else {
    UIAlertView *error = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Unable to Upload the video. Please try again!!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];

    [error show];
}

#pragma mark - Amazon Service Request Delegate Methods

- (void)request:(AmazonServiceRequest *)request didReceiveResponse:(NSURLResponse *)aResponse
{
    NSLog(@"didReceiveResponse : %@", aResponse);
}

- (void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)aResponse
{
    NSLog(@"didCompleteWithResponse : %@", aResponse);
    response = aResponse;

    NSLog(@"HTTP Status Code:%i", response.httpStatusCode);

    if (response.isFinishedLoading && response.httpStatusCode == 200) {
        [self saveFile];
    }
    else {
        [self uploadFailed:[exception reason]];
    }
}

- (void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data
{
    NSLog(@"didReceiveData");
}

- (void)request:(AmazonServiceRequest *)request didSendData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
    float percentWritten = (float)totalBytesWritten/(float)totalBytesExpectedToWrite;
    int percentageWritten = (int)(percentWritten * 100);

    [uploadProgress setProgress:percentWritten];
    [uploadPercentage setText:[NSString stringWithFormat:@"%i%%", percentageWritten]];
}

- (void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)theError
{
    NSLog(@"didFailWithError : %@", theError);
    error = theError;
    [self uploadFailed:[error localizedDescription]];
}

- (void)request:(AmazonServiceRequest *)request didFailWithServiceException:(NSException *)theException
{
    NSLog(@"didFailWithServiceException : %@", theException);
    exception = theException;

    [self uploadFailed:[exception reason]];
}

Я могу воспроизвести эту ошибку, сбросив iPhone на более раннюю дату (пример: 22 августа 2010 г.). Если я верну его к текущей дате, я смогу загрузить файл в Amazon S3.

Как узнать точное сообщение об ошибке?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2014

Как уже упоминалось, Amazon SDK требует, чтобы время клиента и сервера было синхронизировано с максимально допустимой разницей в 15 минут.

Поскольку это не может быть гарантировано на устройстве пользователя, вы можете обойти его с помощью этого (одобренного Amazon) решения: http://mobile.awsblog.com/post/Tx2KKPVXE69XJAO/Managing-Device-Time-with-the-AWS-Mobile-SDKs

2 голосов
/ 17 декабря 2012

Это - то, где AWS SDK терпит неудачу, по моему опыту так или иначе. Есть некоторые проверки, выполненные серверной стороной S3, о которых мы не знаем, одна из них заключается в том, что время UTC на устройстве ДОЛЖНО быть синхронизировано с временем UTC S3. Я не нашел, сколько у вас буферной комнаты, но я знаю, что 1 день - это слишком много.

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

Я знаю, что это не тот ответ, который вы хотели, но это лучшее, что я могу предоставить.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...