PHPhotoLibrary get nombres de álbumes

He estado tratando de encontrar una alternativa para get los nombres de los álbumes con la API de Photos en iOS 8. Con ALAssets, podemos usar: valueForProperty:ALAssetsGroupPropertyName sin embargo, con la API de Photos, no puedo encontrar una alternativa. Hay: localizedTitle bajo PHAssetCollection pero tampoco está bien, solo me da los nombres de las ciudades. Estoy buscando algo que pueda devolver los nombres reales de los grupos, incluidos los sincronizados con iTunes.

Agradecería cualquier ayuda para ver cómo haces esto en tus aplicaciones. Apple está alentándonos a usar solo la API de Photos para aplicaciones vinculadas con 8.0, por lo que preferiría no usar tanto ALAssetLibrary como Photos.

Código:

 - (NSString *)nameForAlbumInCollection:(id)collection { NSString *title = nil; if ([PHAsset class]) { title = [collection localizedTitle]; } else { title = [collection valueForProperty:ALAssetsGroupPropertyName]; } return title; } - (void)setup { self.recentsCollectionDataSource = [[NSMutableOrdenetworkingSet alloc]init]; self.favoritesCollectionDataSource = [[NSMutableOrdenetworkingSet alloc]init]; self.albumsTableDataSource = [[NSMutableOrdenetworkingSet alloc]init]; NSMutableArray *segmentTitles = [[NSMutableArray alloc]init]; self.assetsFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum | PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; if (!self.parentController.canTakeOrChooseVideo) { fetchOptions.pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"mediaType = %i",PHAssetMediaTypeImage]; } for (PHAssetCollection *sub in self.assetsFetchResult) { PHFetchResult *assetsInCollection = [PHAsset fetchAssetsInAssetCollection:sub options:nil]; for (PHAsset *asset in assetsInCollection) { NSLog(@"%@",[self nameForAlbumInCollection:sub]); [self.recentsCollectionDataSource addObject:asset]; if (![segmentTitles containsObject:@"Recents"]) { [segmentTitles addObject:@"Recents"]; [segmentTitles addObject:@"Albums"]; } if (asset.isFavorite) { [self.favoritesCollectionDataSource addObject:asset]; if (![segmentTitles containsObject:@"Favorites"]) { [segmentTitles addObject:@"Favorites"]; } } } } } 

Así es como hice una list de los nombres de los álbumes en un proyecto mío. Puede que tenga que desviarse un poco, pero esto debería funcionar.

 NSArray *collectionsFetchResults; NSMutableArray *localizedTitles = [[NSMutableArray alloc] init]; PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; PHFetchResult *syncedAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumSyncedAlbum options:nil]; PHFetchResult *userCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil]; // Add each PHFetchResult to the array collectionsFetchResults = @[smartAlbums, userCollections, syncedAlbums]; for (int i = 0; i < collectionsFetchResults.count; i ++) { PHFetchResult *fetchResult = collectionsFetchResults[i]; for (int x = 0; x < fetchResult.count; x ++) { PHCollection *collection = fetchResult[x]; localizedTitles[x] = collection.localizedTitle; } } 

Creo que lo que podrías estar usando es propiedad localizedLocationNames de PHCollectionList. Debería usar localizedTitle bajo PHAssetCollection como lo mencionó en la pregunta.

Escribí una pequeña class de utilidad y agregué el siguiente método para recuperar el nombre del álbum.

 + (NSString *)localizedTitleForGroupOrCollection:(id)collection { NSString *title = nil; if ([PHAsset class]) { title = [collection localizedTitle]; } else { title = [collection valueForProperty:ALAssetsGroupPropertyName]; } return title; } 

La máscara de bits no funcionará como PHAssetCollectionTypeAlbum, PHAssetCollectionTypeSmartAlbum y PHAssetCollectionTypeMoment no se especifican como campos de bits. Toman valores 1, 2, 3. Para que una máscara de bits funcione, deberían tomar los valores 1, 2, 4, cada valor en un bit diferente.