iOS 10使用UIImagePickerController时出现[access] <private>错误

102

我正在使用XCode 8并测试iOS 10.2 Beta。

我已经将Photos、PhotosUI和MobileCoreServices框架添加到项目中。

非常简单的代码:

#import <Photos/Photos.h>
#import <PhotosUI/PhotosUI.h>
#import <MobileCoreServices/MobileCoreServices.h>

@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, PHLivePhotoViewDelegate>

@property (strong, nonatomic) IBOutlet UIImageView *imageview;

@end

和实现:

- (IBAction)grab:(UIButton *)sender{
    UIImagePickerController *picker = [[UIImagePickerController alloc]init];
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    picker.allowsEditing = NO;
    picker.delegate = self;

    // make sure we include Live Photos (otherwise we'll only get UIImages)
    NSArray *mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeLivePhoto];
    picker.mediaTypes = mediaTypes;

    // bring up the picker
    [self presentViewController:picker animated:YES completion:nil];
}

一旦我点击按钮,应用程序就会崩溃,并显示非常无用的错误:

[access] <private>

仅此而已。没有其他信息。

使用break语句,在"presentViewController"处应用程序似乎会崩溃。

这是一个全新的应用程序,除了抓取按钮之外,界面上没有其他内容。

此外,在iOS 9.3上进行测试,一切正常。我是否错过了某些在iOS 10中可能更改的东西?


清理后构建。如果没有变化,可能是Xcode 8或iOS 10 beta中的错误,这将在以后的更新中得到解决。我经常发现这种情况 - 如果是最后一个beta版或GM版本,它仍然无法正常工作,那么就是修复它的时候了。 - Jordan Smith
1
即使清理并删除应用程序,问题仍然存在 :( - sudoExclaimationExclaimation
别太担心了,这只是一个 Beta 版本。问题更可能是由于 Beta 版本的原因。我建议在接近发布日期之前使用 Xcode 7 进行开发。 - Jordan Smith
没问题,明白了!谢谢@Jordan。 - sudoExclaimationExclaimation
@Jordan 看起来 iOS 10 有一个新的需求,请参考解决方案:https://dev59.com/8FoT5IYBdhLWcg3wtRYR#38241350 - sudoExclaimationExclaimation
5个回答

172
您可能需要将NSPhotoLibraryUsageDescription放入您的plist中。像这样:
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) uses photos</string>

查看所有用法描述在这里


1
抱歉,你是怎么找到这个版本号的? - sudoExclaimationExclaimation
1
在iOS下载网站上,我刚刚使用了正确的UsageDescription密钥解决了问题。 - rockdaswift
4
@iomer,我解决了这个问题。我已经在info.plist中添加了密钥,但在“项目”>“目标”>“信息”下看不到它。因此,我也在那里添加了它,并且苹果通过了我的二进制文件。我之前也遇到过类似的问题,其中包括Facebook ID,不知道为什么那里没有显示出来。 - Raheel Sadiq
这应该可以使您的应用程序不受应用商店控制。 - Olivier de Jonge
如果您不使用照片会怎样?我收到了一个警告,说我需要密钥,然后当我添加了没有值的密钥时,它拒绝了二进制文件。 - James O'Brien
显示剩余7条评论

132

iOS10中,如果您要访问诸如相机、联系人等隐私敏感数据,必须先请求授权,否则在访问它们时您的应用程序将崩溃。然后Xcode会记录如下日志:

  

此应用已崩溃,因为它尝试访问隐私敏感数据而没有使用说明。 应用程序的Info.plist必须包含一个NSContactsUsageDescription键,其字符串值解释了应用程序如何使用此数据。

如何处理?

打开您项目中名为info.plist的文件,右键单击它,选择“Source Code”方式打开,将以下代码粘贴到其中。或者您也可以默认以“Property List”的方式打开info.plist,单击添加按钮, Xcode会在您输入Privacy - 并使用键盘的⬆️和⬇️键时给出建议的补全。

