检查给定的PHAsset是iCloud资产吗?

ris*_*992 13 ios icloud photosframework phasset

我正在尝试获取PhAsset对象.我想隔离iCloud资产.这是我的代码,

PHFetchResult *cloudAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];

[cloudAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop){
    if(collection != nil){

        PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions];
        [result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop)
         {
            // check asset is iCloud asset 

         }];
    }

}];
Run Code Online (Sandbox Code Playgroud)

请告诉我如何找到PHAsset是iCloud资产?

Erf*_*fan 14

这有点像黑客,我不得不挖掘资源数组并调试以找出我需要的信息.但它的确有效.虽然这是一个未记录的代码,但我不确定苹果是否会因此而拒绝该应用程序.试一试看看会发生什么!

// asset is a PHAsset object for which you want to get the information    
NSArray *resourceArray = [PHAssetResource assetResourcesForAsset:asset];
BOOL bIsLocallayAvailable = [[resourceArray.firstObject valueForKey:@"locallyAvailable"] boolValue]; // If this returns NO, then the asset is in iCloud and not saved locally yet
Run Code Online (Sandbox Code Playgroud)

您还可以从资产资源中获取一些其他有用的信息,例如 - 原始文件名,文件大小,文件URL等.

  • 是的,没有任何问题!! (2认同)
  • 这是判断资产是否不在本地的非常简单的方法。但对我来说,有时它会给某些资产带来错误的价值。即使该资产具有 PHImageFileSandboxExtensionTokenKey 和 PHImageFileURLKey,我也得到键“locallyAvailable”的“假”值。 (2认同)

Chr*_*ver 10

实际上有两种情况:1.照片由此设备捕获,并上传到iCloud.然后,您可以使用progressHandler检查是否需要iCloud下载.

__block BOOL isPhotoInICloud = NO;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.networkAccessAllowed = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info){

        isPhotoInICloud = YES;

});

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

        if (isPhotoInICloud) {
            // Photo is in iCloud.
        }
});
Run Code Online (Sandbox Code Playgroud)
  1. 照片在iCloud中,但是从其他设备上传.而且你没有把它保存到你当地的照片库.因此永远不会调用progressHandler块.我不知道为什么,但这是真的,我认为这是PhotoKit框架的一个错误.对于这种情况,如果使用PHImageResultIsInCloudKey,那也很困难.因为您可以在requestImageForAsset的resultHandler块中知道PHImageResultIsInCloudKey值.但这是照片请求启动后的时间.

所以,至少在我看来,没有办法检查照片是否存储在iCloud中.也许还有其他更好的方法,请告诉我.非常感谢!


jar*_*ora 2

当您请求图像时,您会在信息字典中获得一个键,它会告诉您该资产是否存在于 iCloud 中。

[cloudAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop)
{
    PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions];
    [result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop)
    {  
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        options.resizeMode = PHImageRequestOptionsResizeModeFast;
        options.synchronous = YES;
        __block BOOL isICloudAsset = NO;
        [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage *result, NSDictionary *info) 
        {
            if ([info objectForKey: PHImageResultIsInCloudKey].boolValue) 
            {
                isICloudAsset = YES;
            }
        }]; 
    }];
}];
Run Code Online (Sandbox Code Playgroud)

  • 在我对视频的测试中,“requestImageForAsset:”不会在信息目录中返回“PHImageResultIsInCloudKey”。但是 `requestImageDataForAsset:` 总是会这样做,所以我会使用该函数。 (2认同)