diff --git a/ios/VydiaRNFileUploader.m b/ios/VydiaRNFileUploader.m index 86b90831..43369cb9 100644 --- a/ios/VydiaRNFileUploader.m +++ b/ios/VydiaRNFileUploader.m @@ -95,6 +95,36 @@ - (NSString *)guessMIMETypeFromFileName: (NSString *)fileName { return (__bridge NSString *)(MIMEType); } +/* + Utility method to copy a PHAsset file into a local temp file, which can then be uploaded. + */ +- (void)copyAssetToFile: (NSString *)assetUrl completionHandler: (void(^)(NSString *__nullable tempFileUrl, NSError *__nullable error))completionHandler { + NSURL *url = [NSURL URLWithString:assetUrl]; + PHAsset *asset = [PHAsset fetchAssetsWithALAssetURLs:@[url] options:nil].lastObject; + if (!asset) { + NSMutableDictionary* details = [NSMutableDictionary dictionary]; + [details setValue:@"Asset could not be fetched. Are you missing permissions?" forKey:NSLocalizedDescriptionKey]; + completionHandler(nil, [NSError errorWithDomain:@"RNUploader" code:5 userInfo:details]); + return; + } + PHAssetResource *assetResource = [[PHAssetResource assetResourcesForAsset:asset] firstObject]; + NSString *pathToWrite = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]]; + NSURL *pathUrl = [NSURL fileURLWithPath:pathToWrite]; + NSString *fileURI = pathUrl.absoluteString; + + PHAssetResourceRequestOptions *options = [PHAssetResourceRequestOptions new]; + options.networkAccessAllowed = YES; + + [[PHAssetResourceManager defaultManager] writeDataForAssetResource:assetResource toFile:pathUrl options:options completionHandler:^(NSError * _Nullable e) { + if (e == nil) { + completionHandler(fileURI, nil); + } + else { + completionHandler(nil, e); + } + }]; +} + /* * Starts a file upload. * Options are passed in as the first argument as a js hash: @@ -115,7 +145,7 @@ - (NSString *)guessMIMETypeFromFileName: (NSString *)fileName { } NSString *uploadUrl = options[@"url"]; - NSString *fileURI = options[@"path"]; + __block NSString *fileURI = options[@"path"]; NSString *method = options[@"method"] ?: @"POST"; NSString *uploadType = options[@"type"] ?: @"raw"; NSString *fieldName = options[@"field"]; @@ -135,35 +165,21 @@ - (NSString *)guessMIMETypeFromFileName: (NSString *)fileName { } }]; - // asset library files have to be copied over to a temp file. they cannot be uploaded directly - if ([fileURI hasPrefix:@"assets-library"]) { - NSURL *url = [NSURL URLWithString:fileURI]; - PHAsset *asset = [PHAsset fetchAssetsWithALAssetURLs:@[url] options:nil].lastObject; - if (!asset) { - reject(@"RN Uploader", @"Asset could not be fetched. Are you missing permissions?", nil); - return; - } - PHAssetResource *assetResource = [[PHAssetResource assetResourcesForAsset:asset] firstObject]; - NSString *pathToWrite = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]]; - NSURL *pathUrl = [NSURL fileURLWithPath:pathToWrite]; - fileURI = pathUrl.absoluteString; - - PHAssetResourceRequestOptions *options = [PHAssetResourceRequestOptions new]; - options.networkAccessAllowed = YES; + // asset library files have to be copied over to a temp file. they can't be uploaded directly + if ([fileURI hasPrefix:@"assets-library"]) { dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); - - __block NSError *error; - [[PHAssetResourceManager defaultManager] writeDataForAssetResource:assetResource toFile:pathUrl options:options completionHandler:^(NSError * _Nullable e) { - error = e; + [self copyAssetToFile:fileURI completionHandler:^(NSString * _Nullable tempFileUrl, NSError * _Nullable error) { + if (error) { + dispatch_group_leave(group); + reject(@"RN Uploader", @"Asset could not be copied to temp file.", nil); + return; + } + fileURI = tempFileUrl; dispatch_group_leave(group); }]; dispatch_group_wait(group, DISPATCH_TIME_FOREVER); - if (error) { - reject(@"RN Uploader", @"Asset could not be copied.", nil); - return; - } } NSURLSessionDataTask *uploadTask; diff --git a/package.json b/package.json index e914fbc9..e1ad7db0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-background-upload", - "version": "4.2.0", + "version": "4.3.0", "description": "Cross platform http post file uploader with android and iOS background support", "main": "index.js", "scripts": {