Утилита переноса Amazon s3 не работает в фоновом режиме - PullRequest
0 голосов
/ 01 января 2019

Мне нужно загрузить большой файл размером более 4 ГБ на Amazon S3.Amazon SDK дает две возможности загрузки и выгрузки из s3.один - awss3transfermanager, а другой - awss3transferutility.Я на самом деле хочу использовать awss3transferutility, потому что я хочу, чтобы приложение продолжало загружать в фоновом режиме.У awss3transferutility есть две функции uploadFile и другая uploadFileUsingMultiPart.Функция uploadFile на самом деле работает в фоновом режиме, но загрузка начинается с 0 при изменении сети или сбрасывании.По этой причине я в настоящее время использую функцию uploadFileUsingMultiPart, поэтому загрузка не будет перезапущена с 0 при сбое сети.но эта функция uploadFileUsingMultiPart не будет продолжать загрузку в фоновом режиме.В своем последнем выпуске они вводят эту функцию uploadFileUsingMultiPart внутри awstransferutility.поэтому я ожидал, что загрузка будет продолжаться в фоновом режиме при сбое сети, но не будет продолжаться в фоновом режиме.я просто хотел спросить, это ошибка, связанная с SDK, или я делаю что-то не так

это код, который я точно

// в делегате приложения

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler {
    [AWSS3TransferUtility interceptApplication:application
           handleEventsForBackgroundURLSession:identifier
                             completionHandler:completionHandler];
}

// в ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachabilityChanged:)
                                                 name:kReachabilityChangedNotification
                                               object:nil];

    __weak typeof(self) weakSelf = self;
    expression = [AWSS3TransferUtilityMultiPartUploadExpression new];
    expression.progressBlock = ^(AWSS3TransferUtilityMultiPartUploadTask *  task, NSProgress *  progress) {
       typeof(self) newWeakSelf = weakSelf;

       dispatch_async(dispatch_get_main_queue(), ^{
           // Do something e.g. Alert a user for transfer completion.

           NSLog(@"progress value %f",progress.fractionCompleted);
           // On failed uploads, `error` contains the error object.
           newWeakSelf->progressView.progress = progress.fractionCompleted;
       });
   };

   completionHandler = ^(AWSS3TransferUtilityMultiPartUploadTask *task, NSError *error) {
       dispatch_async(dispatch_get_main_queue(), ^{
           NSLog(@"uploading completed ");
       });
   };


   AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-west-1:7a24b199-e4b2-4657-9627-sdfs4ssdff"];
   AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];
   // AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;

   AWSS3TransferUtilityConfiguration *tfConfig = [AWSS3TransferUtilityConfiguration new];
   tfConfig.retryLimit = 5;
   tfConfig.multiPartConcurrencyLimit = [NSNumber numberWithInteger:3];
   [AWSS3TransferUtility registerS3TransferUtilityWithConfiguration:configuration transferUtilityConfiguration:tfConfig forKey:@"transfer-utility-with-advanced-options"];

   transferUtility = [AWSS3TransferUtility S3TransferUtilityForKey:@"transfer-utility-with-advanced-options"];
}

-(void)startUploading {
    NSString *filePath =   [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"];
    NSURL *fileURL =  [NSURL fileURLWithPath:filePath];
    NSString *fileContentTypeStr = @"video/mp4";

    //  NSData *data = [NSData dataWithContentsOfURL:fileURL];
    //  AWSTask *task = [transferUtility uploadDataUsingMultiPart:data bucket:@"sibme-development" key:@"temp/testfilenew/testfile1.mp4" contentType:fileContentTypeStr expression:expression completionHandler:completionHandler ];

    AWSTask *task = [transferUtility uploadFileUsingMultiPart:fileURL bucket:@"development" key:@"temp/testfilenew/testfile.mp4" contentType:fileContentTypeStr expression:expression completionHandler:completionHandler];

    [task continueWithBlock:^id _Nullable(AWSTask * _Nonnull t) {
        if (t.result) {
          self->uplaodTask = t.result;
        }
        return nil;
    }];
}

1 Ответ

0 голосов
/ 26 апреля 2019

Я не эксперт в этом, но я заметил кое-что в вашем коде - Регион корзины:

initWithRegionType: AWSRegion USEast1 identityPoolId: @ "us-west-1 : ...

После того, как в моем коде произошло похожее несоответствие, область корзины и область пула идентификаторов Cognito не совпадали, и это вызывало проблемы. Это может иметь место или не иметь место в вашемкод, но просто добавив немного информации на основе моего опыта.

AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-west-1:7a24b199-e4b2-4657-9627-sdfs4ssdff"];
   AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...