Как получить 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