更具体地说,您如何知道 aPHAsset
的标的资产的当前版本是否与原始版本不同?
我的用户只需要在必要时在当前资产或原始资产之间进行选择。然后我需要他们的答案PHImageRequestOptions.version
。
更具体地说,您如何知道 aPHAsset
的标的资产的当前版本是否与原始版本不同?
我的用户只需要在必要时在当前资产或原始资产之间进行选择。然后我需要他们的答案PHImageRequestOptions.version
。
我找到了一种方法来确定 a 是否PHAsset
已被编辑。使用PHAssetResource
API,您可以获得给定资产的数据资源数组。如果照片被修改过,它至少有一个资源是编辑的调整数据。
let isEdited = PHAssetResource.assetResources(for: asset).contains(where: { $0.type == .adjustmentData })
请注意,如果您想实际使用资源文件,则必须使用PHAssetResourceManager
API 获取其数据。另请注意,此方法会立即返回 - 与此处的其他答案不同,无需等待异步网络请求。
我找到了两种检查PHAsset
修改的方法。
- (void)tb_checkForModificationsWithEditingInputMethodCompletion:(void (^)(BOOL))completion {
PHContentEditingInputRequestOptions *options = [PHContentEditingInputRequestOptions new];
options.canHandleAdjustmentData = ^BOOL(PHAdjustmentData *adjustmentData) { return YES; };
[self requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
if (completion) completion(contentEditingInput.adjustmentData != nil);
}];
}
- (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion {
PHVideoRequestOptions *options = [PHVideoRequestOptions new];
options.deliveryMode = PHVideoRequestOptionsDeliveryModeFastFormat;
[[PHImageManager defaultManager] requestAVAssetForVideo:self options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
if (completion) completion([[asset description] containsString:@"/Mutations/"]);
}];
}
编辑:我正处于需要 PHAsset 与图像具有相同功能的地步。我用这个:
- (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion {
[self requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
NSString *path = (contentEditingInput.avAsset) ? [contentEditingInput.avAsset description] : contentEditingInput.fullSizeImageURL.path;
completion([path containsString:@"/Mutations/"]);
}];
}
看看PHImageRequestOptionsVersion
PHImageRequestOptionsVersionCurrent
请求图像资产的最新版本(反映所有编辑的版本)。生成的图像是所有先前进行的调整的渲染输出。
PHImageRequestOptionsVersionUnadjusted
请求未经调整的图像资产版本。
如果资产已被编辑,则生成的图像会反映资产在执行任何编辑之前的状态。
PHImageRequestOptionsVersionOriginal
请求图像资产的原始、最高保真版本。无论进行任何编辑,生成的图像都是最初捕获或导入的资产版本。
如果您在检索资产之前询问用户,您就知道用户指定了哪个版本。如果您从其他地方获得 phasset,您可以执行 revertAssetContentToOriginal 来获取原始资产。并且 PHAsset 具有 modifyDate 和 creationDate 属性,您可以使用它来判断 PHAsset 是否被修改。
我发现这段代码是目前唯一有效的代码,它可以处理大多数边缘情况。它可能不是最快的,但适用于大多数图像类型。它采用尽可能小的原始图像和修改后的图像并比较它们的数据内容。
@implementation PHAsset (Utilities)
- (void)checkEditingHistoryCompletion:(void (^)(BOOL edited))completion
{
PHImageManager *manager = [PHImageManager defaultManager];
CGSize compareSize = CGSizeMake(64, 48);
PHImageRequestOptions *requestOptions = [PHImageRequestOptions new];
requestOptions.synchronous = YES;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
requestOptions.version = PHImageRequestOptionsVersionOriginal;
[manager requestImageForAsset:self
targetSize:compareSize
contentMode:PHImageContentModeAspectFit
options:requestOptions
resultHandler:^(UIImage *originalResult, NSDictionary *info) {
UIImage *currentImage = originalResult;
requestOptions.version = PHImageRequestOptionsVersionCurrent;
[manager requestImageForAsset:self
targetSize:currentImage.size
contentMode:PHImageContentModeAspectFit
options:requestOptions
resultHandler:^(UIImage *currentResult, NSDictionary *info) {
NSData *currData = UIImageJPEGRepresentation(currentResult, 0.1);
NSData *orgData = UIImageJPEGRepresentation(currentImage, 0.1);
if (completion) {
//handle case when both images cannot be retrived it also mean no edition
if ((currData == nil) && (orgData == nil)) {
completion(NO);
return;
}
completion(([currData isEqualToData:orgData] == NO));
}
}];
}];
}
@end