2015-10-16 19 views
5

Pracuję nad udostępnianiem tablicy obrazów z galerii przy użyciu rozszerzenia udziału. Mogę uzyskać obraz wewnątrz rozszerzenia udziału za pomocąJak uzyskać URL formularza graficznego przekazany przez rozszerzenie udziału do aplikacji

- (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]]); 
         }); 
        } 
       }]; 
      } 
     }); 
    } 
} 

To, czego potrzebuję, to przekazanie adresu URL obrazu do apllikacji kontenera. Nie można jednak uzyskać obrazu z tego adresu URL. Format adresu URL to file:///var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG

Dane z tego adresu URL mają zawsze wartość NULL. jak uzyskać obraz z tego adresu URL?

Odpowiedz

3

Prawdopodobnie zadzwonisz pod numer getImageFromExtension z didSelectPost. Pod koniec didSelectPost powinieneś zadzwonić pod numer completeRequestReturningItems:completionHandler:, aby poinformować aplikację hosta, aby uzupełniła żądanie rozszerzenia aplikacji o tablicę wyników. Gdy ta metoda jest nazywana, cały ShareViewController jest odrzucany i zwalniany. Po wywołaniu tego pod koniec didSelectPost zostanie ono wykonane przed uzyskaniem adresu URL obrazu. Ponieważ dzieje się to asynchronicznie. Aby to naprawić, musisz zadzwonić pod numer completeRequestReturningItems:completionHandler: po tym, jak NSItemProvider pobrał obraz.

Oto jak to powinno działać:

- (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]; 
           }]; 
    } 
} 

Nawiasem mówiąc, nie ma potrzeby korzystania dispatch_async podczas pracy z NSItemProvider jako usługodawca jest już robi swoją pracę w sposób asynchroniczny.

Napisałem o tym blog post, jeśli chcesz przeczytać trochę więcej na ten temat.

EDIT

Teraz można załadować obraz ze ścieżką pliku, który po prostu pobrać. Działa to tylko w rozszerzeniu! Jeśli chcesz uzyskać dostęp do obrazu z aplikacji zawierającej, nie możesz użyć adresu URL pliku, który właśnie pobrałeś. Rozszerzenie udostępniania powoduje zapisanie wybranego obrazu w folderze, który nie jest dostępny w aplikacji, która go zawiera.

Aby udostępnić zdjęcie aplikacji zawierającej, musisz aktywować aplikację App Groups w aplikacji i jej rozszerzeniu. Następnie rozszerzenie zapisuje obraz do udostępnionego kontenera, a aplikacja zawierająca go może go pobrać:

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

dzięki @joren, mam pytanie, dlaczego adres URL (wygenerowany w rozszerzeniu udziału) 'file: /// var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG' nie można ocenić w aplikacji hosta? –

+0

Czy pojawia się komunikat o błędzie? Co to mówi? – joern

+0

Właśnie próbowałem uzyskać NSData z adresu URL. Ponowne wprowadzanie danych do Null –