2017-02-14 7 views
0

Я успешно отправкой файла базы данных между устройствами IOS с помощью следующего кода:Как переместить файл Out Of папки Входящие При использовании десантного между IOS устройствами

-(void) doSendDatabase { 
UIView *viewTemp = [[UIView alloc] init]; 
viewTemp.frame = CGRectMake(0.0f, 0.0f, 300, 300); 

NSString *currentDatabaseName; 

// This is the full path and file name with ext 
currentDatabaseName = [self.databases objectAtIndex:[[mainTableView indexPathForSelectedRow] row]]; 

NSURL *url = [[NSURL alloc] initFileURLWithPath:currentDatabaseName]; 

UIActivityViewController * airDrop = [[UIActivityViewController alloc] 
             initWithActivityItems:@[url] 
             applicationActivities:nil];  

airDrop.popoverPresentationController.sourceView = self.view; 

[self presentViewController:airDrop 
        animated:YES 
       completion:nil]; 

[url release]; 
[airDrop release]; 
[viewTemp release];} 

Этого код работает и база данных успешно отправлены от отправляющее устройство iOS на принимающее устройство. Однако базы данных хранятся в папке «Документы/Входящие» (по дизайну, я полагаю). Я просто хочу перенести полученные файлы базы данных из папки «Входящие» на один уровень в папку «Документы». Из того, что я читаю, мне нужно обработать это в openURL в App Delegate, но я не уверен, как это сделать. Любая помощь будет принята с благодарностью.

спасибо.

ответ

1

ОК - вот что я сделал для решения проблемы.

(1) Я создал метод handleInboxItems в App Delegate.

-(bool) handleInboxItems { 
bool success = YES; 
// Get the DBAccess object 
DBAccess *dbAccess = [[DBAccess alloc] init]; 
// Get the Func object 
Func *funcObject = [[Func alloc] init]; 

NSMutableArray *docDatabases; 
// get a list of all database files in the Documents/Inbox folder ans store them in the inboxDatabases array 
NSMutableArray *inboxDatabases = [[NSMutableArray alloc] init]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *inboxDirectory = [documentsDirectory stringByAppendingPathComponent:@"Inbox"]; 
NSDirectoryEnumerator *directoryEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:inboxDirectory]; 
for (NSString *inboxFileAndPath in directoryEnumerator) 
{ 
    //check to see if any of the files in the inbox folder end in the database extension - if so then save it in the inboxDatabases array 
    if ([[inboxFileAndPath pathExtension] isEqualToString:@“dbext”]) 
    { 
     [inboxDatabases addObject:[inboxDirectory stringByAppendingPathComponent:inboxFileAndPath]]; 
    } 
} 

// now go through the inboxDatabases array and copy them from the Documents/Inbox folder to the Documents folder 

// loop through all inbox database and see if any of the database names already exist in Documents - if so then we need to tack on a sequential number 
for (NSString *inboxDatabaseFileAndPath in inboxDatabases) 
{ 
    NSString *inboxDatabaseName = [[inboxDatabaseFileAndPath lastPathComponent] stringByDeletingPathExtension]; 

    // Get the databases array from the DBAccess class (from the Documents folder) - need to get each time since we are moving files in there 
    docDatabases = [dbAccess getAllDatabases]; 

    // does the inbox database already exist in the documents folder? 
    NSUInteger arrayIndex = [docDatabases indexOfObject:[funcObject databaseNameToFullPathName:allTrim(inboxDatabaseName)]]; 

    int i = 0; 
    while (arrayIndex != NSNotFound) 
    { 
     ++i; 
     NSString *tempDatabaseName = [NSString stringWithFormat:[inboxDatabaseName stringByAppendingString:@" %d"],i]; 

     // see if the database (with sequential number) already exists 
     arrayIndex = [docDatabases indexOfObject:[funcObject databaseNameToFullPathName:allTrim(tempDatabaseName)]]; 
     if (arrayIndex == NSNotFound) 
     { 
      // it does not exist, we can use this name 
      inboxDatabaseName = tempDatabaseName; 
     } 
    } 
    // give it full path and extension 
    NSString *docDatabaseFileAndPathToWrite = [funcObject databaseNameToFullPathName:allTrim(inboxDatabaseName)]; 
    NSError *error; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    success = [fileManager copyItemAtPath:inboxDatabaseFileAndPath toPath:docDatabaseFileAndPathToWrite error:&error]; 
    if (success) 
    { 
     // delete the inbox database file 
     success = [fileManager removeItemAtPath:inboxDatabaseFileAndPath error:&error]; 
     if (!success) 
     { 
      NSAssert1(0,@"Failed to delete inbox database:'%@'.",[error localizedDescription]); 
     }  
    } 
    else 
    { 
     NSAssert1(0,@"Failed to copy inbox database to documents folder:'%@'.",[error localizedDescription]); 
    } 
} 

[dbAccess release]; 
[funcObject release]; 
[inboxDatabases release]; 

return success;} 

(2) Добавлен вызов на этот новый метод в didFinishLaunchingWithOptions в App делегатом только в случае, если есть что-то застрял в почтовом ящике при запуске.

(3) Я добавил метод openURL к делегату приложения, чтобы вызвать handleInboxItems. После этого я отправлю уведомление, чтобы обновить список своей базы данных.

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ 
bool success = [self handleInboxItems]; 

if (success) 
    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIF_DATABASE_AIRDROPPED object:self]; 

return success;} 

Всё, что нужно, работает.