通过UIActivityViewController将图像/视频共享给其他应用程序,在iOS中显示两次共享项目

Sur*_*ran 6 share objective-c ios uiactivity uiactivityviewcontroller

我正在尝试将一些图像和视频分享到其他应用程序(如FB,WhatsApp)UIActivityViewController.我已经进行了分类UIActivityItemProvider,在调用-(id)item方法时,我正在处理图像/视频并保存在文档目录中.然后我将文件路径返回为NSURLs.我的问题是我无法找到同时发送多个文件URL的方法.

以下是我从 - (id)item方法返回网址的方法;

  1. 作为一个NSArrayNSURL对象.什么都不行.当目标应用程序弹出窗口出现时,它始终为空.
  2. 作为一个NSDictionary,其中NSURL对象是值,键可以是任何东西.问题:目标应用程序弹出窗口显示所有项目,但是TWICE!我经常尝试字典,但找不到解决这个问题的方法.

简单地NSURL-(id)item方法返回一个对象适用于单个文件.但是,我必须分享多个项目.数组不起作用,字典正在复制共享项.

有人可以告诉我这里我做错了什么吗?


更新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:^{}];
Run Code Online (Sandbox Code Playgroud)

UIActivityItemProvider实现如下所示; 网址有效,并且这些位置有图片/视频.

@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
Run Code Online (Sandbox Code Playgroud)

更新2:

相关问题不同.我不想将文件作为参数直接发送到UIActivityViewController initWithActivityItems:.原因是可能存在多个视频文件,这将导致内存警告和崩溃.此外,我将在将文件发送到目标应用程序之前操作文件(在-(id)item方法中,我没有在此处显示),因此我需要UIActivityItemProvider在后台处理文件.

Sur*_*ran 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
Run Code Online (Sandbox Code Playgroud)

干杯!!!