使用UIImagePickerController时,iOS 10错误[访问] <私有>


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”处崩溃。

这是一个全新的应用程序,除了“抓取”按钮外,UI中没有其他任何内容。

另外,在iOS 9.3上进行测试,效果很好。我是否缺少iOS 10中可能会更改的内容?


清洁然后建造。如果没有变化,很可能是Xcode 8或iOS 10 Beta中的错误,Apple会在以后的更新中解决它。我经常会遇到这种情况-如果它是最后一个Beta或GM版本,但仍无法正常工作,那么该是时候担心对其进行修复了。
乔丹·史密斯

1
是的,即使在清理并删除应用程序后,同样的问题:(
Pranoy C

我不会为此担心。这是一个Beta版本。Beta很有可能是问题所在。我建议在Xcode 7上进行开发直到发布为止。
乔丹·史密斯,

确定是有道理的!谢谢@乔丹
Pranoy C

@Jordan在iOS 10上似乎有一个新要求。请参阅解决方案:stackoverflow.com/a/38241350/1634905
Pranoy C 2016年

Answers:


172

您可能需要将NSPhotoLibraryUsageDescription放在您的plist中。喜欢

<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) uses photos</string>

在此处查看所有用法说明。


1
抱歉,您如何找到此发行号?
Pranoy C

1
在iOS下载网站上,我只是使用了正确的UsageDescription键解决了。
rockdaswift

谢谢,您的回答立即解决了该问题!这是自iOS 10以来的一项新要求。​​欢迎来到Stack溢出!
Pranoy C

非常感谢!我被NSAppleMusicUsageDescription烧死(正在访问iTunes音乐库)。
lifjoy

4
@iomer我解决了这个问题,我确实在info.plist中添加了密钥,但在“项目”>“目标”>“信息”下看不到它。因此,我也在那里添加了内容,Apple通过了我的Binary。Facebook ID之前也发生在我身上。不知道为什么它在那里没有显示。
Raheel Sadiq

132

在iOS10中,在访问对隐私敏感的数据(如相机,通讯录等)之前,必须先获得授权,否则您的应用程序在访问它们时将崩溃,然后Xcode将记录为:

该应用已崩溃,因为它试图访问没有使用说明的隐私敏感数据。应用程序的Info.plist必须包含NSContactsUsageDescription具有字符串值的键,该字符串值向用户说明应用程序如何使用此数据。

怎么处理呢?

在您的项目中打开名为的文件info.plist,右键单击它,将其打开为Source Code,然后将下面的代码粘贴至该文件。或者,您可以打开 info.plistProperty List默认,单击添加按钮,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>

或前往target -> Capabilities -> Background Modes -> open the background Modes

在此处输入图片说明

然后清理您的项目,运行它。

转到此处以获取更多信息: iOS10AdaptationTips


2
我无处使用照片,苹果拒绝了我的应用程序,知道吗?我也检查了所有吊舱项目
Raheel Sadiq

@RaheelSadiq请记住在<string> 和之间写下您为何要求此授权的描述 </string>,否则您的应用将被苹果拒绝。
ElonChan

23

在iOS 10中,如果您在应用中使用相机或照片库,则需要添加下图提到的密钥

.plist图片


14

您需要将新的隐私设置添加到info.plist。

不要忘了添加描述应用程序为何需要访问服务的值。

在此处输入图片说明


9

在iOS 10中,Apple更改了访问任何用户私有数据类型的方式。

您需要将“ 隐私-图片库使用说明”键添加到应用Info.plist及其使用信息。

有关更多信息,请找到下面的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.