请记得在 <string></string>之间编写您请求此授权的原因,否则您的应用程序将被苹果拒绝:

<!--  Photo Library -->
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) photo use</string>

<!--  Camera -->
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) camera use</string>

<!--  Write To Image Gallery>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME) save phots in gallry</string>


<!--  Microphone -->
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) microphone use</string>

<!--  Location -->
<key>NSLocationUsageDescription</key>
<string>$(PRODUCT_NAME) location use</string>

<!--  Location When In Use -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) location use</string>

<!--  Location Always -->
<key>NSLocationAlwaysUsageDescription</key>
<string>$(PRODUCT_NAME) always uses location </string>

<!--  Calendars -->
<key>NSCalendarsUsageDescription</key>
<string>$(PRODUCT_NAME) calendar events</string>

<!-- ⏰ Reminders -->
<key>NSRemindersUsageDescription</key>
<string>$(PRODUCT_NAME) reminder use</string>

<!--  Contacts -->
<key>NSContactsUsageDescription</key>
<string>$(PRODUCT_NAME) contact use</string>

<!--  Motion -->
<key>NSMotionUsageDescription</key>
<string>$(PRODUCT_NAME) motion use</string>

<!--  Health Update -->
<key>NSHealthUpdateUsageDescription</key>
<string>$(PRODUCT_NAME) heath update use</string>

<!--  Health Share -->
<key>NSHealthShareUsageDescription</key>
<string>$(PRODUCT_NAME) heath share use</string>

<!-- ᛒ Bluetooth Peripheral -->
<key>NSBluetoothPeripheralUsageDescription</key>
<string>$(PRODUCT_NAME) Bluetooth Peripheral use</string>

<!--  Media Library -->
<key>NSAppleMusicUsageDescription</key>
<string>$(PRODUCT_NAME) media library use</string>

<!--  Siri -->
<key>NSSiriUsageDescription</key>
<string>$(PRODUCT_NAME) siri use</string>

<!--  HomeKit -->
<key>NSHomeKitUsageDescription</key>
<string>$(PRODUCT_NAME) home kit use</string>

<!--  SpeechRecognition -->
<key>NSSpeechRecognitionUsageDescription</key>
<string>$(PRODUCT_NAME) speech use</string>

<!--  VideoSubscriber -->
<key>NSVideoSubscriberAccountUsageDescription</key>
<string>$(PRODUCT_NAME) tvProvider use</string>

如果它不起作用,尝试请求后台授权:

<key>UIBackgroundModes</key>
<array>
    <!-- something you should use in background -->
    <string>location</string>
</array>

或者前往 目标 -> 能力 -> 后台模式 -> 打开后台模式:

enter image description here

然后清理项目,运行它。

点击此处获取更多信息:iOS10适配技巧


2
我没有在任何地方使用照片,但苹果拒绝我的应用,有什么想法吗?我也检查了所有的pods项目。 - Raheel Sadiq
@RaheelSadiq 请记得在 <string></string> 之间写下您请求此授权的描述,否则您的应用将被苹果拒绝。 - ChenYilong

23

iOS 10版本中,如果你的应用使用相机或照片库,需要添加下面图片中提到的密钥。

.plist image


14

你需要将新的隐私设置添加到你的info.plist文件中。

不要忘记添加描述应用程序需要访问该服务的值。

enter image description here


9
在iOS 10中,苹果已经改变了您访问任何用户私有数据类型的方式。您需要向应用程序的Info.plist添加“Privacy - Photo Library Usage Description”键以及它们的使用信息。
有关更多信息,请查找下面的GIF。

GIF

如果您想通过info.plist添加,则需要添加NSPhotoLibraryUsageDescription键。只需将以下字符串复制并粘贴到info.plist中。
<key>NSPhotoLibraryUsageDescription</key>
<string>Take the photo</string>

请查看下面的GIF以获取更多信息。

GIF


1
<key>NSCameraUsageDescription</key><string>拍照</string>,并且 - Nasir Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接