我已经看到了各种方法来检查-imagePickerController:didFinishPickingMediaWithInfo:中返回的媒体类型是否是视频.例如,我的方式:
- (void)imagePickerController:(UIImagePickerController *)imagePicker didFinishPickingMediaWithInfo:(NSDictionary *)info { if (UTTypeEqual(kUTTypeMovie,(__bridge CFStringRef)[info objectForKey:UIImagePickerControllerMediaType])) { // ... } }
要么
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
要么
if ([mediaType isEqualToString:(NSString *)kUTTypeVideo] || [mediaType isEqualToString:(NSString *)kUTTypeMovie])
要么
if (CFStringCompare ((__bridge CFStringRef) mediaType,kUTTypeMovie,0) == kcfCompareEqualTo)
要么
if ([mediaType isEqualToString:@"public.movie"]
解决方法
最好检查一下与特定UTI的一致性.
现在,iOS告诉你它是一个public.movie,但它明年会说些什么呢?你会看到有人检查public.video.太棒了,所以你硬编码了两种而不是一种.
但问“这是一部电影吗?”不是更好吗?而不是硬编码您认为iOS将返回的特定类型?有办法做到这一点:
NSString *mediaType = info[UIImagePickerControllerMediaType]; BOOL isMovie = UTTypeConformsTo((__bridge CFStringRef)mediaType,kUTTypeMovie) != 0;
如果mediaType表示电影,则使用此方法,如果返回电影(无论返回哪种特定类型),isMovie应为YES,因为所有电影都符合kUTTypeMovie.要非常清楚,如果它是kUTTypeVideo,它也会将其识别为电影,因为kUTTypeVideo符合kUTTypeMovie.
同样,您可以检查返回的内容是否为图像:
NSString *mediaType = info[UIImagePickerControllerMediaType]; BOOL isImage = UTTypeConformsTo((__bridge CFStringRef)mediaType,kUTTypeImage) != 0;
如果返回图像,则isIamge应为YES,因为所有图像都符合kUTTypeImage.
在这里查看Apple的(部分)类型树:Uniform Type Identifiers Are Declared in a Conformance Hierarchy.您可以获得一个不太有用但更完整的列表,列出系统当前识别的所有UTI以及它们与shell的一致性:
/System/Library/Frameworks/CoreServices.framework/Frameworks\ /LaunchServices.framework/Versions/A/Support/lsregister -dump
特别是,您可以看到public.video的定义如下:
-------------------------------------------------------- type id: 8344 uti: public.video description: video flags: exported active core apple-internal trusted icon: conforms to: public.movie tags: --------------------------------------------------------
请注意,如果类型相同,则UTTypeConformsTo返回true.来自Apple的文档:
Returns true if the uniform type identifier is equal to or conforms to the second type.