美文网首页iOS实战Swift&Objective-CiOS开发实录
最友好的访问权限之iOS权限提示

最友好的访问权限之iOS权限提示

作者: WhatHurtsMore | 来源:发表于2017-05-19 19:07 被阅读1560次

    先来看Periscope的两张截图,国内目前还没有见到过细节如此精致的产品。

    Periscope Periscope

    想到国内APP的一个一个挨着点的糟糕体验再对比下Periscope,我的心痒痒了。于是在520这个单身狗的日子里我决定写出来封装出来。

    iOS的各种权限

    1.定位权限 Privacy - Location When In Use Usage Description|Privacy - Location Always Usage Description|Privacy - Location Usage Description

    2.蓝牙权限 Privacy - Bluetooth Peripheral Usage Description

    3.推送权限 (Target-选项开关打开)

    4.媒体资料库权限 Privacy - Media Library Usage Description

    5.语音识别权限 Privacy - Speech Recognition Usage Description

    6.日历权限 Privacy - Calendars Usage Description

    7.相册权限 Privacy - Photo Library Usage Description

    8.相机权限 Privacy - Camera Usage Description

    9.通讯录权限 Privacy - Contacts Usage Description

    10.麦克风权限 Privacy - Microphone Usage Description

    11.提醒事项权限 Privacy - Reminders Usage DescriptionPrivacy - Reminders Usage Description

    12.运动与健身 Privacy - Motion Usage Description

    ....

    一开始想到了前面3个有代理所以画了个脑图决定规划一下,如下:

    1.NSAuthorityStatus

    负责管理权限的各种状态

    NSAuthorityStatus

    2.NSAuthorityProtocol

    负责管理定位变化等前面三个权限的代理

    时间关系实现了第一个协议,一觉睡醒下午3点了。想着一切从简单调用就匆匆搞完第一个协议开始写下面的调用方法。

    NSAuthorityProtocol

    3.NSAuthoritySingleton

    纯属个人爱好的单例使用方法。仁者见仁智者见智了,图没截完整。

    NSAuthoritySingleton

    4.NSAuthorityManager

    顾名思义管理器,负责查看权限是否开启以及相应的调用开启方法。

    NSAuthorityManager

    以语音识别权限为例,Bool方法判断是否开启了语音识别的权限用于项目中进行判断处理,

    SFSpeechRecognizerAuthorizationStatus status = [SFSpeechRecognizer authorizationStatus];

    if (status == SFSpeechRecognizerAuthorizationStatusNotDetermined) {

    DLog(@"语音识别权限:未选择权限(NotDetermined)");

    return NO;

    }else if (status == SFSpeechRecognizerAuthorizationStatusDenied){

    DLog(@"语音识别权限:用户拒绝App使用(Denied)");

    return NO;

    }else if (status == SFSpeechRecognizerAuthorizationStatusRestricted){

    DLog(@"语音识别权限:未授权(Restricted)");

    return NO;

    }

    DLog(@"语音识别权限:已授权(Authorized)"); //SFSpeechRecognizerAuthorizationStatusAuthorized

    return YES;


    void方法则用来开启对应的权限

    [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {

    if (status == SFSpeechRecognizerAuthorizationStatusNotDetermined) {

    DLog(@"语音识别开启权限:未选择权限(NotDetermined)");

    }else if (status == SFSpeechRecognizerAuthorizationStatusDenied){

    DLog(@"语音识别开启权限:用户拒绝App使用(Denied)");

    }else if (status == SFSpeechRecognizerAuthorizationStatusRestricted){

    DLog(@"语音识别开启权限:未授权(Restricted)");

    }else if (status == SFSpeechRecognizerAuthorizationStatusAuthorized){

    DLog(@"语音识别开启权限:已授权(Authorized)");

    }

    }];


    调用方法

    判断是否开启,如果未开启则通过单例调用进行开启操作。个别权限需要直接打开设置进行。则在manager文件里加入:

    #define kStartProgramAuthority [[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{UIApplicationOpenURLOptionUniversalLinksOnly:@""} completionHandler:^(BOOL success) { }];

    即可。


    演示效果

    点击按钮调用权限

    cocoapods

    pod 'NSAuthorityManager'


    Demo地址

    GitHub

    如果对你有帮助那真是太好了,我希望国内程序员做东西越来越走心。太饿了,溜了溜了,闲了再继续完善。


    相关文章

      网友评论

      • 瘦了就是帅哥:写的很好, 建议搞个block 成功和失败的回调, 方便知道用户点击了允许还是取消.做些操作
        -----引用
        LV大树:看样子应该是没有写回调的。
      • 安浪创想:有没有界面跟这个效果图截图一样的
      • 小星星吃KFC:网络连接呢?? 这个必须要的,不然弹不出来 有吗?
        WhatHurtsMore:应该是私有API 放出来没用
      • b8e6682d009f:👍,不过cocoapods搜不到诶
        WhatHurtsMore:@蓝涩枫 说明你该更新库了:relieved:
        b8e6682d009f:@WhatHurtsMore pod search 不到你的库,其他库可以
        WhatHurtsMore:pod 'NSAuthorityManager'
      • 雨影:提一个建议,代码重复太多了,各种权限有两个地方是共同的,可以提出来如下:
        #pragma mark - 是否授权状态判断
        + (BOOL)isObtainWithStatus:(NSInteger)status{

        if (status == JDAuthorizationStatusDenied) {
        DLog(@"用户拒绝App使用(Denied)");
        return NO;
        }else if (status ==JDAuthorizationStatusNotDetermined){
        DLog(@"未选择权限(NotDetermined)");
        return NO;
        }else if (status == JDAuthorizationStatusRestricted){
        DLog(@"未授权(Restricted)");
        return NO;
        }
        DLog(@"权限:已授权(Authorized)"); //EKAuthorizationStatusAuthorized
        return YES;
        }

        + (void)ShowGranted:(BOOL)success
        {
        if (success == YES) {
        DLog(@"开启权限:成功");
        }else{
        DLog(@"开启权限:失败");
        }
        }
        WhatHurtsMore:@雨影 当时的想法应该是先判断是否获取到了权限,如果有就不去申请,反之去申请。直接去申请从代码上是多了但是从操作上却重复了。不过的确是可以合并在一起的:sweat_smile: 写的匆忙造就了这个结果
      • Coulson_Wang:写得很棒,支持下


        不过自己写的类是不是不应该使用NS前缀比较好:smiley:
        WhatHurtsMore:@雨影 :sweat_smile: 是的 虽然知道这样 就是莫名觉得Next Step很酷:sweat: 下次不敢冒充官方了
        雨影:同意,一般系统的才会用NS,容易引起歧义.
        WhatHurtsMore:@Coulson_Wang :fearful:想的脑仁疼都想不出前缀 该死的命名空间 我写的其他类都是OBJ前缀 233
      • 飞翔de小苹果:是不是所有权限内容还没有写完整?
        WhatHurtsMore:@飞翔de小苹果 这样的代码目录补充监听会很方便的 欢迎你补充补充:smile:
        飞翔de小苹果:@WhatHurtsMore 看到后面才发现监听还没有写完整,感觉还有很多的样子
        WhatHurtsMore:@飞翔de小苹果 权限开启状态已经写完了 只是觉得监听很鸡肋 你可以fork代码继续补充啊
      • 奇怪的知识增加了:@interface NSAuthorityManager : NSObject NSSingletonH(Instance);
        这个写法是怎么来的,NSAuthorityManager继承 NSObject,后面的单例NSSingletonH(Instance);是设么意思
        奇怪的知识增加了:@WhatHurtsMore 那我想添加单例的属性怎么办?
        WhatHurtsMore:@贪嗔痴恨爱恶欲 就是allocwithzone等系列方法 你看看我另一篇 应该是写到了
        WhatHurtsMore:@贪嗔痴恨爱恶欲 就是把单例封装起来 以后项目用起来方便 仅此而已啊
      • 奇怪的知识增加了:单例写的很风骚啊
      • 东东隆东抢:最后实现了什么功能?只是获取权限吗?还是实现了页面上的gif图片上的示例?
        WhatHurtsMore:其实你下载代码看一下就一目了然了 实现gif就2菊花
      • d17711008314:为了给你赞你一下我特意上了一下号
        WhatHurtsMore:@okerivy :flushed: 里面注释的3个代理方法也没有写上呢 总之有很多不完善的地方呢=。=希望有人一起写写
        okerivy:@WhatHurtsMore 写的很好, 建议搞个block 成功和失败的回调, 方便知道用户点击了允许还是取消.做些操作
        WhatHurtsMore::cold_sweat: 啊 这个倒没必要非这样啊~~我觉得有帮助的话可以用用可以赞下 不过谢谢啦

      本文标题:最友好的访问权限之iOS权限提示

      本文链接:https://www.haomeiwen.com/subject/mqtuxxtx.html