2015-10-16 16 views
5

Io lavoro sulla condivisione di immagini di serie dalla galleria utilizzando l'estensione di condivisione. posso ottenere un'immagine all'interno di estensione condivisione utilizzandoCome ottenere l'URL del modulo immagine passato dall'estensione di condivisione a un'app

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

Che cosa ho veramente bisogno è, ho bisogno di passare immagine url contenitore applciation. Ma non è in grado di ottenere immagini da quell'URL. Il formato dell'URL è file:///var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG

I dati di questo URL sono sempre nulli. come ottenere l'immagine da questo URL?

risposta

3

Probabilmente chiamate getImageFromExtension da didSelectPost. Alla fine del didSelectPost, si suppone di chiamare completeRequestReturningItems:completionHandler: per comunicare all'app host di completare la richiesta di estensione dell'app con una serie di elementi dei risultati. Quando viene chiamato quel metodo, l'intero ShareViewController viene eliminato e deallocato. Quando lo chiami alla fine di didSelectPost, viene eseguito prima che lo NSItemProvider possa recuperare l'URL dell'immagine. Perché ciò avviene in modo asincrono. Per risolvere questo problema è necessario chiamare completeRequestReturningItems:completionHandler: dopo NSItemProvider ha recuperato imageURL.

Ecco come dovrebbe funzionare:

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

A proposito, non v'è alcuna necessità di utilizzare dispatch_async quando si lavora con NSItemProvider come il fornitore sta già facendo il suo lavoro in modo asincrono.

Ho scritto uno blog post su questo, se volete leggere un po 'di più su questo.

EDIT

È ora possibile caricare l'immagine con il percorso del file che hai appena recuperare. Funziona solo nell'estensione! Se si desidera accedere all'immagine dall'app contenente non è possibile utilizzare l'URL del file appena recuperato. L'estensione di condivisione salva l'immagine selezionata in una cartella che non è accessibile dall'app contenente.

Per rendere l'immagine disponibile per l'app contenente devi attivare App Groups in te contenente l'app e l'estensione. Quindi l'estensione salva l'immagine nel contenitore condiviso e l'app che la contiene può recuperarla:

+0

grazie @joren, ho una domanda, perché l'URL (generato nell'estensione di condivisione) 'file: /// var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG' non è valutabile nell'applicazione host? –

+0

Ricevi un messaggio di errore? Cosa dice? – joern

+0

ho appena provato a ottenere NSData dall'URL. Risintonizzazione dei dati su Null –