ข้อผิดพลาด iOS 10 [การเข้าถึง] <private> เมื่อใช้ UIImagePickerController


102

ฉันใช้ XCode 8 และทดสอบกับ iOS 10.2 Beta

ฉันได้เพิ่มกรอบรูป 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 เบต้าที่ Apple จะแก้ไขได้ในการอัปเดตในอนาคต ฉันมักจะพบว่าเป็นกรณีนี้ - หากเป็นเบต้าล่าสุดหรือรุ่น GM และยังใช้งานไม่ได้ก็จะถึงเวลาที่ต้องกังวลเกี่ยวกับการแก้ไข
Jordan Smith

1
ใช่ปัญหาเดียวกันแม้หลังจากล้างและลบแอปแล้ว :(
Pranoy C

ฉันจะไม่เครียดกับมัน เป็นรุ่นเบต้า มีโอกาสมากกว่าที่จะเป็นปัญหากับเบต้า ฉันขอแนะนำให้พัฒนาบน Xcode 7 จนกว่าจะใกล้วางจำหน่ายมากขึ้น
Jordan Smith

โอเคเข้าท่า! ขอบคุณค่ะ @Jordan
Pranoy C

@Jordan ดูเหมือนว่ามีข้อกำหนดใหม่สำหรับ iOS 10 โปรดดูวิธีแก้ปัญหา: stackoverflow.com/a/38241350/1634905
Pranoy C

คำตอบ:


172

คุณอาจต้องใส่ NSPhotoLibraryUsageDescription ใน plist ของคุณ ชอบ

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

ตรวจสอบทุกรายละเอียดการใช้งานที่นี่


1
ขออภัยคุณพบหมายเลขรุ่นนี้ได้อย่างไร
Pranoy C

1
ในเว็บไซต์ดาวน์โหลด iOS ฉันเพิ่งแก้ไขด้วยคีย์ UsageDescription ที่ถูกต้อง
rockdaswift

ขอบคุณคำตอบของคุณสามารถแก้ไขปัญหาได้ทันที! นี่เป็นข้อกำหนดใหม่ตั้งแต่ iOS 10 ยินดีต้อนรับสู่ Stack overflow btw!
Pranoy C

ขอบคุณมาก! ฉันถูก NSAppleMusicUsageDescription (การเข้าถึงคลังเพลง iTunes)
lifjoy

4
@iomer ฉันแก้ไขปัญหาแล้วฉันได้เพิ่มคีย์ใน info.plist แต่ฉันมองไม่เห็นใน Project> Target> Info ดังนั้นฉันจึงเพิ่มที่นั่นด้วยและ Apple ก็ส่งผ่าน Binary ของฉัน มันเคยเกิดขึ้นกับฉันเมื่อครั้งก่อนเช่นกันกับ Facebook ID ไม่รู้ว่าทำไมถึงไม่แสดงที่นั่น
Raheel Sadiq

132

ใน iOS10 ก่อนที่คุณจะเข้าถึงข้อมูลที่มีความสำคัญต่อความเป็นส่วนตัวเช่นกล้องผู้ติดต่อและอื่น ๆ คุณต้องขอการอนุญาตมิฉะนั้นแอปของคุณจะหยุดทำงานเมื่อคุณเข้าถึงจากนั้น Xcode จะเข้าสู่ระบบดังนี้

แอปนี้ขัดข้องเนื่องจากพยายามเข้าถึงข้อมูลที่มีความเป็นส่วนตัวโดยไม่มีคำอธิบายการใช้งาน Info.plist ของแอปต้องมีไฟล์NSContactsUsageDescriptionคีย์ที่มีค่าสตริงที่อธิบายให้ผู้ใช้ทราบว่าแอปใช้ข้อมูลนี้อย่างไร

จะจัดการกับเรื่องนี้อย่างไร?

เปิดไฟล์ในโปรเจ็กต์ของคุณที่ชื่อinfo.plistคลิกขวาเปิดเป็นSource Codeวางโค้ดด้านล่างลงไป หรือคุณสามารถเปิด info.plistเป็นProperty Listค่าเริ่มต้นคลิกปุ่มเพิ่ม Xcode จะให้คำแนะนำที่สมบูรณ์ขณะพิมพ์Privacy - ด้วยความช่วยเหลือของแป้นพิมพ์⬆️และ⬇️

อย่าลืมเขียนคำอธิบายของคุณว่าเหตุใดคุณจึงขอการอนุญาตนี้ระหว่าง <string>และ</string>หรือแอปของคุณจะถูกปฏิเสธโดย apple:

<!-- 🖼 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
ฉันใช้รูปถ่ายที่ไหนเลยและ Apple ปฏิเสธแอปของฉันมีความคิดอย่างไร ฉันตรวจสอบโครงการ
พ็อด

@RaheelSadiq อย่าลืมเขียนคำอธิบายของคุณว่าทำไมคุณถึงขอการอนุญาตนี้ระหว่าง <string> และ</string>หรือแอปของคุณจะถูกปฏิเสธโดย apple
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.