iphone 相册权限没办法开启_苹果请求访问App将在此处显示

iphone 相册权限没办法开启_苹果请求访问App将在此处显示一:打开相册不提示用户权限问题描述:iOS11已经在plist文件中写了相关权限设置,但是在使用UIImagePickerController打开相册的时候却不提示用户选择权限,有以下几条情况:UIImagePickerController同样的设置使用相机会有权限选择提示,设置中也没有关于相册的设置;项目中有用到TZImagePickerCont…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一:打开相册不提示用户权限

问题描述:iOS11已经在plist文件中写了相关权限设置,但是在使用UIImagePickerController打开相册的时候却不提示用户选择权限,有以下几条情况:

  1. UIImagePickerController同样的设置使用相机会有权限选择提示,设置中也没有关于相册的设置;
  2. 项目中有用到TZImagePickerController的第三方库多选照片,他在进入图库的时候就会有权限提示,设置中关于相册的权限是:读与写;
  3. 将图片保存进手机相册会有权限提醒,设置中关于相册的权限是:写入;

带着以上疑问我看了TZImagePickerController的源码,发现他其实是在发现PHAuthorizationStatus为用户未作出明确选择的情况下自己主动请求了一次权限设置,代码如下:

/// Return YES if Authorized 返回YES如果得到了授权
- (BOOL)authorizationStatusAuthorized {
    NSInteger status = [self.class authorizationStatus];
    if (status == 0) {
        /**
         * 当某些情况下AuthorizationStatus == AuthorizationStatusNotDetermined时,无法弹出系统首次使用的授权alertView,系统应用设置里亦没有相册的设置,此时将无法使用,故作以下操作,弹出系统首次使用的授权alertView
         */
        [self requestAuthorizationWithCompletion:nil];
    }
    
    return status == 3;
}

+ (NSInteger)authorizationStatus {
    if (iOS8Later) {
        return [PHPhotoLibrary authorizationStatus];
    } else {
        return [ALAssetsLibrary authorizationStatus];
    }
    return NO;
}

- (void)requestAuthorizationWithCompletion:(void (^)())completion {
    void (^callCompletionBlock)() = ^(){
        dispatch_async(dispatch_get_main_queue(), ^{
            if (completion) {
                completion();
            }
        });
    };
    
    if (iOS8Later) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
                callCompletionBlock();
            }];
        });
    } else {
        [self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
            callCompletionBlock();
        } failureBlock:^(NSError *error) {
            callCompletionBlock();
        }];
    }
}

注:这里主动请求代码权限获得允许后不会跟系统的提示一样直接跳到相册,需要自己通过判断确定,TZImagePickerController的处理办法如下,当然也可以自己在权限设置的block里面设置

//下判断权限,如果没有权限就会先展示一个自定义的页面,然后开始定时器来判断是否已经获取权限,如果获取到权限则跳转到选择图片页面
if (![[TZImageManager manager] authorizationStatusAuthorized]) {
            _tipLabel = [[UILabel alloc] init];
            _tipLabel.frame = CGRectMake(8, 120, self.view.tz_width - 16, 60);
            _tipLabel.textAlignment = NSTextAlignmentCenter;
            _tipLabel.numberOfLines = 0;
            _tipLabel.font = [UIFont systemFontOfSize:16];
            _tipLabel.textColor = [UIColor blackColor];
            NSDictionary *infoDict = [NSBundle mainBundle].localizedInfoDictionary;
            if (!infoDict) {
                infoDict = [NSBundle mainBundle].infoDictionary;
            }
            NSString *appName = [infoDict valueForKey:@"CFBundleDisplayName"];
            if (!appName) appName = [infoDict valueForKey:@"CFBundleName"];
            NSString *tipText = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Allow %@ to access your album in \"Settings -> Privacy -> Photos\""],appName];
            _tipLabel.text = tipText;
            [self.view addSubview:_tipLabel];
            
            if (iOS8Later) {
                _settingBtn = [UIButton buttonWithType:UIButtonTypeSystem];
                [_settingBtn setTitle:self.settingBtnTitleStr forState:UIControlStateNormal];
                _settingBtn.frame = CGRectMake(0, 180, self.view.tz_width, 44);
                _settingBtn.titleLabel.font = [UIFont systemFontOfSize:18];
                [_settingBtn addTarget:self action:@selector(settingBtnClick) forControlEvents:UIControlEventTouchUpInside];
                [self.view addSubview:_settingBtn];
            }
            //开启定时器
            _timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(observeAuthrizationStatusChange) userInfo:nil repeats:YES];
        } else {
            [self pushPhotoPickerVc];
        }

