2013-08-06 13 views
18

Quando si tenta di accedere a immagini da un flusso di foto, a volte il metodo [asset defaultRepresentation] restituisce zero.Come ottenere un ALAssetRepresentation di un photostream condiviso ALAsset?

Secondo la documentazione ciò può verificarsi se la risorsa non è (ancora) disponibile localmente.

Questo metodo restituisce nil per le risorse da un flusso di foto condiviso che non è ancora disponibile localmente. Se la risorsa diventa disponibile in futuro, viene inviata una notifica ALAssetsLibraryChangedNotification .

Una volta visualizzata la foto in Photos.app, diventa disponibile anche per la mia app, ma ovviamente mi piacerebbe che la mia app attivasse l'evento "Scarica localmente".

ho guardato il codice di MyImagePicker di esempio da parte di Apple, ma presenta lo stesso comportamento (solo una miniatura è disponibile)

Come posso rendere l'attività disponibile a livello locale?

Modifica: poiché Apple ha introdotto lo Photos.framework in iOS8 e l'utilizzo di ALAssets è diventato obsoleto in iOS9, probabilmente non verrà risolto.

+1

Anche questo problema si verifica, vedendolo più spesso in esecuzione su iOS7. Altre app sembrano avere un modo per caricare queste immagini, quindi ci deve essere un modo, ma la lettura dei documenti relativi ad ALAsset non ha rivelato nulla ... – Laura

+0

@Laura Lo vedo anche su iOS7, non posso dire di aver visto altre app che gestiscono correttamente le stesse foto. (se tale immagine non viene caricata nella mia app, passo a instagram e si blocca quando si tenta di accedere alla stessa foto). Una volta aperta la foto nell'app Foto di Apple, funziona correttamente ovunque. – Pieter

+0

Pic Collage è l'app che ho eseguito che sembrava funzionare (almeno qualche volta - altre volte si blocca). Quando seleziono una miniatura dal selettore di foto, posso vedere che aggiunge la foto prima come una versione quadrata e sfocata della miniatura, quindi una o due dopo, sostituisce la miniatura con l'immagine a dimensione intera. Quindi, sembra partire e caricarlo, ma non è sicuro ora. Ho provato a creare un nuovo album, aggiungendo la risorsa a quell'album, e poi tentando di enumerare le risorse in quel gruppo, ma neanche i dadi. – Laura

risposta

1

Dal quadro PhotoKit è stato introdotto da Apple in iOS 8, e tutto il materiale ALAsset è diventato obsoleto in iOS9, è sicuro che non verrà mai risolto.

Ciò può tuttavia essere eseguito correttamente con le nuove API di PhotoKit.

È necessario impostare networkAccessAllowed = YES su PHImageRequestOptions quando si richiede un'immagine e verrà scaricato da iCloud se necessario.

PHAsset* photoAsset = ... 
CGSize fullImageSize = ... 
PHImageRequestOptions* options = [PHImageRequestOptions new]; 
options.networkAccessAllowed = YES; 
[[PHImageManager defaultManager] requestImageForAsset:photoAsset 
     targetSize:fullImageSize contentMode:PHImageContentModeAspectFill 
     options:options resultHandler:^(UIImage *result, NSDictionary *info) { /* use result image */ }]; 
4

Sono caduto nello stesso numero. Non sono riuscito a trovare un modo per ottenere effettivamente le immagini. Tutto quello che puoi fare è non visualizzare le immagini che hanno zero "defaultRepresentation" o rilasciare il supporto per le foto condivise a tutti chiamando [ALAssetsLibrary disableSharedPhotoStreamsSupport];

Speranza che aiuta

2

ho trovato la risposta! Non è documentato e quindi usare la seguente risposta con cautela. (Con cautela voglio dire, Apple non consente di utilizzare le chiamate API private).

Sulla risorsa è presente un metodo denominato - (void)requestDefaultRepresentation; è possibile utilizzare questo metodo per attivare la Libreria risorse per scaricare la foto condivisa. Come indicato nel documento, verrà generato il ALAssetsLibraryChangedNotification per farti sapere che l'immagine è diventata disponibile.

Non ho idea, perché Apple non l'ha documentato. Buona fortuna buon divertimento =)

si può evitare un avviso con la seguente intestazione:

ALAsset + RequestDefaultRepresentation.h

#import <AssetsLibrary/AssetsLibrary.h> 

@interface ALAsset (RequestDefaultRepresentation) 
- (void)requestDefaultRepresentation; 
@end 
+0

Buono a sapersi, ma l'utilizzo di un'API privata non è ovviamente una soluzione accettabile per le app sull'Appstore. – Pieter

+1

Capisco, almeno chiarisce che esiste e come potrebbe essere fatto. Non c'è altro modo. – Mark

Problemi correlati