2016-09-07 1 views
6

iOS 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 requestAuthorization' 호출의 요점은 무엇입니까? 그렇지 않으면 단순히'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]; 
}