Как правильно определить тип файла PHASset (GIF)

Я понятия не имею, почему это так сложно. Я пытаюсь определить тип файла PHAsset, в частности, я хочу знать, представляет ли данный объект изображение GIF или нет.

Просто проверка имени файла ресурса говорит мне, что он MP4:

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

Поддерживает ли iOS преобразование GIF в видеоролики при сохранении в библиотеке изображений устройств? Я также попытался извлечь данные изображения и посмотреть на него dataUTI, но он просто возвращает nil для GIF (я тоже принимаю все видео). Я извлекаю данные изображения следующим образом:

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);
        });

    }];

});

dataUTI, возвращенный из вышеуказанного вызова, nil.

Если кто-то знает о надежном способе определения типа файла PHAsset (я специально ищу GIF, но возможность определить для любого типа файлов будет замечательным), дайте мне знать!

Ответ 1

Используйте 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;
        }
    }];

Ответ 2

Также вы можете найти iformTypeIdentifier из класса PHContentEditingInput. За это; использовать функцию requestContentEditingInput из PHAsset

Не забудь импортировать MobileCoreServices для kUTTypeGif

Пример кода 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👍")
            }

        }
    }

Ответ 3

Для Swift 3.0 и выше

import MobileCoreServices


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

Ответ 4

Прежде всего, я не уверен, что вы подразумеваете под GIF-изображением.
Вы имеете в виду Live Photo или Time-lapse?

Однако, если вы хотите проверить текущий актив, это Live Photo, Time-lapse, то вы можете проверить это как

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

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

для определения общего типа файла PHAsset вы можете проверить

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

Ответ 5

//phAsset if object of phAsset

if let imageType = phAsset.value(forKey: "uniformTypeIdentifier") as? String {
    if imageType == kUTTypeGIF as String { 
        //enter code here
    }
}

Ответ 6

Я думаю, начиная с iOS 11, мы можем использовать:

if asset.playbackStyle == .imageAnimated {
    // try to show gif animation
}