ตรวจสอบว่ามีการตั้งค่าการเข้าถึงไลบรารีรูปภาพหรือไม่ - PHPhotoLibrary


102

ด้วยฟังก์ชันใหม่ใน iOS 8 หากคุณใช้กล้องถ่ายรูปในแอปจะขออนุญาตเข้าถึงกล้องจากนั้นเมื่อคุณพยายามถ่ายภาพอีกครั้งระบบจะขออนุญาตเข้าถึงคลังรูปภาพ ครั้งต่อไปเมื่อฉันเปิดแอปฉันต้องการตรวจสอบว่ากล้องและคลังรูปภาพมีสิทธิ์เข้าถึงหรือไม่

ป้อนคำอธิบายภาพที่นี่

สำหรับกล้องฉันตรวจสอบโดย

if ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo] == AVAuthorizationStatusDenied)
{
// do something
}

ฉันกำลังมองหาสิ่งที่คล้ายกับสิ่งนี้สำหรับคลังรูปภาพ

คำตอบ:


88

ตรวจสอบ+[PHPhotoLibrary authorizationStatus]- PHAuthorizationStatusNotDeterminedถ้าไม่ตั้งก็จะกลับ (จากนั้นคุณสามารถขอสิทธิ์เข้าถึงโดยใช้+requestAuthorization:คลาสเดียวกันได้)


ฉันจำเป็นต้องเพิ่ม / นำเข้ารากฐานหรือไลบรารีใด ๆ เพื่อใช้ PHPhotoLibrary หรือไม่? ฉันได้รับข้อผิดพลาด "การใช้ตัวระบุที่ไม่ได้ประกาศ"
tech_human

2
ฉันลองใช้ "ALAssetsLibrary" แทนเพื่อตรวจสอบสถานะการอนุญาตและส่งคืน YES แม้ว่าคลังรูปภาพจะปิดอยู่ก็ตาม
tech_human

โอ้ฉันสามารถรับสถานะโดยใช้ "ALAssetsLibrary" ยังอยากรู้ว่าจะใช้ไลบรารี PHPhoto ได้หรือไม่
tech_human

3
PHPhotoLibrary เป็นส่วนหนึ่งของกรอบงาน Photos ซึ่งมีให้ใช้งานบน iOS 8 เท่านั้นหากคุณต้องการการสนับสนุนสำหรับ iOS เวอร์ชันเก่า ALAssetsLibrary อาจเป็นทางออกที่ดีที่สุดของคุณ
ทิม

เช่นเดียวกับ iOS 9 ALAssetsLibrary เลิกใช้งานแล้วดังนั้นฉันเดาว่านั่นเป็นสาเหตุที่ไม่ทำงาน
Supertecnoboff

131

ฉันรู้ว่าสิ่งนี้ได้รับคำตอบแล้ว แต่เพียงเพื่อขยายคำตอบ @Tim นี่คือรหัสที่คุณต้องการ (iOS 8 ขึ้นไป):

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

if (status == PHAuthorizationStatusAuthorized) {
     // Access has been granted.
}

else if (status == PHAuthorizationStatusDenied) {
     // Access has been denied.
}

else if (status == PHAuthorizationStatusNotDetermined) {

     // Access has not been determined.
     [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {

         if (status == PHAuthorizationStatusAuthorized) {
             // Access has been granted.         
         }

         else {
             // Access has been denied.
         }
     }];  
}

else if (status == PHAuthorizationStatusRestricted) {
     // Restricted access - normally won't happen.
}

อย่าลืม #import <Photos/Photos.h>

หากคุณใช้ Swift 3.0 หรือสูงกว่าคุณสามารถใช้รหัสต่อไปนี้:

// Get the current authorization state.
let status = PHPhotoLibrary.authorizationStatus()

if (status == PHAuthorizationStatus.authorized) {
    // Access has been granted.
}

else if (status == PHAuthorizationStatus.denied) {
    // Access has been denied.
}

else if (status == PHAuthorizationStatus.notDetermined) {

    // Access has not been determined.
    PHPhotoLibrary.requestAuthorization({ (newStatus) in

        if (newStatus == PHAuthorizationStatus.authorized) {

        }

        else {

        }
    })
}

