Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Document directory path change when rebuild application

Tags:

I download the video file from url and save it in document directory with this path:

  let destination: DownloadRequest.DownloadFileDestination = { _, _ in       let pathComponent = "pack\(self.packID)-\(selectRow + 1).mp4"       let directoryURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]       let folderPath: URL = directoryURL.appendingPathComponent("Downloads", isDirectory: true)       let fileURL: URL = folderPath.appendingPathComponent(pathComponent)       return (fileURL, [.removePreviousFile, .createIntermediateDirectories])     } 

my video is downloaded and plays successfully. but there is a problem, when I rebuild application in Xcode and try to play the last video that I downloaded, video is not shown, and when I download a new video this save and play successfully.

I've seen each video bundle path, they are different.

1 - file:///Users/myMac/Library/Developer/CoreSimulator/Devices/EAC2F4CE-EA09-46C0-B403-1CE9E24B6822/data/Containers/Data/Application/1D2C1F7B-E627-4898-91C1-D0AF8D5E0F1E/Documents/Downloads/pack7-1.mp4

2 - file:///Users/myMac/Library/Developer/CoreSimulator/Devices/EAC2F4CE-EA09-46C0-B403-1CE9E24B6822/data/Containers/Data/Application/F950E9A5-C9F3-4B8C-BCF5-647EEC233CEE/Documents/Downloads/pack7-3.mp4

Now, my question is, when we update the app from the App Store, it means a reinstallation? Does this path change?

how can solve this problem?

like image 373
ava Avatar asked Dec 18 '17 07:12

ava


2 Answers

iOS 8 onwards, Absolute url to app's sandbox changes every time you relaunch the app. Hence you should never save the absolute url of the video. Save the name of the video and recreate the url every time you relaunch the app.

  let pathComponent = "pack\(self.packID)-\(selectRow + 1).mp4"   let directoryURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]   let folderPath: URL = directoryURL.appendingPathComponent("Downloads", isDirectory: true)   let fileURL: URL = folderPath.appendingPathComponent(pathComponent) 

Once you have fileURL look for the file and you will find the file downloaded in previous launch.

iOS creates a new Sandbox for app every time user launches the app. Hence absolute URL will very. But iOS will take care of setting up all the folders and contents inside the Sandbox as it was earlier. So though base url of SandBox change, relative url's of all the content will be remained intact.

Hence its advised never to save absolute url to any folder :) Hope it helps

like image 67
Sandeep Bhandari Avatar answered Oct 30 '22 21:10

Sandeep Bhandari


I suggest using a bookmark. Check out the section Locating Files Using Bookmarks in the following article: https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3

Edit:

Some relevant parts of the linked document, just in case:

Important: Although they are safe to use while your app is running, file reference URLs are not safe to store and reuse between launches of your app because a file’s ID may change if the system is rebooted. If you want to store the location of a file persistently between launches of your app, create a bookmark as described in Locating Files Using Bookmarks.

I've an app that uses a lot of file handling so I've created the following method in an NSURL category to return bookmark data for a given URL.

- (NSData*)defaultBookmark {     NSError* error = nil;     NSData* bookmarkData =  [self bookmarkDataWithOptions:NSURLBookmarkCreationSuitableForBookmarkFile                            includingResourceValuesForKeys:nil                                             relativeToURL:nil                                                     error:&error];     if (error != nil)     {         NSLog(@"error creating bookmark for url '%@': %@", self, error);     }     return bookmarkData; } 

To create a NSURL object from bookmark data use something like:

    NSError* error = nil;     BOOL isStale = NO;     NSURL* url = [NSURL URLByResolvingBookmarkData:bookmarkData                                            options:NSURLBookmarkResolutionWithoutUI                                      relativeToURL:nil                                bookmarkDataIsStale:&isStale                                              error:&error];     if (error != nil || url == nil)     {         NSLog(@"Error restoring url from bookmark: %@", error);     }     else     {         // use url to load file         ...     } 
like image 42
D. Mika Avatar answered Oct 30 '22 19:10

D. Mika