iOS code for saving "Open In" file to Documents directory (and resolving duplicate filenames)
First of all you need to set up your "Open In" behaviour by registering the file type UTI. From there follow the commented code.
AppDelegate.m
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// Copy the file into the documents directory, renaming if there's a duplicate
[self copyItemAtURLtoDocumentsDirectory:url];
return YES;
}
-(BOOL)copyItemAtURLtoDocumentsDirectory:(NSURL*)url {
NSError *error;
NSURL *copyToURL = [self applicationDocumentsDirectory];
NSString *fileName = [url lastPathComponent];
// Add requested file name to path
copyToURL = [copyToURL URLByAppendingPathComponent:fileName isDirectory:NO];
if ([[NSFileManager defaultManager] fileExistsAtPath:copyToURL.path]) {
// Duplicate path
NSURL *duplicateURL = copyToURL;
// Remove the filename extension
copyToURL = [copyToURL URLByDeletingPathExtension];
// Filename no extension
NSString *fileNameWithoutExtension = [copyToURL lastPathComponent];
// File extension
NSString *fileExtension = [url pathExtension];
int i=1;
while ([[NSFileManager defaultManager] fileExistsAtPath:duplicateURL.path]) {
// Delete the last path component
copyToURL = [copyToURL URLByDeletingLastPathComponent];
// Update URL with new name
copyToURL=[copyToURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@–%i",fileNameWithoutExtension,i]];
// Add back the file extension
copyToURL =[copyToURL URLByAppendingPathExtension:fileExtension];
// Copy path to duplicate
duplicateURL = copyToURL;
i++;
}
}
BOOL ok = [[NSFileManager defaultManager] moveItemAtURL:url toURL:copyToURL error:&error];
// Feed back any errors
if (error) {
NSLog(@"%@",[error localizedDescription]);
}
return ok;
}
-(NSURL *)applicationDocumentsDirectory {
NSString *documentsDirectory;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if ([paths count] > 0) {
documentsDirectory = [paths objectAtIndex:0];
}
// Important that we use fileURLWithPath and not URLWithString (see NSURL class reference, Apple Developer Site)
return [NSURL fileURLWithPath:documentsDirectory];
}
Currently this places all of the code within the AppDelegate file, which of course probably wouldn't be your choice within a working app, but at least it gets you started.
Written by Anthony Levings
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Ios
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#