ios - ¿Cómo obtener una representación ALAsset de un ALAsset compartido de fotos?
objective-c photostream (3)
Cuando intento acceder a las imágenes de una secuencia de fotos, a veces el método [asset defaultRepresentation]
devuelve nil.
Según la documentación, esto puede ocurrir si el activo no está (todavía) disponible localmente.
Este método devuelve cero para los activos de un flujo de fotos compartido que aún no están disponibles localmente. Si el activo está disponible en el futuro, se publica una notificación ALAssetsLibraryChangedNotification.
Una vez que vea la foto en Photos.app, también estará disponible para mi aplicación, pero obviamente me gustaría que mi aplicación active el evento "descargar localmente".
Miré el código de muestra de MyImagePicker de Apple, pero muestra el mismo comportamiento (solo hay disponible una miniatura)
¿Cómo puedo hacer que el activo esté disponible localmente?
Edición: desde que Apple introdujo el Photos.framework en iOS8, y el uso de ALAssets quedó en desuso en iOS9, esto probablemente nunca se solucionará.
¡Encontré la respuesta! No está documentado y, por lo tanto, utilice la siguiente respuesta con precaución. (Con precaución quiero decir, Apple no permite usar llamadas API privadas).
En el activo hay un método llamado - (void)requestDefaultRepresentation;
puede utilizar este método para activar la Biblioteca de recursos para descargar la foto compartida. Como se indica en el documento, se ALAssetsLibraryChangedNotification
la ALAssetsLibraryChangedNotification
para informarle que la imagen está disponible.
No tengo idea, por qué Apple no lo documentó. Buena suerte divertirse =)
Puedes evitar una advertencia con el siguiente encabezado:
ALAsset + RequestDefaultRepresentation.h
#import <AssetsLibrary/AssetsLibrary.h>
@interface ALAsset (RequestDefaultRepresentation)
- (void)requestDefaultRepresentation;
@end
Dado que Apple ha introducido el marco PhotoKit en iOS8, y todo lo relacionado con ALAsset se ha quedado obsoleto en iOS9, es seguro decir que esto nunca se solucionará.
Sin embargo, esto se puede hacer correctamente con las nuevas API de PhotoKit.
networkAccessAllowed = YES
configurar el networkAccessAllowed = YES
en el PHImageRequestOptions
cuando solicite una imagen, y la descargará desde iCloud si es necesario.
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 */ }];
Me caigo en el mismo tema. No pude encontrar una manera de obtener realmente las imágenes. Todo lo que puede hacer es no mostrar imágenes que tengan "defaultRepresentation" nil o soltar las fotos compartidas llamando a [ALAssetsLibrary disableSharedPhotoStreamsSupport];
Espero que ayude