2

为了测试,我试图重新创建系统“请求访问”弹出体验。

更新:
iOS 11下,删除App后,系统弹窗会再次出现。


(上一个问题)

应用程序第一次运行(也是唯一一次)时,系统弹出窗口显示,请求访问。之后,即使删除应用程序并重新启动设备也不会再次触发该弹出窗口。

换句话说,设备会“记住”用户请求,并且无法重置它。

这是代码:

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {

    switch (status) {
        case PHAuthorizationStatusAuthorized:
            NSLog(@"PHAuthorizationStatusAuthorized");
            break;

        case PHAuthorizationStatusDenied:
            NSLog(@"PHAuthorizationStatusDenied");
            break;
        case PHAuthorizationStatusNotDetermined:
            NSLog(@"PHAuthorizationStatusNotDetermined");
            break;
        case PHAuthorizationStatusRestricted:
            NSLog(@"PHAuthorizationStatusRestricted");
            break;
    }

}];

在设置中关闭访问时,它会继续打印“PHAuthorizationStatusDenied”。但不显示任何弹出窗口。立即返回。

建议将“捆绑显示名称”添加到 plist。尝试无济于事,空值、$(PRODUCT_NAME) 和不同的字符串。

清理项目,删除 DrivedData(每次都从模拟器中删除 App)。没运气。

更多信息:

一旦您在“设置”中关闭照片访问,Apple 示例代码“SamplePhotosApp”就会崩溃。

4

2 回答 2

2

经过进一步阅读,这似乎是设计使然。

来自苹果:

此方法总是立即返回。如果用户先前已 授予或拒绝照片库访问权限,则在调用时执行处理程序块;否则,它会显示警报并仅在用户响应警报后才执行该块。

如果用户被提示一次,则说“此方法总是立即返回”。之后它将不再显示请求。似乎没有办法(但一些自定义消息)再次使用系统消息。

于 2016-01-29T12:13:07.520 回答
1

重要的是将此添加到您的应用程序 Info.plist 文件中。“隐私 - 照片库使用说明”

我使用了这样的东西:“用于访问照片库中的照片。”

此描述将显示在请求访问警报框中。如果需要,可以本地化。

+ (void)imageLibraryCheckAccess:(UIViewController *)presenting
                        handler:(void (^)(PHAuthorizationStatus status))handler
{
        PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
        if (status == PHAuthorizationStatusNotDetermined) {
                [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
                        if (status != PHAuthorizationStatusAuthorized) {
                                if (handler != nil)
                                        handler(status);
                                NSString *title = NSLocalizedStringWithDefaultValue(@"photo.library.access.disabled.alert.title",
                                                                                    @"Localizable",  [NSBundle mainBundle],
                                                                                    @"Photos access", @"Alert title.");
                                NSString *text = NSLocalizedStringWithDefaultValue(@"photo.library.access.disabled.alert.text",
                                                                                   @"Localizable",  [NSBundle mainBundle],
                                                                                   @"You explicitly disabled photo library access. This results in inability to work with photos.",
                                                                                   @"Alert text.");
                                [self alertWithPresenting:presenting title:title text:text buttons:@[[L10n okButton]]
                                                  handler:nil];
                        } else if (status == PHAuthorizationStatusAuthorized) {
                                if (handler != nil)
                                        handler(status);
                        }
                }];
        } else if (status != PHAuthorizationStatusAuthorized) {
                if (handler != nil)
                        handler(status);
                NSString *title = NSLocalizedStringWithDefaultValue(@"photo.library.access.notauthorized.alert.title",
                                                                    @"Localizable",  [NSBundle mainBundle],
                                                                    @"Photos access", @"Alert title.");
                NSString *text = NSLocalizedStringWithDefaultValue(@"photo.library.access.notauthorized.alert.text",
                                                                   @"Localizable",  [NSBundle mainBundle],
                                                                   @"Photo library access is disabled. Please check the application permissions or parental control settings in order to work with photos.", @"Alert text.");
                [self alertWithPresenting:presenting title:title text:text buttons:@[[L10n okButton]]
                                  handler:nil];
        } else if (status == PHAuthorizationStatusAuthorized) {
                if (handler != nil)
                        handler(status);
        }
}

这是我使用它的方式:

[YourClassName imageLibraryCheckAccess:self handler:^(PHAuthorizationStatus status) {
        if (status == PHAuthorizationStatusAuthorized) {
        }
}];

祝你好运!

于 2018-02-08T08:31:08.463 回答