- (void)observeAuthrizationStatusChange {
    if ([[TZImageManager manager] authorizationStatusAuthorized]) {
        [_tipLabel removeFromSuperview];
        [_settingBtn removeFromSuperview];
        [_timer invalidate];
        _timer = nil;
        [self pushPhotoPickerVc];
    }
}

最后总结:打开相册不在需要用户授权,也就是说,默认对手机相册拥有读权限,因此在这里本人也就没有做处理,检查了手机上新更新的其他软件,如果只需要访问手机相册也都没有设置。等上线的时候看一下会不会被拒再来更新,如果已经有做过实验的小伙伴谢谢告诉我一声,不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190821.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm设置成中文_怎样将pycharm变成中文版的

    pycharm设置成中文_怎样将pycharm变成中文版的Pycharm作为一款IDE,经常作为python编译器。很多人在用pycharm时都是英文格式,现在,本文推荐一种可以将其改成中文模式的方法:1.首先,打开pychram中的“File”,找到“Setting”;2.在“Plugins”中找到汉化插件并安装,这样就可以设置成中文。3.如果想改回英文,可以在“已安装”中取消应用插件即可。…

    2022年8月25日
    9
  • js获取当前年,月,日,时,分,秒「建议收藏」

    js获取当前年,月,日,时,分,秒「建议收藏」vardate=newDate();date.getYear();//获取当前年份(2位)date.getFullYear();//获取完整的年份(4位)date.getMon

    2022年7月4日
    26
  • VMware 虚拟机的三种网络连接方式「建议收藏」

    VMware 虚拟机的三种网络连接方式「建议收藏」VMware的虚拟机有三种网络连接方式,分别是桥接(Bridged)模式、NAT模式和仅主机(Host-only)模式。在安装VMware之后,宿主机上会出现几个相关的虚拟设备,每个设备的功能如下:VMnet0:桥接(Bridge)模式下的虚拟交换机。VMnet1:仅主机(Host-only)模式下的虚拟交换机。VMnet8:NAT模式下的虚拟交换机。VMwareNetworkAdapterVMnet1:宿主机与Host-only虚拟网络进行通信的虚拟网卡。VMwareN

    2022年6月20日
    44
  • FLASHFXP3.6注册码「建议收藏」

    FLASHFXP3.6注册码「建议收藏」
    FLASHFXPxgA9UrTnxgAAAAC7W5MNJwTnsl73n0Vuu1AePJgEAG
    41mgSvHSiDWi1Kg8B5xJNCCCAVCMr9Rtmo6u93NoQF27wg6KrQ
    3RIE8Jz6Qy/YlnYIBf58aRJrG7rGITgQJ4KSmyK0wz4xySS+0H
    N/9lJ65abJf7rB7m3R2vyjhakIKSzZnquXQ0/Rdv5nMS+Bbc7n
    rMqoYnTURE8jeePVOg

    2022年7月26日
    9
  • System.ArgumentException: 回发或回调参数无效。在配置中使用 < pages enableEventValidation=”true”/>

    System.ArgumentException: 回发或回调参数无效。在配置中使用 < pages enableEventValidation=”true”/>关于在同一个页面中使用Gridview控件的时候发现气updaeting事件无法被服务器所响应,看来它的错误报警然后查询了部分资料现在将整理的解决方法总结如下:点击update事件无法响应原因出在回发或回调参数无效。在配置中使用或在页面中使用启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用Clie

    2022年7月24日
    10
  • redis过期key的删除策略[通俗易懂]

    前言在使用redis的过程中,不免会产生过期的key,而这些key过期后并不会实时地马上被删除,当这些key数量累积越来越多,就会占用很多内存,因此在redis底层同时使用了三种策略来删除这些key。第一种策略:被动删除当读/写一个key时,redis首先会检查这个key是否存在,如果存在且已过期,则直接删除这个key并返回nil给客户端。第二种策略:定期删除redis中有一系列的定期任务(serverCron),这些任务每隔一段时间就会运行一次,其中就包含清理过期key的任务,运行频率由配置文件

    2022年4月8日
    68

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号