MacOS PhotoKit - Список всех смарт-альбомов, созданных пользователями?

Я впервые начал экспериментировать с разработкой для macOS. Я пытаюсь запросить список смарт-альбомов, которые я создал в приложении MacOS Photos. Как вы можете видеть на этом снимке экрана, я определил 18 смарт-альбомов и 1 обычный альбом.

Снимок экрана альбомов

Однако, когда я получаю смарт-альбом PHAssetCollections, я не вижу определенных мной смарт-альбомов. Вот код, который я использую для получения общего количества фотографий, смарт-альбомов, а затем обычных альбомов:

let allPhotosOptions = PHFetchOptions()
allPhotosOptions.includeAssetSourceTypes = [.typeUserLibrary]

allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
let allPhotos = PHAsset.fetchAssets(with: allPhotosOptions)
let photoCount = allPhotos.count
print("photoCount=\(photoCount)")

print("***********************************")
print("Smart Albums")
print("***********************************")

let smartAlbumsOptions = PHFetchOptions()
smartAlbumsOptions.includeAssetSourceTypes = [.typeUserLibrary]
let smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: smartAlbumsOptions)
let smartAlbumCount = smartAlbums.count
print("smartAlbumCount=\(smartAlbumCount)")
smartAlbums.enumerateObjects { (collection, index, stop) in
    print("Collection \(index + 1):")
    print("\tlocalizedTitle=\(String(describing: collection.localizedTitle))")
    print("\tassetCollectionType=\(collection.assetCollectionType)")
    print("\testimatedAssetCount=\(collection.estimatedAssetCount)")
    print("\tstartDate=\(String(describing: collection.startDate)), endDate=\(String(describing: collection.endDate))")
}

print("***********************************")
print("Albums")
print("***********************************")

let albums = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: nil)
let albumCount = albums.count
print("albumCount=\(albumCount)")
albums.enumerateObjects { (collection, index, stop) in
    print("Collection \(index + 1):")
    print("\tlocalizedTitle=\(String(describing: collection.localizedTitle))")
    print("\tassetCollectionType=\(collection.assetCollectionType)")
    print("\testimatedAssetCount=\(collection.estimatedAssetCount)")
    print("\tstartDate=\(String(describing: collection.startDate)), endDate=\(String(describing: collection.endDate))")
}

Однако, когда я запускаю этот код, я вижу следующий результат, показывающий, что мои созданные пользователем смарт-альбомы не возвращаются:

2020-05-23 16:41:31.059604-0400 PhotoKitTest[40065:709882] Metal API Validation Enabled
2020-05-23 16:41:33.027378-0400 PhotoKitTest[40065:709882] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=7 "(null)""
photoCount=25369
***********************************
Smart Albums
***********************************
smartAlbumCount=15
Collection 1:
    localizedTitle=Optional("Bursts")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=Optional(2017-03-13 14:50:57 +0000), endDate=Optional(2018-08-29 15:15:03 +0000)
Collection 2:
    localizedTitle=Optional("Slo-mo")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 3:
    localizedTitle=Optional("Screenshots")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=Optional(2015-10-22 13:51:51 +0000), endDate=Optional(2020-05-21 14:39:40 +0000)
Collection 4:
    localizedTitle=Optional("Animated")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 5:
    localizedTitle=Optional("Live Photos")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 6:
    localizedTitle=Optional("Unable to Upload")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 7:
    localizedTitle=Optional("Panoramas")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=Optional(2015-06-29 22:14:27 +0000), endDate=Optional(2015-07-26 19:28:39 +0000)
Collection 8:
    localizedTitle=Optional("Videos")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=Optional(2004-11-11 01:03:36 +0000), endDate=Optional(2020-05-23 14:52:01 +0000)
Collection 9:
    localizedTitle=Optional("Hidden")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 10:
    localizedTitle=Optional("Selfies")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=Optional(2011-08-06 13:17:49 +0000), endDate=Optional(2020-05-21 14:33:38 +0000)
Collection 11:
    localizedTitle=Optional("Favorites")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 12:
    localizedTitle=Optional("Time-lapse")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 13:
    localizedTitle=Optional("Portrait")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 14:
    localizedTitle=Optional("Long Exposure")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=nil, endDate=nil
Collection 15:
    localizedTitle=Optional("Recents")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=9223372036854775807
    startDate=Optional(2001-09-22 16:05:17 +0000), endDate=Optional(2020-05-23 14:52:01 +0000)
***********************************
Albums
***********************************
albumCount=1
Collection 1:
    localizedTitle=Optional("My Test Album")
    assetCollectionType=PHAssetCollectionType
    estimatedAssetCount=0
    startDate=nil, endDate=nil

Как видите, мой обычный альбом My Test Album возвращается, но ни один из созданных мной смарт-альбомов, например, для 2008, 2009 и т. Д., Я делаю не так? Нужно ли мне дополнительное значение в моем Info.plist помимо NSPhotoLibraryUsageDescription? Я впервые играю с фреймворком PhotoKit, поэтому я уверен, что могу что-то неправильно понять. Но я подумал, что это довольно простой вариант использования. Я запускаю это на macOS Catalina, используя Xcode 11.5 и Swift.


person Shadowman    schedule 23.05.2020    source источник


Ответы (1)


TL; DR - Это невозможно.


  • встроенный умный альбом = Селфи, Панорамы, Скриншоты, ...
  • смарт-альбом = пользовательский смарт-альбом, созданный на Mac

Apple представила приложение Photos (преемник iPhoto) довольно давно. И он был, по-прежнему, довольно ограничен, если вы опытный пользователь, которому нужны умные альбомы, ключевые слова, ... Откройте приложение «Фото» на своем телефоне - умных альбомов нет. Посетите Фото iCloud - умных альбомов нет. Они не синхронизируются 1.

Когда вы проверяете документацию smartAlbum, в ней говорится:

В приложении "Фотографии" отображаются встроенные умные альбомы, в которых можно сгруппировать определенные типы связанных объектов.

Я не знаю, почему в документации Photos.framework говорят о приложении Photos, это не очень понятно, но это вроде как подсказывает, что smartAlbum относится к встроенным умным альбомам .

Также имеется документация по подтипу smartAlbumGeneric:

Этот подтип применяется к смарт-альбомам, синхронизированным с устройством iOS из приложения macOS Photos.

Но умных альбомов, синхронизированных с устройством iOS, нет. Это пустой список, если вы попытаетесь его использовать.

Это как-то ограничено из-за iCloud Photos (ИМХО). Можно провести аналогию с другой структурой: поддержка CoreData + iCloud накладывает некоторые ограничения на ваши возможности, и она менее эффективна, чем просто CoreData (без iCloud). Но это чистое предположение. Возможно, все ваши умные альбомы появятся в списке, если вы отключите Фото iCloud (Фотографии - Настройки ... - iCloud - Фото iCloud), но я не настолько смел, чтобы попробовать это, так как я не хочу снова загружать всю библиотеку или что-то потерять.

Вы хотите получить доступ к своему умному альбому? Некоторые обходные пути:


1 На самом деле они синхронизированы, но вы можете увидеть их только на своем Mac.

person zrzka    schedule 27.05.2020
comment
Это было очень информативно! Очень разочаровывает, но информативно. Спасибо! - person Shadowman; 27.05.2020