iOS照片框架

9
我希望能够从设备上的所有本地相册中检索出所有照片。基本上,就是设备上所有的照片。 本地标识符列表是否唯一? 使用照片框架,最佳方法是什么? 我的问题不是重复的,因为其他问题还涉及云资产和不在设备上的资产。当尝试获取图像的实际数据时,如果尝试进行同步,它将返回空数据。

可能是重复的问题:iOS 8 Photos framework: Get a list of all albums with iOS8 - user5890979
设备上的本地相册。基本上所有在设备上的照片。一个相册不能是本地的但包含在云端的照片吗? - matt
3个回答

3
我想从设备上的所有本地相册中检索所有照片。基本上是在设备上的所有照片。
编辑: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
}

根据您的需求,您可能需要自定义以上代码或添加更多功能!

以上代码是使用Swift 3.1和Xcode 8.3.1编写并测试的。

根据苹果文档

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

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


1
这也会返回云照片和iTunes同步照片。所以我想要所有实际在设备上的照片。 - Noam Segev
但我想知道在尝试检索图像数据之前,设备上是否有该数据,这可能吗? - Noam Segev
阅读文档后,我认为没有直接的方法。因此,您可以将fetchResult与getAsset方法结合使用来解决问题。使用这种方式获取照片在计算速度方面足够快。另外,您是否检查了图像的元数据,以确定它们是否包含iCloud中的某些特定值?如果是这样,您可以对它们进行过滤并仅获取它们。 - George Vardikos
我正在检查数据是否为空,我想找到一种不需要图像数据获取的方法。如何确保在获取之前数据不会为空? - Noam Segev

2
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];
        }
    }
}

这会获取所有的图片吗?还是只有相机胶卷里的?这在iOS 10上可以工作吗?这是否向后兼容iOS 9?比如说,这能检索WhatsApp的图像吗? - Noam Segev
你将获得相机胶卷中的所有图片,所有默认图片都将放在相机胶卷下。 - Shaik Thuphel
设备上的其他相册中的图片怎么办? - Noam Segev
你知道吗,所有的照片都会出现在相机胶卷里。它会显示一个新的相册,但实际上也在相机胶卷里。这意味着你可以从相机胶卷中获取所有的照片。 - Shaik Thuphel
你的回答中,“所有照片相册”是什么? - Noam Segev

1

第一步。

将Photos.framework嵌入您的项目中。

第二步。

#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];

这也会返回云照片和iTunes同步照片。所以我想要所有实际在设备上的照片。 - Noam Segev
PHFetchOptions *syncedOption = [[PHFetchOptions alloc] init]; syncedOption.includeAssetSourceTypes=PHAssetSourceTypeNone; PHFetchOptions *syncedOption = [[PHFetchOptions alloc] init]; syncedOption.includeAssetSourceTypes=PHAssetSourceTypeNone; - Jagveer Singh
你得到结果了吗? - Jagveer Singh
抱歉回复晚了,不好意思我不知道 PHAssetSourceTypeNone 是什么意思?即使是云端照片,我总是得到它。 - Noam Segev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接