यह निर्धारित करें कि फोटो लाइब्रेरी की पहुँच निर्धारित है या नहीं - PHPhotoLibrary


101

IOS 8 में नई कार्यक्षमता के साथ, यदि आप ऐप में एक कैमरा का उपयोग कर रहे हैं, तो यह कैमरे तक पहुंचने की अनुमति मांगेगा और फिर जब आप पिक को रीटेक करने का प्रयास करेंगे, तो यह फोटो लाइब्रेरी तक पहुंचने की अनुमति मांगता है। अगली बार जब मैं ऐप लॉन्च करता हूं, तो मैं यह जांचना चाहता हूं कि कैमरा और फोटो लाइब्रेरी के पास इसकी अनुमति है या नहीं।

यहां छवि विवरण दर्ज करें

कैमरे के लिए, मैं इसे चेक करता हूं

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

मैं फोटो लाइब्रेरी के लिए कुछ इसी तरह की तलाश कर रहा हूं।

जवाबों:


85

जांचें +[PHPhotoLibrary authorizationStatus]- यदि सेट नहीं किया गया है, तो यह वापस आ जाएगा PHAuthorizationStatusNotDetermined। (आप फिर +requestAuthorization:उसी कक्षा का उपयोग करके अनुरोध कर सकते हैं ।)


क्या PHPhotoLibrary का उपयोग करने के लिए मुझे किसी फाउंडेशन या लाइब्रेरी को जोड़ने / आयात करने की आवश्यकता है? मुझे एक त्रुटि मिल रही है "अघोषित पहचानकर्ता का उपयोग"
Tech_human

2
मैंने प्राधिकरण स्थिति की जांच करने के बजाय "ALAssetsLibrary" का उपयोग करने की कोशिश की और फोटो लाइब्रेरी के बंद होने पर भी YES लौटाता है।
Tech_human

ओह "ALAssetsLibrary" का उपयोग करके स्थिति प्राप्त करने में सक्षम हूं। अभी भी यह जानने के लिए उत्सुक हैं कि क्या PHPhoto लाइब्रेरी का उपयोग करना संभव है।
tech_human

3
PHPhotoibrary फोटो फ्रेमवर्क का हिस्सा है, जो केवल iOS 8 पर उपलब्ध है। यदि आपको iOS के पुराने संस्करणों के लिए समर्थन की आवश्यकता है, तो ALAssetsLibrary शायद आपका सबसे अच्छा दांव है।
टिम

अच्छी तरह से iOS 9 के रूप में, ALAssetsLibrary को हटा दिया गया है, इसलिए मुझे लगता है कि इसके काम नहीं करने के कारण।
सुपरटेकनोबॉफ़

131

मुझे पता है कि यह पहले ही उत्तर दे दिया गया है, लेकिन सिर्फ @ उत्तर पर विस्तार करने के लिए, यहां आपको आवश्यक कोड है (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>

यदि आप स्विफ्ट 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áz Vincze

1
> लक्ष्य - -> बिल्ड के चरण इसके अलावा परियोजना में फ्रेमवर्क तस्वीरें जोड़ने के लिए भूल नहीं है
stellz

यह ठीक से काम नहीं करता है, मैंने पहुंच से इनकार किया है फिर इसे फिर से सक्षम करें, यह अभी भी नोटडेटेड कहता है।
टॉमसेवर

"// प्रतिबंधित उपयोग - सामान्य रूप से नहीं होगा।" क्यों? ऐसा हो सकता है: "उपयोगकर्ता इस एप्लिकेशन की स्थिति को नहीं बदल सकता है, संभवतः सक्रिय प्रतिबंधों के कारण"
NoKey

क्या PHPhotoibrary.requestAuthorization किसी संवाद को अनुमति मांगने के लिए मानती है? इस लाइन को कॉल करने वाला कॉस राइट कुछ भी नहीं करता है
iori24

49

बस औपचारिकता के रूप में, स्विफ्ट 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
               }
            }
        }
    }

और स्विफ्ट 3 / स्विफ्ट 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
में स्विफ्ट 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

के लिए अद्यतन: स्विफ्ट 3 IOS10


नोट: 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)
}

उत्तर एल्विन जॉर्ज से अद्यतन


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 में
चित्रित है

3
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

स्विफ्ट 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)
        }
      }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.