ऐप

2015-10-16 9 views
5

पर शेयर एक्सटेंशन द्वारा पारित छवि फॉर्म यूआरएल कैसे प्राप्त करें मैं शेयर एक्सटेंशन का उपयोग करके गैलरी से छवियों की सरणी साझा करने पर काम कर रहा हूं। मैंऐप

- (void)getImageFromExtension:(NSExtensionItem *)extensionItem 
{ 
    for(NSItemProvider *attachment in extensionItem.attachments) 
    { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      if([attachment hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) 
      { 
       [attachment loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) { 
        NSURL *image = (NSURL *)item; 
        if(error) 
        { 
         NSLog(@"Error retrieving image"); 
        } else { 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          NSLog(@"*** ### %@",[UIImage imageWithData:[NSData dataWithContentsOfURL:image]]); 
         }); 
        } 
       }]; 
      } 
     }); 
    } 
} 

का उपयोग कर क्या मैं वास्तव में मैं कंटेनर applciation करने के लिए छवि यूआरएल पारित करने के लिए की जरूरत है, है की जरूरत है शेयर विस्तार के अंदर छवि प्राप्त कर सकते हैं। लेकिन उस यूआरएल से छवि प्राप्त करने में सक्षम नहीं है। यूआरएल प्रारूप file:///var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG

इस यूआरएल का डेटा हमेशा शून्य है। इस यूआरएल से छवि कैसे प्राप्त करें?

उत्तर

3

आप शायद didSelectPost से getImageFromExtension पर कॉल करें। didSelectPost के अंत में आपको होस्ट आइटम को परिणाम आइटम की सरणी के साथ ऐप एक्सटेंशन अनुरोध को पूरा करने के लिए completeRequestReturningItems:completionHandler: पर कॉल करना होगा। जब उस विधि को संपूर्ण ShareViewController कहा जाता है तो उसे खारिज कर दिया जाता है और हटा दिया जाता है। जब आप didSelectPost के अंत में इसे कॉल करते हैं, तो NSItemProvider छवि URL पुनर्प्राप्त करने से पहले इसे निष्पादित किया जाता है। क्योंकि यह असीमित रूप से होता है। इसे ठीक करने के लिए आपको completeRequestReturningItems:completionHandler: पर कॉल करना होगा NSItemProvider ने imageURL को पुनर्प्राप्त कर लिया है।

यहाँ यह कैसे काम करना चाहिए है:

- (void)didSelectPost { 
    NSString *typeIdentifier = (NSString *)kUTTypeImage 
    NSExtensionItem *item = self.extensionContext.inputItems.firstObject; 
    NSItemProvider *itemProvider = item.attachments.firstObject; 
    if ([itemProvider hasItemConformingToTypeIdentifier:typeIdentifier]) { 
     [itemProvider loadItemForTypeIdentifier:typeIdentifier 
             options:nil 
           completionHandler:^(NSURL *url, NSError *error) { 
            NSURL *imageURL = (NSURL *)item 
            self.saveImage(imageURL) 
            [self.extensionContext completeRequestReturningItems:@[]   
                    completionHandler:nil]; 
           }]; 
    } 
} 

वैसे, वहाँ जब NSItemProvider के साथ काम कर के रूप में पहले से ही प्रदाता एसिंक्रोनस रूप से अपने काम कर रही है dispatch_async उपयोग करने की आवश्यकता है।

मैंने इसके बारे में blog post लिखा है, यदि आप इसके बारे में कुछ और पढ़ना चाहते हैं।

संपादित

अब आप फ़ाइल पथ है कि आप बस को पुनः प्राप्त करने के साथ छवि को लोड कर सकते हैं। यह केवल विस्तार में ही काम करता है! यदि आप उस ऐप से छवि तक पहुंचना चाहते हैं तो आप उस फ़ाइल यूआरएल का उपयोग नहीं कर सकते जिसे आपने अभी पुनर्प्राप्त किया है। शेयर एक्सटेंशन चयनित छवि को उस फ़ोल्डर में सहेजता है जो युक्त ऐप द्वारा उपलब्ध नहीं है।

छवि को युक्त ऐप पर उपलब्ध कराने के लिए आपको ऐप और एक्सटेंशन वाले App Groups को सक्रिय करना होगा। फिर विस्तार साझा कंटेनर के लिए छवि बचाता है और युक्त एप्लिकेशन इसे पुनः प्राप्त कर सकते हैं:

func saveImage(url: NSURL) { 
    guard let imageData = NSData(contentsOfURL: url) else { return } 
    let selectedImage = UIImage(data: imageData) 

    let fileManager = NSFileManager.defaultManager() 
    if let sharedContainer = fileManager.containerURLForSecurityApplicationGroupIdentifier("YOUR_GROUP_IDENTIFIER") { 
     if let dirPath = sharedContainer.path { 
      let sharedImageFilePath = dirPath + "/image.png" 
      let binaryImageData = UIImagePNGRepresentation(selectedImage!) 
      binaryImageData?.writeToFile(sharedImageFilePath, atomically: true) 
      // send the sharedImageFilePath to the containing app 
     } 
    } 
} 
+0

धन्यवाद @joren, im एक सवाल, क्यों यूआरएल (शेयर विस्तार में उत्पन्न) 'फ़ाइल होने: /// var/मोबाइल/मीडिया/डीसीआईएम/101APPLE/IMG_1705.JPG 'मेजबान आवेदन में निर्धारणीय नहीं हो सकता है? –

+0

क्या आपको एक त्रुटि संदेश मिलता है? यह क्या कहता है? – joern

+0

मैंने यूआरएल से एनएसडीटा प्राप्त करने की कोशिश की। नल –