iOS - 项目收尾疑难问题解决一:打开相册不提示用户权限

本文主要是介绍iOS - 项目收尾疑难问题解决一:打开相册不提示用户权限,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

问题描述: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];}
}

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

这篇关于iOS - 项目收尾疑难问题解决一:打开相册不提示用户权限的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094570

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D