2016-09-07 2 views
6

Теперь для iOS 10 требуется разрешение пользователя на доступ к медиатеке. Мы проверяем, есть ли у нас доступ к Медиа-библиотеке, прежде чем мы ее используем, а если нет, то мы будем использовать [MPMediaLibrary requestAuthorization: для повторного запроса авторизации от пользователя.Запросить авторизацию Media Library программно не удается

Я ожидаю, что это покажет тот же всплывающий запрос для доступа к медиа-библиотеке, которую мы получаем при запуске приложения, но ничего не происходит. Он просто возвращается с статуса 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... 
      } 
     }]; 
    } 

Update

Видимо нет никакого способа, чтобы вызвать первоначальный диалог вновь (см комментарии ниже). Я теперь использую этот код, чтобы по крайней мере отвезти меня в нужное место в настройках, чтобы пользователь мог внести изменения. (для iOS8 и выше)

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

Отклонено обычно не совпадает с «не определено», которое вы должны получить. Разве вы не отказали в доступе при первом запуске приложения? Вам придется сбросить это, если это так (либо в Настройках, либо удалив, а затем переустановив приложение)? – jcaron

+0

Да, мы запретили доступ, когда начальный диалог был представлен при первом запуске приложения. Однако, какова точка вызова 'requestAuthorization' MPMediaLibrary, если он не вызывает повторное появление этого приглашения. В противном случае это то же самое, что просто сделать «MPMediaLibrary.authorizationStatus» и сообщить о существующем статусе. Это не то, что нам нужно. –

+0

Все диалоги авторизации iOS Я знаю, что они работают одинаково: они спрашивают один раз и помнят, что выбрал пользователь. Они никогда больше не показываются для данного приложения, если оно не удалено. Единственный способ изменить выбор после этого - через приложение «Настройки». Точка вызова - показать диалог в первый раз. – 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]; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^