else if (status == PHAuthorizationStatus.restricted) {
    // Restricted access - normally won't happen.
}

อย่าลืม import Photos


5
เหตุใดจึงมี แต่ iOS 9 ขึ้นไป กรอบรูปพร้อมใช้งานตั้งแต่ iOS 8 ..
Balázs Vincze

1
อย่าลืมเพิ่มกรอบรูปในโครงการ -> เป้าหมาย -> ขั้นตอนการสร้าง
stellz

มันทำงานไม่ถูกต้องฉันปฏิเสธการเข้าถึงจากนั้นเปิดใช้งานอีกครั้ง แต่ก็ยังบอกว่าไม่ได้กำหนด
TomSawyer

"// การเข้าถึงที่ จำกัด - โดยปกติจะไม่เกิดขึ้น" ทำไม? อาจเกิดขึ้น: "ผู้ใช้ไม่สามารถเปลี่ยนสถานะของแอปพลิเคชันนี้ได้อาจเป็นเพราะข้อ จำกัด ที่ใช้งานอยู่"
NoKey

PHPhotoLibrary.requestAuthorization สมมติว่าจะแสดงกล่องโต้ตอบเพื่อขออนุญาตหรือไม่ เพราะเรียกสายนี้ไม่ได้ทำอะไรเลย
iori24

50

เช่นเดียวกับความเป็นทางการเวอร์ชันSwift 2.X :

    func checkPhotoLibraryPermission() {
       let status = PHPhotoLibrary.authorizationStatus()
       switch status {
       case .Authorized:
            //handle authorized status
       case .Denied, .Restricted :
            //handle denied status
       case .NotDetermined:
            // ask for permissions
            PHPhotoLibrary.requestAuthorization() { (status) -> Void in
               switch status {
               case .Authorized:
                   // as above
               case .Denied, .Restricted:
                   // as above
               case .NotDetermined:
                   // won't happen but still
               }
            }
        }
    }

และSwift 3 / Swift 4 :

    import Photos

    func checkPhotoLibraryPermission() {
        let status = PHPhotoLibrary.authorizationStatus()
        switch status {
        case .authorized: 
        //handle authorized status
        case .denied, .restricted : 
        //handle denied status
        case .notDetermined: 
            // ask for permissions
            PHPhotoLibrary.requestAuthorization { status in
                switch status {
                case .authorized: 
                // as above
                case .denied, .restricted: 
                // as above
                case .notDetermined: 
                // won't happen but still
                }
            }
        }
    }

6
ในSwift 3อย่าลืมimport Photosถ้าคุณต้องการใช้ PHPhotoLibrary
ronatory

27

นี่คือคำแนะนำฉบับสมบูรณ์สำหรับ iOS 8+ (ไม่มี ALAssetLibrary):

ประการแรกเราต้องให้รายละเอียดการใช้งานในขณะนี้ก็ต้องโดย PHPhotoLibrary
ในการดำเนินการนี้เราต้องเปิดinfo.plistไฟล์ค้นหาคีย์Privacy - Photo Library Usage Descriptionและระบุมูลค่าของมัน หากไม่มีคีย์ให้สร้างขึ้น
นี่คือภาพตัวอย่าง:
ป้อนคำอธิบายภาพที่นี่ ตรวจสอบให้แน่ใจด้วยว่าค่าของคีย์Bundle nameไม่ว่างเปล่าในinfo.plistไฟล์

ตอนนี้เมื่อเรามีคำอธิบายแล้วเราสามารถขอการอนุญาตได้โดยrequestAuthorizationใช้วิธีการโทร:

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    switch (status) {
        case PHAuthorizationStatusAuthorized:
            NSLog(@"PHAuthorizationStatusAuthorized");
            break;
        case PHAuthorizationStatusDenied:
            NSLog(@"PHAuthorizationStatusDenied");
            break;
        case PHAuthorizationStatusNotDetermined:
            NSLog(@"PHAuthorizationStatusNotDetermined");
            break;
        case PHAuthorizationStatusRestricted:
            NSLog(@"PHAuthorizationStatusRestricted");
            break;
    }
}];

