2

我在我的应用程序中使用 PHAsset,我需要将图像和视频上传到 api,因为我需要 mime 类型的图像和视频。在以前的 iOS 版本中,我使用了以下代码,但在 iOS 8 中,我不知道如何获取 mimetype 我曾尝试查看苹果 PHAsset 编程指南但无法找到它。

ALAssetRepresentation *representation = [asset defaultRepresentation];
NSString *mimeType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass
        ((__bridge CFStringRef)[representation UTI], kUTTagClassMIMEType);

寻找任何指导。

4

4 回答 4

1

PHContentEditingInput有财产uniformTypeIdentifier您可以在文档中找到更多信息。

@import MobileCoreServices.UTType;

...

PHAsset *asset = ...
PHContentEditingInputRequestOptions *options = ...
[asset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
    NSString *MIME = (__bridge NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)contentEditingInput.uniformTypeIdentifier, kUTTagClassMIMEType);
}];
于 2015-05-25T08:56:19.907 回答
1

我最终获得了 PHAsset 的 MIME 类型,如下所示(iOS 9+):

@implementation PHAsset (UTI)

- (NSString *)utiMimeType
{
    NSString *mimeType = @"image/jpeg";

    NSString *uType = [PHAssetResource assetResourcesForAsset:self].firstObject.uniformTypeIdentifier;
    if (uType) {
        NSString *tagMimeType = (__bridge NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)uType, kUTTagClassMIMEType);
        if (tagMimeType)
            mimeType = tagMimeType;
    }

    return mimeType;
}

@end

需要注意的几件事/改进的方法:

  1. 如果无法导出 mimeType,我选择默认为 image/jpeg。
  2. 它假设第一个资源是适当的。多资源资产(实时照片等)可能并非如此。
  3. 对于需要下载的 iCloud 中的资产,我尚未测试它如何/是否按预期工作。

如果有人对#2或#3有见解,将不胜感激。当我发现更多时,我会更新我的答案。

于 2018-10-03T21:51:18.703 回答
1

您还可以从 PHContentEditingInput 类中找到 uniformTypeIdentifier。为了这; 使用 PHAsset 中的 requestContentEditingInput 函数

不要忘记导入 MobileCoreServices

示例 Swift 3.1 代码:

import MobileCoreServices


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 {

        //check type here
        if uniformTypeIdentifier == (kUTTypeGIF as String) {
            debugPrint("This asset is a GIF")
        }

    }
}
于 2017-08-16T14:25:02.247 回答
0

使用 PHImageManager 的 requestImageDataForAsset 方法。在它的 resultBlock 中,该方法返回资产的 UTI-Type。

于 2015-03-01T12:36:11.930 回答