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

Pra*_*y C 102 objective-c uiimagepickercontroller ios presentviewcontroller ios10

我正在使用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
Run Code Online (Sandbox Code Playgroud)

和实施:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

一旦我点击按钮,应用程序崩溃时出现非常无用的错误:

[access] <private>

而已.没有其他的.

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

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

此外,在iOS 9.3上测试,这很好.我错过了iOS 10中可能会更改的内容吗?

roc*_*ift 172

您可能需要将NSPhotoLibraryUsageDescription放入plist中.喜欢

<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) uses photos</string>
Run Code Online (Sandbox Code Playgroud)

在此处查看所有使用说明.

  • @iomer我修复了这个问题,我确实在info.plist中添加了密钥,但是我无法在Project> Target> Info下看到它.所以我也在那里添加了,Apple通过了我的二进制文件.它曾经发生在我之前和Facebook ID之前.不知道为什么没有在那里显示. (4认同)

Elo*_*han 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>
Run Code Online (Sandbox Code Playgroud)

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

<key>UIBackgroundModes</key>
<array>
    <!-- something you should use in background -->
    <string>location</string>
</array>
Run Code Online (Sandbox Code Playgroud)

或者去target -> Capabilities -> Background Modes -> open the background Modes:

在此输入图像描述

然后清理你的项目,运行它.

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

  • 我没有使用照片,苹果拒绝我的应用程序,任何想法?我也检查了所有pods项目 (2认同)

Pri*_*esh 23

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

.plist图片


小智 14

您需要向info.plist添加新的隐私设置.

不要忘记添加描述应用程序访问服务的原因的值.

在此输入图像描述


Ram*_*rma 9

在iOS 10中,Apple已经改变了访问任何用户私有数据类型的方式.

您需要将隐私 - 照片库使用说明密钥添加到您的应用程序Info.plist及其使用信息中.

有关更多信息,请参阅以下GIF.

GIF

或者,如果要添加via,info.plist则需要添加NSPhotoLibraryUsageDescription键.

只需复制并粘贴到字符串下面即可info.plist.

<key>NSPhotoLibraryUsageDescription</key>
<string>Take the photo</string>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅以下GIF.

GIF