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