Как переместить файл из папки "Входящие" при использовании Airdrop между устройствами iOS

Я успешно отправляю файл базы данных между устройствами 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 на принимающее устройство. Тем не менее, базы данных хранятся в папке Documents/Inbox (я предполагаю, что это дизайн). Я просто хочу переместить полученные файлы базы данных из папки "Входящие" на один уровень вверх в папку "Документы". Из того, что я читаю, мне нужно разобраться с этим в openURL в App Delegate - но я не уверен, как это сделать. Любая помощь будет принята с благодарностью.

Спасибо.

1 ответ

Хорошо - вот что я сделал, чтобы решить проблему.

(1) Я создал метод handleInboxItems в делегате приложения.

-(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 в делегате приложения на случай, если что-нибудь застрянет в папке входящих при запуске.

(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;}

Вот и все - работает так, как мне нужно.

Другие вопросы по тегам