Cómo detectar correctamente el tipo de file de un PHAsset (GIF)

No tengo idea de por qué esto es tan difícil. Estoy tratando de determinar el tipo de file de un PHAsset, específicamente, quiero saber si un activo dado representa una image GIF o no.

Simplemente inspeccionar el nombre del file del activo me dice que es un MP4:

[asset valueForKey:@"filename"] ==> "IMG_XXXX.MP4"

¿IOS convierte files GIF a videos cuando se guardan en la biblioteca de imágenes de dispositivos? También traté de search los datos de la image y ver que es dataUTI, pero no devuelve nada para GIF (supongo que también todos los videos). Estoy buscando los datos de la image de la siguiente manera:

 PHImageManager *manager = asset.imageManager ? asset.imageManager : [PHImageManager defaultManager]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ PHImageRequestOptions *o = [[PHImageRequestOptions alloc] init]; o.networkAccessAllowed = YES; [manager requestImageDataForAsset:asset.asset options:o resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) { dispatch_async(dispatch_get_main_queue(), ^{ CIImage *ciImage = [CIImage imageWithData:imageData]; if(completion) completion(imageData, dataUTI, orientation, info, ciImage.properties); }); }]; }); 

el dataUTI devuelto de la llamada anterior es nil .

Si alguien sabe de una manera confiable para determinar el tipo de file de un PHAsset (estoy buscando específicamente GIF, pero ser capaz de determinar para cualquier tipo de file sería genial) ¡avísame!

Utilice PHAssetResource.

  NSArray *resourceList = [PHAssetResource assetResourcesForAsset:asset]; [resourceList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { PHAssetResource *resource = obj; if ([resource.uniformTypeIdentifier isEqualToString:@"com.compuserve.gif"]) { isGIFImage = YES; } }]; 

En primer lugar, no estoy seguro de qué quieres decir con la image GIF.
¿Te refieres a Live Photo o Time-lapse?

Sin embargo, si desea verificar que el activo actual es Live Photo, Time-lapse, puede verificar así

 if(asset.mediaSubtypes == PHAssetMediaSubtypePhotoLive) { // this is a Live Photo } if(asset.mediaSubtypes == PHAssetMediaSubtypeVideoTimelapse) { // this is a Time-lapse } 

Para determinar el tipo de file genérico de un PHAsset, puede verificar

  asset.mediaType == PHAssetMediaTypeImage asset.mediaType == PHAssetMediaTypeVideo asset.mediaType == PHAssetMediaTypeAudio 

También puede encontrar uniformTypeIdentifier de la class PHContentEditingInput . Para esto; use requestContentEditingInput function from PHAsset

No olvide importar MobileCoreServices para kUTTypeGif

Código Sample Swift 3.1:

  let options = PHContentEditingInputRequestOptions() options.isNetworkAccessAllowed = true //for icloud backup assets let asset : PHAsset = ..... //sampleAsset asset.requestContentEditingInput(with: options) { (contentEditingInput, info) in if let uniformTypeIdentifier = contentEditingInput?.uniformTypeIdentifier { if uniformTypeIdentifier == (kUTTypeGIF as String) { debugPrint("This asset is a GIF👍") } } } 

Para Swift 3.0 y superior

 var isGIFImage = false if let identifier = asset.value(forKey: "uniformTypeIdentifier") as? String { if identifier == kUTTypeGIF as String { isGIFImage = true } }