(IOS) Cordova Camera Plugin Referring to deleted i

2019-07-08 09:32发布

问题:

I'm building a cordova app (primarily for IOS & Android) in which the user can take an image, retake (, etc.) it and save it locally.

I'm currently struggling with the cordova cameraPlugin. So, here a short description of the problem.

When the user takes an image, it's saved locally in the apps temp folder and the user is able to view in in the UIWebView. On retaking, the image will be deleted from the temp folder and should not be available any longer (in RAM and local FS). It works as long as the user doesn't retakes the image 2 or more times, if he does instead of the last image the first image will be referenced/rendered in WebView. After reopening the app, the image is displayed correctly.

An Example:

  1. The user takes the first image. ==> cdv_photo_001.png
  2. The second. ==> cdv_photo_002.png and the first one will be deleted (which seems to work correctly)
  3. And the third. ==> cdv_photo_001.png and the second image will be deleted.

The third image will look the same as the deleted first one. This happens with every image after the third one. It works fine after restarting the app

I've already tried to disable the App-Cache, delete the app cache before updating the image, refreshing the page and looking for answers online.

I'm getting an error when opening the camera UI, but I could not find a solution for it either.

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

The code for the camera Call:

function getPhoto() {
    navigator.camera.getPicture(getPhotoOnSuccess, getPhotoOnFail, {
        quality: 25,
        destinationType: Camera.DestinationType.FILE_URL,
        correctOrientation: true,
        encodingType: Camera.EncodingType.PNG
    });
}

In getPhotoOnSuccess I'm basically saving the image path to a db and appending it with jQuery to the view.

And the code to delete the image: (sidenote I`m new to Objective C)

- (void) deleteImageByPath:(NSString *)imagePath withSelector:(SEL)selector{
    NSError *error = nil;
    NSFileManager *mgr = [NSFileManager defaultManager];
    NSString *tempFolder = NSTemporaryDirectory();

    if([mgr removeItemAtPath: imagePath error:&error] == NO) {
        NSLog(@"File deleted");
    }

    //The files can be edited as well, so there can be two files in different directories
    if(error != nil){    
        NSString *imgEl = tempFolder;
        imgEl = [imgEl stringByAppendingPathComponent:imagePath.lastPathComponent];
        if(![mgr removeItemAtPath:imgEl error:&error]){
            NSLog(@"Old element couln't be deleted.");
        }
    }

    [self performSelector:selector withObject:error];
}

The file is not in the directory anymore after deleting it, so I guess it works. An important detail could be, that I wrote my own IOS cordova plugin, because the method for the file system access provided by cordova sucks.

So thats it. The specific question is: Why and how is this happening and is there a chance to change this behavior? If yes, how should I proceed?

By the way, I`m using cordova 3.1.0 and the build target is IOS 7.

Thanks in advance.

回答1:

Ok folks, I finally got it.

The whole problem was not related to my code or any of the cordova code. So why did it happen? ==> I don't exactly know that, for it seems that this bug or whatever you might call it, has occurred to many people.

And they all tried to delete or deactivate the cache as I did, some of their problems are very close to my own but most aren't, so it took a while til I found a solution.

I read this thread and tried to append a timestamp to the image path and it worked! My conclusion to this it, that there might be a problem with the UIWebView and the cache management.
Or it might proof as a general WebView problem, I will be able to check that in a few days on an Adroid device.