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

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


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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 商品管理系统_营销系统四大系统

    商品管理系统_营销系统四大系统题目:商品管理系统语言和环境实现语言Java环境要求JDK8,IDEA,Tomcat7,MySQL功能要求项目开发使用SSM(Mybatis+Spring+Springmvc)实现商品

    2022年8月3日
  • 12 – 利用LinuxPTP进行时间同步(软/硬件时间戳) – 研一

    12 – 利用LinuxPTP进行时间同步(软/硬件时间戳) – 研一1、LinuxPTP源码下载sudogitclonegit://git.code.sf.net/p/linuxptp/codelinuxptpcdlinuxptpsudomakesudomakeinstall查看Usageptp4l-h延迟机制选项-A Auto,从E2E开…

    2022年7月21日
  • ibatis isnotequal_英语中is和are的用法

    ibatis isnotequal_英语中is和are的用法一:isEquals用于动态拼接sql如下实例:如果status的状态为0,则更新attribute1;状态为1,则更新attribute2;状态为2,则更新attribute3。<updateid="topup.doEffect"parameterClass="java.util.HashMap">updatecis_customersetcode_id=…

    2022年9月28日
  • Java中double转BigDecimal的注意事项

    Java中double转BigDecimal的注意事项先上结论:不要直接用double变量作为构造BigDecimal的参数。 线上有这么一段Java代码逻辑:1,接口传来一个JSON串,里面有个数字:57.3。2,解析JSON并把这个数字保存在一个float变量。3,把这个float变量赋值给一个BigDecimal对象,用的是BigDecimal的double参数的构造:  newBigDecimal(double…

    2022年5月2日
  • 完全卸载Office_vs卸载不了也安装不了了

    完全卸载Office_vs卸载不了也安装不了了  手动卸载步骤:   VisualStudioExpressEditions进入控制面板,运行添加或删除程序 卸载”MSDNLibraryforVisualStudio2005Beta” 卸载”MicrosoftSQLServer2005ExpressEdition” 卸载”MicrosoftSQLServer2005ToolsExpressEdition” 卸载”MicrosoftSQLNativeClient” 卸载”DMATranspor

    2022年9月14日
  • 计算机管理的事件id,事件查看器7035是什么意思_windows事件查看器常见ID代码含义详解…「建议收藏」

    计算机管理的事件id,事件查看器7035是什么意思_windows事件查看器常见ID代码含义详解…「建议收藏」windows系统事件查看器7035是什么意思呢?windows事件查看器有一个事件ID,这个事件ID由不同的数字表示,比如7035、7036、6005、6006等等,不同的数字代表不同的含义。大部分用户不知道事件查看器ID表示什么含义,这边系统城小编为大家整理分享windows事件查看器常见的事件ID所代表的含义。一、Windows事件查看器打开方法:方法一:右键计算机/此电脑/我的电脑—管理—…

    2022年11月2日

发表回复

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

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