2016-09-07 6 views
6

आईओएस 10 अब मीडिया लाइब्रेरी तक पहुंचने के लिए उपयोगकर्ता की अनुमति की आवश्यकता है। हम जांच करते हैं कि हमारे पास इसका उपयोग करने से पहले मीडिया लाइब्रेरी तक पहुंच है या नहीं, और यदि हम नहीं तो उपयोगकर्ता से प्राधिकरण का अनुरोध करने के लिए [MPMediaLibrary requestAuthorization: का उपयोग करें।मीडिया लाइब्रेरी के लिए प्रमाणीकरण अनुरोध

मुझे उम्मीद है कि यह मीडिया लाइब्रेरी तक पहुंचने के लिए एक ही पॉपअप अनुरोध दिखाने की उम्मीद है जिसे हम ऐप स्टार्टअप पर प्राप्त करते हैं, लेकिन कुछ भी नहीं होता है। यह पहले से MPMediaLibraryAuthorizationStatusDenied स्थिति के साथ वापस आ रहा है।

docs for requestAuthorization इस समय अपूर्ण हैं, इसलिए मैं यह नहीं बता सकता कि मैं इसे गलत तरीके से उपयोग कर रहा हूं, या कुछ और गलत है।

if (MPMediaLibrary.authorizationStatus == MPMediaLibraryAuthorizationStatusAuthorized) 
    { 
     // we already have access to the Media Library - use it here... 
    } 
    else 
    { 
     // We expect this to show a popup so the user can grant access, but does not work 
     [MPMediaLibrary requestAuthorization:^(MPMediaLibraryAuthorizationStatus authorizationStatus) 
     { 
      if (authorizationStatus == MPMediaLibraryAuthorizationStatusAuthorized) 
      { 
       // success: the user authorized - use it here... 
      } 
      else 
      { 
       // user did not authorize - tell user why here... 
      } 
     }]; 
    } 

अद्यतन

जाहिर है वहाँ फिर से प्रकट होना (नीचे टिप्पणी देखें) मूल संवाद पैदा करने के लिए कोई रास्ता नहीं है। अब मैं कम से कम सेटिंग्स में सही जगह पर ले जाने के लिए इस कोड का उपयोग कर रहा हूं ताकि उपयोगकर्ता परिवर्तन कर सके। (IOS8 के लिए और परे)

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; 
[[UIApplication sharedApplication] openURL:url]; 
+0

अस्वीकृत सामान्यतः "निर्धारित नहीं" से अलग होता है जिसे आपको प्राप्त करना चाहिए। क्या आपने पहली बार एप्लिकेशन चलाने से इनकार नहीं किया था? यदि यह मामला है (या तो सेटिंग में या फिर ऐप को पुनर्स्थापित करने के बाद इसे हटाकर) इसे रीसेट करना होगा)? – jcaron

+0

हां, हमने शुरुआत से इनकार कर दिया जब प्रारंभिक संवाद प्रस्तुत किया गया था जब ऐप शुरू में शुरू हुआ था। हालांकि, 'MPMediaLibrary अनुरोध प्राधिकरण' कॉल का बिंदु क्या है यदि यह इस प्रॉम्प्ट को फिर से प्रकट नहीं करता है। अन्यथा यह केवल 'MPMediaLibrary.authorizationStatus' करने और मौजूदा स्थिति को रिपोर्ट करने जैसा ही है। यही वह नहीं है जो हमें चाहिए। –

+0

सभी आईओएस प्राधिकरण संवाद मुझे काम के बारे में पता है: वे एक बार पूछते हैं, और याद रखें कि उपयोगकर्ता ने क्या चुना है। जब तक यह अनइंस्टॉल नहीं किया जाता है तब तक उन्हें किसी दिए गए ऐप के लिए कभी नहीं दिखाया जाता है। उसके बाद चयन को बदलने का एकमात्र तरीका सेटिंग्स ऐप के माध्यम से है। कॉल का बिंदु पहली बार संवाद दिखाना है। – jcaron

उत्तर

5

