2015-10-03 9 views
1

У меня возникла интересная проблема. Пытаясь загрузить файл в AWS S3, он отлично работает при запуске на симуляторе, а также при запуске на подключенном устройстве (режим DEBUG). Но когда я упаковываю приложение и развертываю его на устройстве, он не работает. Я продолжаю получать «Request Timed Out».AWS S3 Загрузка работает на Simulator, но не на устройстве

Это мой код,

- (void)uploadFileAtPath:(NSString *)filePath completionHandler:(void (^)(NSString *, NSError *))handler { 
    NSString *fileName = [filePath lastPathComponent]; 
    AWSS3GetPreSignedURLRequest *getPreSignedURLRequest = [AWSS3GetPreSignedURLRequest new]; 
    getPreSignedURLRequest.bucket = self.bucketName; 
    getPreSignedURLRequest.key = fileName; 
    getPreSignedURLRequest.HTTPMethod = AWSHTTPMethodPUT; 
    getPreSignedURLRequest.expires = [NSDate dateWithTimeIntervalSinceNow:3600]; 

    NSString *fileContentTypeStr = @"application/zip"; 
    getPreSignedURLRequest.contentType = fileContentTypeStr; 

    [[[AWSS3PreSignedURLBuilder defaultS3PreSignedURLBuilder] getPreSignedURL:getPreSignedURLRequest] 
    continueWithBlock:^id(AWSTask *task) { 

     if (task.error) { 
      NSLog(@"Error: %@",task.error); 
     } else { 

      NSURL *presignedURL = task.result; 

      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:presignedURL]; 
      request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 
      [request setHTTPMethod:@"PUT"]; 
      [request setValue:fileContentTypeStr forHTTPHeaderField:@"Content-Type"]; 
      [request setHTTPBody:[NSData dataWithContentsOfFile:filePath]]; 

      NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
      NSURLSession * session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil]; 

      NSURLSessionDataTask* uploadTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
       if (error) { 
        NSLog(@"URL Session Task Failed: %@", [error localizedDescription]); 
       } 
       else { 
        NSLog(@"URL Session Task Succeeded: HTTP %ld", ((NSHTTPURLResponse*)response).statusCode); 

       } 
       handler([[((NSHTTPURLResponse*)response).URL.absoluteString componentsSeparatedByString:@"?"] firstObject], error); 

      }]; 
      [uploadTask resume]; 
     } 

     return nil; 
    }]; 
} 

И это ошибка я получаю (затемненный чувствительные части) -

Error: The request timed out., 

UserInfo: { 
    NSErrorFailingURLKey = "https://s3.amazonaws.com/bucketname/file-2-10-2015-10-13PM.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIHY7KKHBLYOPMTPA%2F20151003%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20151003T051306Z&X-Amz-Expires=3599&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Signature=504e1f5083116as09dc6a04c3b4152816a8d9e8bccff8f4ea0cbss9fcdc21eac"; 
    NSErrorFailingURLStringKey = "https://s3.amazonaws.com/bucketname/file-2-10-2015-10-13PM.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIHY7KKHBLYOPMTPA%2F20151003%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20151003T051306Z&X-Amz-Expires=3599&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Signature=504e1f5083116as09dc6a04c3b4152816a8d9e8bccff8f4ea0cbss9fcdc21eac"; 
    NSLocalizedDescription = "The request timed out."; 
    NSUnderlyingError = "Error Domain=kCFErrorDomainCFNetwork Code=-1001 \"(null)\" UserInfo={_kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102}"; 
    "_kCFStreamErrorCodeKey" = "-2102"; 
    "_kCFStreamErrorDomainKey" = 4; 
} 

Я понятия не имею, что происходит здесь не так! Помощь очень ценится. Пока устройство подключено к Xcode, я также получил URL-адрес и загрузил файл через cURL. FWIW, это тоже работает!

ответ

1

Через 2 дня я, наконец, нашел проблему! Это было частью кода, который я не опубликовал, но именно так я инициализировал клиент AWS.

AWSStaticCredentialsProvider *cp = [[AWSStaticCredentialsProvider alloc] initWithAccessKey:accesskey secretKey:secretKey]; 
    AWSServiceConfiguration* config = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:cp]; 
    AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = config; 

Теперь, есть еще одна библиотеки, что я использовал, который сделал то же самое, но с разными учетными данными в другое ведро. Поскольку эта другая библиотека вызывается после моего кода, у меня возникли проблемы с загрузкой файла. Теперь почему была ошибка Request Timed Out вместо Invalid Credentials, что-то я еще не обнаружил.

Я изменил код инициализации этого -

AWSStaticCredentialsProvider *cp = [[AWSStaticCredentialsProvider alloc] initWithAccessKey:accesskey secretKey:secretKey]; 
    AWSServiceConfiguration* config = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:cp]; 
    [AWSS3TransferManager registerS3TransferManagerWithConfiguration:config forKey:AWSLogFilesUploaderKey]; 

И получил экземпляр AWSS3TransferManager, как это -

AWSS3TransferManager* tm = [AWSS3TransferManager S3TransferManagerForKey:AWSLogFilesUploaderKey]; 

А потом все прошло гладко!

+0

Благодарим вас за это примечание, вы спасли меня 2 дня. Для меня учетные данныеProvider = AWSStaticCredentialsProvider (accessKey: key, secretKey: secret); пусть конфигурация = AWSServiceConfiguration (регион: .Region, credentialsProvider: credentialsProvider); AWSServiceManager.defaultServiceManager(). DefaultServiceConfiguration = настройка работает тоже – George

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