IOS照片框架

我想从设备上的所有本地相册中检索所有照片。 基本上所有的设备上的照片将本地标识符的列表是唯一的? 什么是使用照片框架的最佳方法。

我的问题是不重复的,因为另一个问题也谈到不在设备上的云资产和资产。 当检索图像的实际数据时,它在尝试获取同步时返回空数据。

我想从设备上的所有本地相册中检索所有照片。 基本上所有在设备上的照片

编辑:fetchOptions.includeAssetSourceTypes = .typeUserLibrary请参阅下面的代码

我就是这么做的:

var fetchResult: PHFetchResult<PHAsset>! ... let fetchOptions = PHFetchOptions() fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] fetchOptions.includeAssetSourceTypes = .typeUserLibrary fetchResult = PHAsset.fetchAssets(with: fetchOptions) 

然后,如果我想使用它作为UImage或缩略图(也如果你想图像作为数据使用这个let imageData: NSData = UIImagePNGRepresentation(myImage) )我使用:

 /* * From an asset to a UIImage, also can be used for thumbnail (if you change the :targetSize:) */ func getAsset(_ asset: PHAsset) -> UIImage { //var thumbnail = UIImage() var imageData = Data() let options = PHImageRequestOptions() options.isSynchronous = true options.deliveryMode = .opportunistic options.resizeMode = .fast options.isNetworkAccessAllowed = false PHImageManager.default().requestImage(for: asset, targetSize: view.frame.size, contentMode: .aspectFill, options: options) { image, info in //thumbnail = image! imageData: NSData = UIImagePNGRepresentation(image) } //You can check if the UIImage is nil. If it is nil is an iCloud image //return thumbnail return imageData } 

您可能会根据您的需要定制上述代码或添加更多function!

上面的代码是使用Swift 3.1和Xcode 8.3.1编写和testing的

根据苹果的文件

isNetworkAccessAllowed 一个布尔值,指定照片是否可以从iCloud下载所请求的图像。 如果为true,并且所请求的图像未存储在本地设备上,则照片将从iCloud下载图像。 要获得下载进度的通知,请使用progressHandler属性在下载图像时定期提供相册调用的块。 如果为false(默认值),并且图像不在本地设备上,则结果处理程序的信息字典中的PHImageResultIsInCloudKey值指示图像不可用,除非启用networking访问。

使用getAsset()方法从资产中检索图像。 有用

 PHFetchResult *smartAlbums; smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; for (NSInteger i =0; i < smartAlbums.count; i++) { @autoreleasepool { PHAssetCollection *assetCollection = smartAlbums[i]; //Camera Roll //All Photos //Moments NSLog(@"assetCollection.localizedTitle---%@",assetCollection.localizedTitle); // here you will get camera roll photos if([assetCollection.localizedTitle isEqualToString:@"Camera Roll"] || [assetCollection.localizedTitle isEqualToString:@"All Photos"] ) { PHFetchOptions *options1 = [[PHFetchOptions alloc] init]; options1.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; options1.predicate = [NSPredicate predicateWithFormat:@"mediaType = %d",PHAssetMediaTypeImage]; // here you will get all assets of your camera roll images in assetsFetchResult PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:options1]; } } } 

步骤1。

将Photos.frameworkembedded到您的项目中

第2步

 #import <Photos/Photos.h> 

第3步

在plist上添加NSPhotoLibraryUsageDescription项

 <key>NSPhotoLibraryUsageDescription</key> <string>${PRODUCT_NAME} PhotoLibrary Usage</string> 

步骤4

编写这个代码来获得PHFetchResult

 PHFetchOptions *options = [[PHFetchOptions alloc] init]; options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; PHFetchResult *tempAssetsFetchResults = [PHAsset fetchAssetsWithOptions:options]; tempAssetsFetchResults = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];