MPMediaLibrary केवल स्वचालित रूप से एक बार उपयोगकर्ता का संकेत देगा। राज्य MPMediaLibraryAuthorizationStatusNotDetermined है यदि आप इसे उपयोगकर्ता द्वारा दिए जाने या अस्वीकार करने से पहले पूछते हैं। अगर उन्होंने पहले पहुंच से इंकार कर दिया है, तो आपको उपयोगकर्ता को सिस्टम सेटिंग्स में भेजना होगा ताकि वे इसे आपके ऐप के लिए मैन्युअल रूप से चालू कर सकें।

निम्नलिखित कोड यह है कि हम इसे कैसे कर रहे हैं।

+ (void) validateMediaLibraryForMinimumIosAndAboveWithViewController:(UIViewController *)viewController 
                 ifAuthorized:(void(^)())authorizedBlock 
                ifNotAuthorized:(void(^)())notAuthorizedBlock 
{ 
    MPMediaLibraryAuthorizationStatus authorizationStatus = MPMediaLibrary.authorizationStatus; 

    switch (authorizationStatus) 
    { 
     case MPMediaLibraryAuthorizationStatusAuthorized: 
     { 
      // We are already authorized - proceed 
      if(authorizedBlock) 
      { 
       authorizedBlock(); 
      } 
      break; 
     } 
     case MPMediaLibraryAuthorizationStatusNotDetermined: 
     { 
      // Not yet authorized - request it from the system 
      [MPMediaLibrary requestAuthorization:^(MPMediaLibraryAuthorizationStatus authorizationStatus) 
      { 
       if (authorizationStatus == MPMediaLibraryAuthorizationStatusAuthorized) 
       { 
        if(authorizedBlock) 
        { 
         authorizedBlock(); 
        } 
       } 
       else 
       { 
        PLog(@"The Media Library was not authorized by the user"); 
        if(notAuthorizedBlock) 
        { 
         notAuthorizedBlock(); 
        } 
       } 
      }]; 
      break; 
     } 

     case MPMediaLibraryAuthorizationStatusRestricted: 
     case MPMediaLibraryAuthorizationStatusDenied: 
     { 
      // user has previously denied access. Ask again with our own alert that is similar to the system alert 
      // then take them to the System Settings so they can turn it on for the app 
      NSString *titleString = NSLocalizedStringWithDefaultValue(@"Media Library Privacy Alert Title", 
                     @"Localizable", 
                     [NSBundle mainBundle], 
                     @"Would Like to Access Apple Music And Your Media Library", 
                     @"Title for dialog requesting media library access"); 

      [self displayPermissionAlertFromViewController:viewController 
               withTitle:titleString]; 
      if(notAuthorizedBlock) 
      { 
       notAuthorizedBlock(); 
      } 
      break; 
     } 
    } 
} 

+ (void)displayPermissionAlertFromViewController:(UIViewController *)viewController withTitle:(NSString *)title 
{ 
    NSString* appName = [[NSProcessInfo processInfo] processName]; 

    NSString *titleString = [NSString stringWithFormat:@"\"%@\" %@",appName, title]; 

    NSString *cancelString = NSLocalizedStringWithDefaultValue(@"Don't Allow", 
                   @"Localizable", 
                   [NSBundle mainBundle], 
                   @"Don't Allow", 
                   @"Don't allow button"); 

    NSString *settingsString = NSLocalizedStringWithDefaultValue(@"Settings", 
                   @"Localizable", 
                   [NSBundle mainBundle], 
                   @"Settings", 
                   @"Settings button label"); 

    UIAlertController *alertController = [UIAlertController 
              alertControllerWithTitle:titleString 
              message:nil 
              preferredStyle:UIAlertControllerStyleAlert]; 

    [alertController addAction:[UIAlertAction actionWithTitle:cancelString 
                 style:UIAlertActionStyleDefault 
                 handler:nil]]; 

    [alertController addAction:[UIAlertAction actionWithTitle:settingsString 
                 style:UIAlertActionStyleDefault 
                 handler: 
           ^(UIAlertAction * _Nonnull action) 
           { 
            NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; 
            [[UIApplication sharedApplication] openURL:url]; 
           }]]; 

    [viewController presentViewController:alertController animated:true completion:nil]; 
} 
संबंधित मुद्दे