Objective C - 如何检测用户点击了不允许访问照片按钮

Posted

技术标签:

【中文标题】Objective C - 如何检测用户点击了不允许访问照片按钮【英文标题】:Objective C - How to detect user has clicked Don't Allow access to photos button 【发布时间】:2013-02-07 02:33:00 【问题描述】:

我正在使用 UIImagePicker 向用户展示照片,以便用户可以选择要在我的应用中使用的图像。

我的问题是,当用户第一次打开图像选择器时,他们会看到一个提示:“我的应用程序”想要访问您的照片,有两个选项,不允许和确定。

我的要求是当用户单击不允许时,图像选择器会被关闭。

有没有办法检测到用户选择了不允许?

目前它让用户处于丑陋的空白模式视图中。如果用户再次打开图像选择器,他们会显示苹果提供的漂亮消息“此应用无权访问您的照片等”

这是我如何使用图像选择器:

self.imagePickerController = [[UIImagePickerController alloc] init];
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:self.imagePickerController animated:YES];

【问题讨论】:

我想我可以运行一个后台线程,该线程每 0.25 秒不断检查 [ALAssetsLibrary authorizationStatus],然后在它从 ALAuthorizationStatusNotDetermined 更改为其他内容时触发通知。这种hackery不会在我当前的项目上运行。有没有人有更好的方法来检测授权状态发生了变化? 如何检测用户是否点击了不允许访问相机按钮? 【参考方案1】:

知道了!

if ([ALAssetsLibrary authorizationStatus] == ALAuthorizationStatusNotDetermined) 
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
        if (*stop) 
            // INSERT CODE TO PERFORM WHEN USER TAPS OK eg. :
            return;
        
        *stop = TRUE;
     failureBlock:^(NSError *error) 
        // INSERT CODE TO PERFORM WHEN USER TAPS DONT ALLOW, eg. :
        self.imagePickerController dismissViewControllerAnimated:YES completion:nil];
    ];

【讨论】:

差不多。您的if 条件还应检查ALAuthorizationStatusAuthorized。这样,您可以在用户已经授予权限时执行组枚举。您还应该有一个else 部分来通知用户他们无法访问这些照片。 不同意抱歉。在我的情况下,我总是想展示一个 ImagePicker,即使他们没有被授权或尚未确定被授权。我在显示我的图像选择器后调用上面的代码,我的要求是关闭图像选择器。下次显示图像选择器时,它会告诉用户他们已禁止照片隐私设置。 没问题。你的要求和我想的不一样。显然你比我更清楚你需要什么。 :)【参考方案2】:

使用ALAssetsLibrary authorizationStatus。有一个特定的返回值表明您的应用程序已被拒绝。

在此处搜索该方法将显示一些示例代码,用于正确处理各种授权状态。

【讨论】:

谢谢,这是回答问题的一个很好的开始,但我需要知道他们什么时候点击了不允许按钮,这样我才能做出回应,而不仅仅是知道当前的授权状态 它不像那样工作。如果您确定authorizationStatusALAuthorizationStatusAuthorizedALAuthorizationStatusNotDetermined,则继续尝试访问资产。如果未确定状态,则用户会看到警报。如果用户选择“拒绝”,则调用错误块。如果用户选择“允许”(或者状态已经“授权”,则调用完成块。因此您始终检查状态。并且您始终为各种资产枚举和访问方法实现失败块。【参考方案3】:

我遇到了类似的问题。如果它可以帮助将来可能遇到类似问题的任何人,您可以查看下面的代码。我有一个 IBAction 可以帮助我加载图像。我用这种方法挣扎了 4-5 个小时。

(IBAction)loadImages:(id)sender 
    ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];

    if (status == AVAuthorizationStatusAuthorized || status == AVAuthorizationStatusNotDetermined) 

        ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];
        [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
            if (*stop) 
                self.imagePicker = [[UIImagePickerController alloc] init];
                self.imagePicker.delegate = self;
                self.imagePicker.allowsEditing = NO;
                self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
                imagePicker.mediaTypes =[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
                [self presentViewController:imagePicker animated:YES completion:^
                    //TODO
                ];
                return;
            
            *stop = TRUE;
         failureBlock:^(NSError *error) 
            [imagePicker dismissViewControllerAnimated:YES completion:nil];
        ];
    

    if (status == AVAuthorizationStatusDenied || status == AVAuthorizationStatusRestricted) 
        UIAlertView *cameraAlert = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"Camera Access Required", nil) message:NSLocalizedString(@"Please allow us to access your camera roll in your device Settings.", nil) delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
        [cameraAlert show];
    

【讨论】:

以上是关于Objective C - 如何检测用户点击了不允许访问照片按钮的主要内容,如果未能解决你的问题,请参考以下文章

在Objective C中如何更改localNotification的视图

在Objective C中点击后退按钮时如何将界面方向从横向更改为纵向

Objective c 如何从布局内的相机检测对象? [关闭]

如何在 iOS Swift 或 Objective C 中检测 iPhone 卷访问 [关闭]

iOS WKWebview如何检测我何时点击<a>标签内的图像

Objective -C XCTest:如何在表格单元格中一直向上滑动