Ios 如何检查照片库是否为空?

Ios 如何检查照片库是否为空?,ios,uiimagepickercontroller,Ios,Uiimagepickercontroller,我正在创建一个按钮,让用户从他们的照片库中选择一个图像,如果用户的照片库中没有图像,我想隐藏这个按钮 BOOL stillImagesAvailable = [[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary] containsObject:(NSString *)kUTTypeImage]; if (!stillImagesAvailab

我正在创建一个按钮,让用户从他们的照片库中选择一个图像,如果用户的照片库中没有图像,我想隐藏这个按钮

BOOL stillImagesAvailable = [[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary] containsObject:(NSString *)kUTTypeImage];
if (!stillImagesAvailable) {
  // Hide button
  return;
}
stillImagesAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];
if (!stillImagesAvailable) {
  // Hide button
  return;
}
// Show button
+[UIImagePickerController isSourceTypeAvailable:
记录为如果库中没有照片,则返回
,但我看到它在模拟器上运行的iOS 11上返回
。我使用这种方法是错误的,还是文档不正确,还是遇到了错误


是否有其他方法可以检测用户的照片库中是否有图像?

UIImagePickerController
不会公开此信息。该类通常不提供有关用户照片库的信息,只提供其中一些用户选择的内容。(您引用的文档似乎不正确-我建议他们不要使用文档进行更改。)

旁白:“用户选择”部分在iOS 11及更高版本中非常重要:图像选取器在单独的进程中运行,这意味着您的应用程序只能访问选取的资产,这意味着您不必通过隐私设置要求用户对照片库进行全面的读/写访问。)但请记住这些隐私内容,以便在回答中进一步了解

如果需要了解用户照片库的内容,请使用。如果您特别想知道库是否为“空”,则需要定义“空”对应用程序的含义。没有通过iOS保存在本地库中的资产?没有通过iTunes同步到设备上的资产?如果我没有资产,但我确实有一些空相册怎么办

假设这些问题有一个可能的答案(没有本地或同步资产,不关心相册),下面是一些(未经测试的)代码,可以得到您的答案:

- (BOOL)isPhotoLibraryEmpty {
    PHFetchOptions *options = [PHFetchOptions new];
    options.includeAssetSourceTypes = PHAssetSourceTypeUserLibrary | PHAssetSourceTypeiTunesSynced;
    PHFetchResult *results = [PHAsset fetchAssetsWithOptions:options];
    return results.count == 0;
}
然而,如果这是你的应用程序对照片框架的唯一使用,那么最好考虑是否值得先检查一个空库。如果您使用照片框架,您的应用程序需要通过iOS隐私设置(即,您在info.plist中提供
NSPhotoLibraryUsageDescription
,iOS在您第一次调用任何照片API时提示用户获得许可)对照片库进行全面读/写访问


例如,如果您使用Photos框架的目的只是检查一个空库,以便知道是否要禁用UI中的“拾取照片”按钮。。。深入隐私/权限系统可能不值得。(现在,您可以通过隐私提示主动中断它们,而不是被动禁用按钮。)最好让用户执行UI调用图像选择器的任何操作,并让
UIImagePickerController
在库为空时显示适当的屏幕(确实如此).

isSourceTypeAvailable如果没有照片,则不会返回否。检查文档:。如果设备支持指定的源类型,则为true;如果指定的源类型不可用,则为false。从该页的讨论部分:“由于媒体源可能不存在或不可用,设备可能并不总是支持所有源类型。例如,如果尝试从用户的库中拾取图像,而库为空,则此方法返回false。类似地,如果相机已在使用中,此方法将返回false。”