以编程方式向媒体库请求授权失败

现在,iOS 10需要用户访问媒体库的权限。 在使用之前,我们检查是否可以访问媒体库,如果没有,我们再使用[MPMediaLibrary requestAuthorization:再次向用户请求授权。

我期待这显示相同的popup式窗口请求来访问我们在应用程序启动时获得的媒体库,但没有任何反应。 它只是从之前的MPMediaLibraryAuthorizationStatusDenied状态返回。

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... } }]; } 

更新

显然没有办法导致原来的对话框重新出现(见下面的注释)。 我现在使用这个代码,至less把我带到设置的正确位置,以便用户可以进行更改。 (适用于iOS8及更高版本)

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

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]; }