หมายเหตุ 1: requestAuthorizationไม่แสดงการแจ้งเตือนทุกครั้งที่โทร แสดงครั้งต่อครั้งบันทึกคำตอบของผู้ใช้และส่งกลับทุกครั้งแทนที่จะแสดงการแจ้งเตือนอีกครั้ง แต่เนื่องจากไม่ใช่สิ่งที่เราต้องการนี่คือรหัสที่มีประโยชน์ซึ่งจะแสดงการแจ้งเตือนทุกครั้งที่เราต้องการการอนุญาต (พร้อมการเปลี่ยนเส้นทางไปยังการตั้งค่า)

- (void)requestAuthorizationWithRedirectionToSettings {
    dispatch_async(dispatch_get_main_queue(), ^{
        PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
        if (status == PHAuthorizationStatusAuthorized)
        {
            //We have permission. Do whatever is needed
        }
        else
        {
            //No permission. Trying to normally request it
            [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
                if (status != PHAuthorizationStatusAuthorized)
                {
                    //User don't give us permission. Showing alert with redirection to settings
                    //Getting description string from info.plist file
                    NSString *accessDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSPhotoLibraryUsageDescription"];
                    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:accessDescription message:@"To give permissions tap on 'Change Settings' button" preferredStyle:UIAlertControllerStyleAlert];
                    
                    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
                    [alertController addAction:cancelAction];
                    
                    UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:@"Change Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
                    }];
                    [alertController addAction:settingsAction];
                    
                    [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
                }
            }];
        }
    });
}

ปัญหาทั่วไป 1:ผู้ใช้บางรายบ่นว่าแอปไม่แสดงการแจ้งเตือนหลังจากทำการเปลี่ยนแปลงinfo.plistไฟล์ดังกล่าวข้างต้น
วิธีแก้ไข: สำหรับการทดสอบให้ลองเปลี่ยนBundle Identifierจากไฟล์โครงการเป็นอย่างอื่นให้ล้างและสร้างแอปใหม่ หากเริ่มทำงานแล้วทุกอย่างเรียบร้อยดีให้เปลี่ยนชื่อกลับ

ปัญหาทั่วไปที่ 2:มีบางกรณีที่ไม่ได้รับการอัปเดตผลลัพธ์การดึงข้อมูล (และมุมมองที่ใช้รูปภาพจากคำขอดึงข้อมูลเหล่านั้นยังคงว่างเปล่าตามนั้น) เมื่อแอปได้รับอนุญาตให้ใช้รูปภาพในขณะที่ทำงานตามที่สัญญาไว้ในเอกสารประกอบ
จริงๆแล้วมันเกิดขึ้นเมื่อเราใช้รหัสผิดเช่นนี้:

- (void)viewDidLoad {
    if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
    {
        //Reloading some view which needs photos
        [self reloadCollectionView];
        // ...
    } else {
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            if (status == PHAuthorizationStatusAuthorized)
                [self reloadCollectionView];
            // ...
        }];
    }
    // ...
}

ในกรณีนี้หากผู้ใช้ปฏิเสธการให้สิทธิ์viewDidLoadแล้วข้ามไปที่การตั้งค่าอนุญาตและข้ามกลับไปที่แอปการดูจะไม่ถูกรีเฟรชเนื่องจาก[self reloadCollectionView]ไม่ได้ส่งคำขอเรียกข้อมูล
วิธีแก้ไข: เราต้องโทร[self reloadCollectionView]และทำการร้องขอการดึงข้อมูลอื่น ๆ ก่อนที่จะต้องได้รับอนุญาตเช่นนี้:

- (void)viewDidLoad {
    //Reloading some view which needs photos
    [self reloadCollectionView];
    if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
    {
        // ...
}

คุณเชื่อมโยงการตั้งค่าของแอปกับสิทธิ์ได้อย่างไร?
user2924482

20

ฉันทำแบบนี้:

- (void)requestPermissions:(GalleryPermissions)block
{
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

    switch (status) 
    {
        case PHAuthorizationStatusAuthorized:
            block(YES);
            break;
        case PHAuthorizationStatusNotDetermined:
        {
            [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus authorizationStatus)
            {
                if (authorizationStatus == PHAuthorizationStatusAuthorized)
                {
                    block(YES);
                }
                else
                {
                    block(NO);
                }
            }];
            break;
        }
        default:
            block(NO);
            break;
    }
}

