iOS 10现在需要用户访问媒体库的权限。在使用之前,我们检查是否可以访问媒体库,如果没有,则使用[MPMediaLibrary requestAuthorization:再次向用户请求授权。
我希望这将显示与我们在应用程序启动时获得的访问媒体库的弹出式请求相同,但什么也没有发生。它只是返回了以前的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...
}
}];
}更新
显然,没有办法使原来的对话框重新出现(见下面的注释)。现在我正在使用这段代码至少带我到设置正确的位置,这样用户就可以进行更改了。(适用于iOS8及以后)
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];发布于 2016-10-29 12:42:26
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];
}https://stackoverflow.com/questions/39374951
复制相似问题