PHPhotoLibrary 请求授权,不请求

Posted

技术标签:

【中文标题】PHPhotoLibrary 请求授权,不请求【英文标题】:PHPhotoLibrary requestAuthorization, not requesting 【发布时间】:2016-01-29 11:28:12 【问题描述】:

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

更新: 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”就会崩溃。

【问题讨论】:

这里描述了缓存授权状态响应问题的解决方案(即使在应用程序删除后):***.com/questions/27726354/… 【参考方案1】:

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

来自 Apple:

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

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

【讨论】:

请看我的回答:***.com/questions/26595343/… 从链接的答案中,解决方法是更改​​捆绑标识符。似乎问题仍然存在;也就是说,一旦写入,就无法“重置”应用程序的捆绑 ID,除非完全重置设备。当然,在模拟器上,删除设备就可以了。【参考方案2】:

重要的是将此添加到您的应用程序 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) 
        
];

祝你好运!

【讨论】:

我同时拥有Privacy - Photo Library Usage DescriptionPrivacy - Photo Library Additions Usage Description(iOS 11 下的新功能)。没有它们,应用程序将简单地崩溃。问题是触发第一个系统弹出窗口。现已在iOS 11下解决。删除应用后系统会再次请求权限。 @bauerMusic 知道了,看来我还没有读完你的问题,就直接回答了。 )) 我应该删除帖子还是仍然有用? 由你决定。我想删除整个帖子(因为它不再相关),但会留下记录。谢谢!

以上是关于PHPhotoLibrary 请求授权,不请求的主要内容,如果未能解决你的问题,请参考以下文章

在 PHPhotoLibrary 中禁用删除请求的确认

重置 [PHPhotoLibrary 授权状态]

Apple 文档中 PHAsset 中的 PH 代表啥?

使用不记名令牌授权 Azure 请求?

嵌入式框架中的 CLLocationManager 实例不请求授权?

为啥请求中不包含授权标头? - 认证0