และฉันส่งสิ่งที่ฉันต้องทำเป็นบล็อกขึ้นอยู่กับความสำเร็จหรือความล้มเหลว


8

อัปเดตสำหรับ: SWIFT 3 IOS10.0


หมายเหตุ: นำเข้ารูปภาพใน AppDelegate.swift ดังต่อไปนี้

// AppDelegate.swift

นำเข้า UIKit

นำเข้ารูปภาพ

...


func applicationDidBecomeActive(_ application: UIApplication) {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    photoLibraryAvailabilityCheck()

}

//MARK:- PHOTO LIBRARY ACCESS CHECK
func photoLibraryAvailabilityCheck()
{
    if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.authorized
    {

    }
    else
    {
        PHPhotoLibrary.requestAuthorization(requestAuthorizationHandler)
    }
}
func requestAuthorizationHandler(status: PHAuthorizationStatus)
{
    if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.authorized
    {

    }
    else
    {
        alertToEncouragePhotoLibraryAccessWhenApplicationStarts()
    }
}

//MARK:- CAMERA & GALLERY NOT ALLOWING ACCESS - ALERT
func alertToEncourageCameraAccessWhenApplicationStarts()
{
    //Camera not available - Alert
    let internetUnavailableAlertController = UIAlertController (title: "Camera Unavailable", message: "Please check to see if it is disconnected or in use by another application", preferredStyle: .alert)

    let settingsAction = UIAlertAction(title: "Settings", style: .destructive) { (_) -> Void in
        let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString)
        if let url = settingsUrl {
            DispatchQueue.main.async {
                UIApplication.shared.open(url as URL, options: [:], completionHandler: nil) //(url as URL)
            }

        }
    }
    let cancelAction = UIAlertAction(title: "Okay", style: .default, handler: nil)
    internetUnavailableAlertController .addAction(settingsAction)
    internetUnavailableAlertController .addAction(cancelAction)
    self.window?.rootViewController!.present(internetUnavailableAlertController , animated: true, completion: nil)
}
func alertToEncouragePhotoLibraryAccessWhenApplicationStarts()
{
    //Photo Library not available - Alert
    let cameraUnavailableAlertController = UIAlertController (title: "Photo Library Unavailable", message: "Please check to see if device settings doesn't allow photo library access", preferredStyle: .alert)

    let settingsAction = UIAlertAction(title: "Settings", style: .destructive) { (_) -> Void in
        let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString)
        if let url = settingsUrl {
            UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
        }
    }
    let cancelAction = UIAlertAction(title: "Okay", style: .default, handler: nil)
    cameraUnavailableAlertController .addAction(settingsAction)
    cameraUnavailableAlertController .addAction(cancelAction)
    self.window?.rootViewController!.present(cameraUnavailableAlertController , animated: true, completion: nil)
}

คำตอบอัปเดตจากAlvin George


6

iOS 14เป็นต้นไป Apple ได้เพิ่มคุณสมบัติใหม่ที่จะช่วยให้เข้าถึงคลังรูปภาพได้อย่าง จำกัด ตามความต้องการของคุณ (ตัวอย่างการสร้างแกลเลอรีรูปภาพที่กำหนดเอง) คุณต้องตรวจสอบว่าผู้ใช้ได้ให้สิทธิ์การเข้าถึงแบบ จำกัด เท่านั้นหรือไม่และต้องการให้สิทธิ์เข้าถึงอย่างเต็มที่

สำหรับความเข้ากันได้ย้อนหลังเวอร์ชันเก่าที่ไม่มีพารามิเตอร์จะส่งคืนได้รับอนุญาตแม้ว่าคุณจะได้รับการเข้าถึงที่ จำกัด

สวิฟต์ 5 :

switch PHPhotoLibrary.authorizationStatus(for: .readWrite) {
case .notDetermined:
    // ask for access
case .restricted, .denied:
    // sorry
case .authorized:
    // we have full access
 
// new option: 
case .limited:
    // we only got access to some photos of library
}

มีรหัสสำหรับเรียกหน้าจอ จำกัด การเข้าถึงอีกครั้ง หากผู้ใช้ให้การเข้าถึงแบบ จำกัด เท่านั้นและคุณต้องการให้ผู้ใช้เลือกภาพอีกครั้ง

PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: presentVCObj)

ทุกครั้งที่รีสตาร์ทแอป iOS จะแสดงการแจ้งเตือนเพื่อแจ้งให้ผู้ใช้ทราบเกี่ยวกับการเข้าถึงที่ จำกัด หากคุณต้องการหยุดการแจ้งเตือนนั้นPHPhotoLibraryPreventAutomaticLimitedAccessAlertให้เพิ่ม YES ในInfo.plist


1
โซลูชันนี้ไม่ทำงาน PHPhotoLibraryPreventAutomaticLimitedAccessAlert ตั้งค่าเป็น YES มีการตั้งค่าอื่น ๆ ที่ต้องทำหลังจากเพิ่มคีย์นี้ใน info.plist หรือไม่
Hardik Thakkar

5

การใช้ ALAssetsLibrary ควรใช้งานได้:

ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
switch (status) {
    case ALAuthorizationStatusNotDetermined: {
        // not determined
        break;
    }
    case ALAuthorizationStatusRestricted: {
        // restricted
        break;
    }
    case ALAuthorizationStatusDenied: {
        // denied
        break;
    }
    case ALAuthorizationStatusAuthorized: {
        // authorized
        break;
    }
    default: {
        break;
    }
}

3
คำตอบที่ดี แต่เลิกใช้แล้วใน iOS 9
Supertecnoboff

4
I have a simple solution on swift 2.0

//
//  AppDelegate.swift
//  HoneyBadger
//
//  Created by fingent on 14/08/15.
//  Copyright (c) 2015 fingent. All rights reserved.
//

import UIKit
import Photos

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        self.window?.makeKeyAndVisible()

             self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginPageID")
            self.window?.rootViewController = initialViewController
            self.window?.makeKeyAndVisible()
        return true
    }
    func applicationDidEnterBackground(application: UIApplication) {
        print("Application On background", terminator: "")
    }
    func applicationDidBecomeActive(application: UIApplication) {
        cameraAllowsAccessToApplicationCheck()
        photoLibraryAvailabilityCheck()
    }
    //MARK:- CAMERA ACCESS CHECK
    func cameraAllowsAccessToApplicationCheck()
    {
        let authorizationStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)
        switch authorizationStatus {
        case .NotDetermined:
            // permission dialog not yet presented, request authorization
            AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo,
                completionHandler: { (granted:Bool) -> Void in
                    if granted {
                        print("access granted", terminator: "")
                    }
                    else {
                        print("access denied", terminator: "")
                    }
            })
        case .Authorized:
            print("Access authorized", terminator: "")
        case .Denied, .Restricted:
            alertToEncourageCameraAccessWhenApplicationStarts()
        default:
            print("DO NOTHING", terminator: "")
        }
    }
    //MARK:- PHOTO LIBRARY ACCESS CHECK
    func photoLibraryAvailabilityCheck()
    {
        if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.Authorized
        {

        }
        else
        {
            PHPhotoLibrary.requestAuthorization(requestAuthorizationHandler)
        }
    }
    func requestAuthorizationHandler(status: PHAuthorizationStatus)
    {
        if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.Authorized
        {

        }
        else
        {
            alertToEncouragePhotoLibraryAccessWhenApplicationStarts()
        }
    }

    //MARK:- CAMERA & GALLERY NOT ALLOWING ACCESS - ALERT
    func alertToEncourageCameraAccessWhenApplicationStarts()
    {
        //Camera not available - Alert
        let internetUnavailableAlertController = UIAlertController (title: "Camera Unavailable", message: "Please check to see if it is disconnected or in use by another application", preferredStyle: .Alert)

        let settingsAction = UIAlertAction(title: "Settings", style: .Destructive) { (_) -> Void in
            let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString)
            if let url = settingsUrl {
                dispatch_async(dispatch_get_main_queue()) {
                    UIApplication.sharedApplication().openURL(url)
                }

            }
        }
        let cancelAction = UIAlertAction(title: "Okay", style: .Default, handler: nil)
        internetUnavailableAlertController .addAction(settingsAction)
        internetUnavailableAlertController .addAction(cancelAction)
        self.window?.rootViewController!.presentViewController(internetUnavailableAlertController , animated: true, completion: nil)
    }
    func alertToEncouragePhotoLibraryAccessWhenApplicationStarts()
    {
//Photo Library not available - Alert
        let cameraUnavailableAlertController = UIAlertController (title: "Photo Library Unavailable", message: "Please check to see if device settings doesn't allow photo library access", preferredStyle: .Alert)

        let settingsAction = UIAlertAction(title: "Settings", style: .Destructive) { (_) -> Void in
            let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString)
            if let url = settingsUrl {
                UIApplication.sharedApplication().openURL(url)
            }
        }
        let cancelAction = UIAlertAction(title: "Okay", style: .Default, handler: nil)
        cameraUnavailableAlertController .addAction(settingsAction)
        cameraUnavailableAlertController .addAction(cancelAction)
        self.window?.rootViewController!.presentViewController(cameraUnavailableAlertController , animated: true, completion: nil)
    }
}

