2016-07-27 10 views
6

में साझा वस्तुओं को दो बार दिखाता है। मैं UIActivityViewController का उपयोग करके अन्य ऐप्स (जैसे एफबी, व्हाट्सएप) पर कुछ छवियों और वीडियो साझा करने की कोशिश कर रहा हूं। मेरे पास उप-वर्गीकृत UIActivityItemProvider है, और -(id)item विधियों को कॉल करने पर, मैं छवियों/वीडियो को संसाधित कर रहा हूं और दस्तावेज़ निर्देशिका में सहेज रहा हूं। फिर मैं फ़ाइल पथ को NSURLs के रूप में वापस कर रहा हूं। मेरी समस्या यह है कि मैं एक ही समय में एकाधिक फ़ाइल यूआरएल भेजने का कोई तरीका नहीं ढूंढ पा रहा हूं।UIActivityViewController के माध्यम से अन्य ऐप्स में छवियों/वीडियो साझा करना आईओएस

नीचे दिए गए दृष्टिकोण हैं - मैंने (आईडी) आइटम विधि से यूआरएल वापस करने के लिए किए गए दृष्टिकोण;

  1. NSURL वस्तुओं के NSArray के रूप में। काम नहीं करता। जब लक्ष्य ऐप पॉपअप आता है, तो यह हमेशा खाली होता है।
  2. NSDictionary के रूप में, जिसमें NSURL ऑब्जेक्ट्स मान हैं और चाबियाँ कुछ भी हो सकती हैं। समस्या: लक्ष्य ऐप पॉपअप सभी आइटम दिखाता है, लेकिन TWICE! मैंने शब्दकोश के साथ बहुत प्रयोग किया, लेकिन इसे हल करने का कोई तरीका नहीं मिला।

से NSURL ऑब्जेक्ट को केवल एक फ़ाइल के लिए ठीक काम करता है। लेकिन, मुझे कई आइटम साझा करना है। ऐरे काम नहीं करता है, शब्दकोश साझा वस्तुओं को डुप्लिकेट कर रहा है।

कोई मुझे बता सकते हैं मैं गलत यहाँ क्या कर रहा हूँ?


अद्यतन 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

@ फिलिप मिल्स, मैंने प्रश्न संपादित किया है और विधि को जोड़ा है। – 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 code-

let image = UIImage(named: "yourimage") 
    let objectsToShare = [image] 
    let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) 
    present(activityVC, animated: true, completion: nil) 
संबंधित मुद्दे