6

Я пытаюсь поделиться некоторыми изображениями и видеороликами с другими приложениями (например, FB, WhatsApp), используя UIActivityViewController. У меня есть подклассы UIActivityItemProvider, а при вызове методов -(id)item я обрабатываю файлы изображений/видео и сохраняю их в каталоге. Затем я возвращаю пути к файлам как NSURLs. Моя проблема в том, что Я не могу найти способ отправки нескольких URL-адресов файлов одновременно.Обмен изображениями/видео в других приложениях через UIActivityViewController показывает общие элементы дважды в iOS

Ниже приведены подходы, которые я предпринял для возврата URL-адресов из метода (id);

  1. NSArrayNSURL объектов. НЕ РАБОТАЕТ. Когда появляется всплывающее окно целевого приложения, оно всегда пустое.
  2. В качестве NSDictionary, в котором NSURL объекты являются значениями и ключами, может быть что угодно. ПРОБЛЕМАТИКА: всплывающее окно целевого приложения показывает все элементы, но ДВАЖДЫ! Я много экспериментировал со словарем, но не смог найти способ решить эту проблему.

Просто возвращающий объект NSURL от -(id)item Метод работает отлично для одного файла. Но я должен поделиться несколькими пунктами. Массив не работает, Словарь дублирует общие элементы.

Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю неправильно?


UPDATE 1:

Это, как я показываю UIActivityViewController.

CustomItemProvider *provider = [[CustomItemProvider alloc] initWithPlaceholderItem:[UIImage imageNamed:@"ios-59.png"]]; 

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[provider] applicationActivities:nil]; 

activityViewController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) 
{ 
    if(completed) 
    { 
     NSLog(@"Activity Completed"); 
    } 
    else 
    { 
     NSLog(@"Activity Cancelled"); 
    } 
}; 
[self presentViewController:activityViewController animated:YES completion:^{}]; 

Реализация UIActivityItemProvider приведена ниже; URL-адреса действительны, и в этих местах есть изображения/видео.

@interface CustomItemProvider : UIActivityItemProvider 

@end 

@implementation CustomItemProvider 
- (id)item 
{ 
    NSURL *url1 = [NSURL fileURLWithPath:@"file one url"]; 
    NSURL *url2 = [NSURL fileURLWithPath:@"file two url"]; 
    NSURL *url3 = [NSURL fileURLWithPath:@"file three url"]; 

    return @{@"item1":url1, @"item2":url2, @"item3":url3}; //As NSDictionary. This causes 6 items to be shared; all files twice. 

    //return @[url1, url2, url3]; //As NSArray 
} 
@end 

ОБНОВЛЕНИЕ 2:

Связанный вопрос отличается. Я не хочу отправлять файлы непосредственно в UIActivityViewController как параметр в initWithActivityItems:. Причина в том, что могут быть несколько видеофайлов, которые будут вызывать предупреждение о памяти и сбои. Кроме того, я буду манипулировать файлами перед отправкой в ​​целевое приложение (в методе -(id)item, который я здесь не показывал), поэтому мне нужно UIActivityItemProvider для обработки файлов в фоновом режиме.

+1

Это трудно догадаться, не видя, что вы на самом деле делаете. Как выглядит код ошибки? –

+1

@PhillipMills, я отредактировал вопрос и добавил метод. – Suran

+1

Возможный дубликат [Как разделить несколько файлов через UIDocumentInteractionController?] (Http://stackoverflow.com/questions/27655722/how-to-share-multiple-file-via-uidocumentinteractioncontroller) –

ответ

0

ОБНОВЛЕНИЕ: Этот подход был совершенно неправильным и приведет к неожиданным результатам в некоторых сценариях. Извините, если этот ответ вводит кого-то в заблуждение.

Правильный подход заключается в создании одного объекта UIActivityItemProvider для каждого совместно используемого элемента. И верните элемент, который будет использоваться совместно с соответствующим объектом-провайдером. Извините, что я не мог обновить этот ответ раньше.

Добрый день, всем!


Хорошо, наконец, я понял.Это сводило меня с ума, и я не мог найти ни одной надлежащей документации/ответов.

Решение должно было вернуть словарь с объектами NSItemProvider в качестве значений. Ключами для них могут быть все, что не так, как другие клавиши.

Если кто-то после этой же проблемы найдет решение ниже;

@interface CustomItemProvider : UIActivityItemProvider 
{ 
    NSCondition *_condition; 
    NSArray *_filesToShare; 
} 
@end 

@implementation CustomItemProvider 
- (id)item 
{ 
    _fetchInProgress = YES; 
    //Here start fetching/processing videos/photos in ANOTHER THREAD. Once the fetching/processing is complete, set the value of _fetchInProgress to NO. 

    //If you want to show progress, display progress view in MAIN THREAD here. 

    [_condition lock]; 
    while(_fetchInProgress) 
    { 
     [_condition wait]; 
    } 
    [_condition unlock]; 

    //Here I am assuming that the files are processed and are saved to documents/cache directory and their file-paths are in _filesToShare array. 

    NSMutableDictionary *itemsDict = [NSMutableDictionary dictionaryWithCapacity:[_filesToShare count]]; 
    for (int i = 0; i < [_filesToShare count]; i++) 
    { 
     NSURL *url = [NSURL fileURLWithPath:[_filesToShare objectAtIndex:i]]; 
     NSItemProvider *item = [[NSItemProvider alloc] initWithContentsOfURL:url]; 
     [itemsDict setObject:item forKey:@(i)]; 
    } 

    return itemsDict; 
} 
@end 

Cheers !!!

1

Share изображения с другими приложениями: Swift 3 код-

let image = UIImage(named: "yourimage") 
    let objectsToShare = [image] 
    let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) 
    present(activityVC, animated: true, completion: nil)