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