2016-07-27 73 views
6

我試圖使用UIActivityViewController將一些圖像和視頻分享給其他應用程序(如FB,WhatsApp)。我有UIActivityItemProvider的子分類,並且在調用-(id)item方法時,我正在處理圖像/視頻並保存在文檔目錄中。然後我將文件路徑返回爲NSURLs。我的問題是,我無法找到同時發送多個文件URL的方法。通過UIActivityViewController在其他應用程序中共享圖像/視頻在iOS中顯示兩次共享項目

下面是我從 - (id)item方法返回url的方法;

  1. 作爲NSArrayNSURL對象。不工作。當目標應用彈出來時,它總是空的。
  2. 作爲NSDictionary,其中NSURL對象是值和鍵可以是任何東西。 PROBLEMATIC:目標應用程序彈出窗口顯示所有項目,但TWICE!我嘗試了很多字典,但是找不到解決這個問題的方法。

簡單地返回NSURL對象-(id)item方法適用於單個文件。但是,我必須分享多個項目。數組不起作用,Dictionary正在複製共享項目。

有人可以告訴我我在做什麼錯嗎?


更新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實現如下:這些網址是有效的,並且在這些位置有圖片/視頻。

@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 

乾杯!

1

與其他應用程序共享圖像: 斯威夫特3代碼 -

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