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

问题描述 投票:0回答:1

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

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。我使用这种方法是错误的,还是文档不正确,还是我遇到了错误?

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

ios uiimagepickercontroller
1个回答
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;
}

但是,如果这是您的应用程序仅使用Photos框架,那么考虑是否值得先发制人地检查空库可能更明智。如果您完全使用照片框架,您的应用程序需要通过iOS隐私设置对照片库进行全面的读/写访问(即,您在info.plist中提供NSPhotoLibraryUsageDescription,iOS会在第一时间提示用户进行许可你打电话给任何照片API)。

例如,如果您使用照片框架的所有内容都是检查空库,那么您就知道是否要禁用UI中的“选择照片”按钮...深入了解隐私/权限系统可能不是不值得。 (现在你正在通过隐私提示主动打断它们,而不是被动地禁用按钮。)最好让用户做你的UI为调用图像选择器做的任何事情,让UIImagePickerController显示适当的屏幕,如果库是空的(它做的)。

© www.soinside.com 2019 - 2024. All rights reserved.