Как получить ALAssetRepresentation совместного фотопотока ALAsset?
Когда я пытаюсь получить доступ к изображениям из потока фотографий, иногда метод [asset defaultRepresentation]
возвращает nil.
В соответствии с документацией это может произойти, если ресурс пока недоступен локально.
Этот метод возвращает nil для активов из общего потока фотографий, которые еще не доступны на местном уровне. Если актив станет доступным в будущем, ALAssetsLibraryChangedNotification уведомление отправлено.
Как только я просматриваю фотографию в Photos.app, она становится доступной и для моего приложения, но, очевидно, я хочу, чтобы мое приложение запускало событие "загрузить локально".
Я просмотрел образец кода MyImagePicker от Apple, но он проявляет то же поведение (доступно только миниатюра)
Как я могу сделать доступный ресурс локально?
Изменить: поскольку Apple внедрила Photos.framework в iOS8, и использование ALAssets стало устаревшим в iOS9, это, вероятно, никогда не будет исправлено.
Ответы
Ответ 1
Так как инфраструктура PhotoKit была представлена Apple в iOS8, и все вещи ALAsset стали устаревшими в iOS9, можно с уверенностью сказать, что это никогда не будет исправлено.
Однако это может быть сделано правильно с новыми API PhotoKit.
Вы должны установить networkAccessAllowed = YES
на PHImageRequestOptions
при запросе изображения, и при необходимости загрузите его из iCloud.
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 */ }];
Ответ 2
Я попадаю в одну и ту же проблему. Я не мог найти способ получить изображения.
Все, что вы можете сделать, это не отображать изображения с параметром "defaultRepresentation" или отказаться от поддержки общих фотографий вообще, вызывая [ALAssetsLibrary disableSharedPhotoStreamsSupport];
Надеюсь, что поможет
Ответ 3
Я нашел ответ! Он не задокументирован и поэтому следует использовать следующий ответ с осторожностью. (С осторожностью я имею в виду, что Apple не разрешает использовать частные вызовы API).
В активе есть метод с именем - (void)requestDefaultRepresentation;
, вы можете использовать этот метод, чтобы запустить библиотеку ресурсов для загрузки общей фотографии. Как указано в документе, ALAssetsLibraryChangedNotification
будет запущен, чтобы вы знали, что изображение стало доступным.
Не знаю, почему Apple не документировала это. Удачи вам весело =)
Вы можете избежать предупреждения со следующим заголовком:
ALAsset + RequestDefaultRepresentation.h
#import <AssetsLibrary/AssetsLibrary.h>
@interface ALAsset (RequestDefaultRepresentation)
- (void)requestDefaultRepresentation;
@end