0

นี่คือตัวอย่างข้อมูลขนาดเล็กและเรียบง่ายที่ฉันมักจะใช้

- (void)requestPhotoAuthorization:(void (^)(BOOL granted))granted
{
    void (^handler)(PHAuthorizationStatus) = ^(PHAuthorizationStatus status)
    {
        if (status == PHAuthorizationStatusAuthorized) granted(YES);
        else if (status == PHAuthorizationStatusNotDetermined) [PHPhotoLibrary requestAuthorization:handler];
        else granted(NO);
    };
    handler([PHPhotoLibrary authorizationStatus]);
}

2
ดูเหมือนว่าจะไม่ได้รับ (YES) หรือได้รับ (NO) หากไม่ได้กำหนด?
เฉดสี

ดังกล่าวข้างต้นจับ + 'จัดการ' มั่นในบล็อกนี้มีแนวโน้มที่จะนำไปสู่การรักษาวงจร
เออร์เนส

0

Swift 2.0+

จากการรวมกันของคำตอบที่นี่ฉันได้สร้างวิธีแก้ปัญหาสำหรับตัวเอง วิธีนี้จะตรวจสอบว่าไม่มีการอนุญาตเท่านั้น

เรามีวิธีการpickVideo()ที่ต้องเข้าถึงภาพถ่าย หากไม่ได้.Authorizedขออนุญาต

หากไม่ได้รับอนุญาตpickVideo()จะไม่ถูกเรียกและผู้ใช้ไม่สามารถเลือกวิดีโอได้

ตราบใดที่ผู้ใช้ไม่ได้ให้สิทธิ์เข้าถึงรูปภาพอย่างเต็มที่คุณสามารถหลีกเลี่ยงไม่ให้พวกเขาเลือก 'หรือขัดข้อง' แอปพลิเคชันของคุณ

  // Method that requires access to photos
  func pickVideo(){
    // Check for permission
    if PHPhotoLibrary.authorizationStatus() != .Authorized{
      // If there is no permission for photos, ask for it
      PHPhotoLibrary.requestAuthorization(requestAuthorizationHandler)
      return
    }
    //... pick video code here...
  }

  func requestAuthorizationHandler(status: PHAuthorizationStatus){
    if PHPhotoLibrary.authorizationStatus() == .Authorized{
      // The user did authorize, so, pickVideo may be opened
      // Ensure pickVideo is called from the main thread to avoid GUI problems
      dispatch_async(dispatch_get_main_queue()) {
        pickVideo()
      }
    } else {
      // Show Message to give permission in Settings
      let alertController = UIAlertController(title: "Error", message: "Enable photo permissions in settings", preferredStyle: .Alert)
      let settingsAction = UIAlertAction(title: "Settings", style: .Default) { (alertAction) in
        if let appSettings = NSURL(string: UIApplicationOpenSettingsURLString) {
          UIApplication.sharedApplication().openURL(appSettings)
        }
      }
      alertController.addAction(settingsAction)
      // If user cancels, do nothing, next time Pick Video is called, they will be asked again to give permission
      let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
      alertController.addAction(cancelAction)
      // Run GUI stuff on main thread
        dispatch_async(dispatch_get_main_queue()) {      
          self.presentViewController(alertController, animated: true, completion: nil)
        }
      }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.