You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ma...@apache.org on 2026/01/13 10:20:35 UTC
(cordova-plugin-camera) 01/01: fix(ios): proper url and error handling for createTmpVideo
This is an automated email from the ASF dual-hosted git repository.
manuelbeck pushed a commit to branch pr-phpicker-fix-video-urls
in repository https://gitbox.apache.org/repos/asf/cordova-plugin-camera.git
commit bb470a4f3bade22bb88e799eb71df47f61fbfae9
Author: Manuel Beck <ma...@outlook.de>
AuthorDate: Tue Jan 13 11:20:19 2026 +0100
fix(ios): proper url and error handling for createTmpVideo
- A user commented that`window.resolveLocalFileSystemURL` will fail when using the uri result for picking a video with PHPicker: https://github.com/apache/cordova-plugin-camera/issues/935#issuecomment-3742776758
- urlTransformer was not used for the copyMoviePath
- Resolve symlinks in the path to ensure consistency with how the File plugin resolves paths
- Report error to webview, if the video file could not successful copied to the temp directory
- Log errors, if something is wrong in `createTmpVideo`
---
src/ios/CDVCamera.m | 51 +++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 43 insertions(+), 8 deletions(-)
diff --git a/src/ios/CDVCamera.m b/src/ios/CDVCamera.m
index d1c417d..8c84a9f 100644
--- a/src/ios/CDVCamera.m
+++ b/src/ios/CDVCamera.m
@@ -396,9 +396,13 @@ static NSString* MIME_JPEG = @"image/jpeg";
// Check if it's a video
if ([pickerResult.itemProvider hasItemConformingToTypeIdentifier:UTTypeMovie.identifier]) {
- [pickerResult.itemProvider loadFileRepresentationForTypeIdentifier:UTTypeMovie.identifier completionHandler:^(NSURL * _Nullable url, NSError * _Nullable error) {
+ // Writes a copy of the data to a temporary file. This file will be deleted
+ // when the completion handler returns. The program should copy or move the file within the completion handler.
+ [pickerResult.itemProvider loadFileRepresentationForTypeIdentifier:UTTypeMovie.identifier
+ completionHandler:^(NSURL * _Nullable url, NSError * _Nullable error) {
if (error) {
- CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:[error localizedDescription]];
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR
+ messageAsString:[error localizedDescription]];
[weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId];
weakSelf.hasPendingOperation = NO;
return;
@@ -406,7 +410,15 @@ static NSString* MIME_JPEG = @"image/jpeg";
dispatch_async(dispatch_get_main_queue(), ^{
NSString* videoPath = [weakSelf createTmpVideo:[url path]];
- CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:videoPath];
+ CDVPluginResult* result = nil;
+
+ if (videoPath == nil) {
+ result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION
+ messageAsString:@"Failed to copy video file to temporary location"];
+ } else {
+ result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:videoPath];
+ }
+
[weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId];
weakSelf.hasPendingOperation = NO;
});
@@ -971,12 +983,35 @@ static NSString* MIME_JPEG = @"image/jpeg";
- (NSString*)createTmpVideo:(NSString*)moviePath
{
- NSString* moviePathExtension = [moviePath pathExtension];
- NSString* copyMoviePath = [self tempFilePath:moviePathExtension];
+ NSString* copyMoviePath = [self tempFilePath:[moviePath pathExtension]];
NSFileManager* fileMgr = [[NSFileManager alloc] init];
- NSError *error;
- [fileMgr copyItemAtPath:moviePath toPath:copyMoviePath error:&error];
- return [[NSURL fileURLWithPath:copyMoviePath] absoluteString];
+ NSError *error = nil;
+
+ // Ensure the source file exists and is accessible
+ if (![fileMgr fileExistsAtPath:moviePath]) {
+ NSLog(@"CDVCamera: Source video file does not exist at path: %@", moviePath);
+ return nil;
+ }
+
+ // Copy the video file to the temp directory
+ BOOL copySuccess = [fileMgr copyItemAtPath:moviePath toPath:copyMoviePath error:&error];
+
+ if (!copySuccess || error) {
+ NSLog(@"CDVCamera: Failed to copy video file from %@ to %@. Error: %@", moviePath, copyMoviePath, [error localizedDescription]);
+ return nil;
+ }
+
+ // Verify the copied file exists
+ if (![fileMgr fileExistsAtPath:copyMoviePath]) {
+ NSLog(@"CDVCamera: Copied video file does not exist at path: %@", copyMoviePath);
+ return nil;
+ }
+
+ // Resolve symlinks in the path to ensure consistency with how the File plugin resolves paths
+ NSString *resolvedPath = [[[NSURL fileURLWithPath:copyMoviePath] URLByResolvingSymlinksInPath] path];
+
+ // Use urlTransformer to get the proper URI for the webview
+ return [[self urlTransformer:[NSURL fileURLWithPath:resolvedPath]] absoluteString];
}
#pragma mark UIImagePickerControllerDelegate methods
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org