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

时间:2017-12-19 17:57:58

标签: ios uiimagepickercontroller

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

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:]会被记录为返回NO,但我知道在运行模拟器的iOS 11上,它会返回YES。我使用这种方法是错误的,还是文档不正确,还是我遇到了错误?

还有另一种好方法可以检测用户照片库中是否有任何图像吗?

1 个答案:

答案 0 :(得分:1)

UIImagePickerController并未公开此信息。该类通常不提供关于用户的照片库的信息,仅仅提供用户选择的一些内容。 (您引用的文档似乎不正确 - 我建议您filing a bug对文档进行更改。)

  

旁边:"用户选择"部分在iOS 11及更高版本中非常重要:图像选择器在单独的过程中运行,这意味着您的应用只能访问所选资产,这意味着您不必要求用户对照片进行全面的读/写访问图书馆通过隐私设置。)尽管...

,请记住这个隐私的内容,以便进一步了解这个答案

如果您需要了解用户照片库的内容,请使用Photos framework。如果你特别想知道图书馆是否是空的",你需要定义什么"空"适用于您的应用。没有资产通过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时的权限。)

例如,如果您使用照片框架的所有内容都是检查空库,那么您就知道是否要禁用"选择照片"你的用户界面中的按钮......深入了解隐私/权限系统可能并不值得。 (现在你通过隐私提示主动打断它们,而不是被动地禁用按钮。)让用户做你调用图像选择器的UI所做的一切可能更好,让{{1如果库是空的(它可以),则显示一个合适的屏幕。