1. 背景
iOS系统自2007年发布至今,已发布了12个版本,自iOS7.0之后,不同阶段的系统版本的权限特征或多或少都有所差异。若软件没有做好权限相应的限制适配,在提交APP Store审核时会被拒绝上线。
针对iOS进行权限测试设计的原因一方面是因为测试的目的是保证软件最终质量,如果不做好系统的兼容适配,软件运行时会很容易出现严重的缺陷。
例如在iOS10系统中,如果没有根据更新的权限要求在info.plist中进行声明而访问了隐私数据,在Xcode8中打开编译的话,会发生crash,控制台会输出下面这样的日志:
另一方面,通过分析系统特征来设计用例,可以减少不必要的重复测试,提升测试效率。
2.iOS权限基本认识
2.1 iOS权限机制
iOS的安全机制——沙盒限制了应用程序执行各种操作的权限。沙盒实际就是程序的系统文件目录,非代码文件都在此保存,例如图片、图标、视频、plist文件、文本文件,每个iOS程序只能访问自己沙盒中的东西,访问其他沙盒需要权限,它相对封闭、独立,使得iOS环境较为稳定。
在iOS10之后,苹果增强了对用户隐私的保护,App想要访问用户的相机、相册、麦克风、通讯录等等,都需要在info.plist中添加相应的参数进行声明,以声明的权限去访问这些资源。
2.2 iOS应用申请的主要权限
Android系统对权限的隐私危害性进行三级划分,分为普通权限、特殊权限、危险权限。而iOS系统没有这些分类,基本采用第一次使用某功能(如相机)就请求权限,之后除非在隐私中关闭该应用的该权限,否则该程序将一直拥有该权限。
参照此图,iOS应用申请的主要权限有:
typedef NS_ENUM(NSUInteger, ECPrivacyType){
ECPrivacyType_None = 0,
ECPrivacyType_LocationServices = 1, // 定位服务
ECPrivacyType_Contacts = 2, // 通讯录
ECPrivacyType_Calendars = 3, // 日历
ECPrivacyType_Reminders = 4, // 提醒事项
ECPrivacyType_Photos = 5, // 照片
ECPrivacyType_BluetoothSharing = 6, // 蓝牙共享
ECPrivacyType_Microphone = 7, // 麦克风
ECPrivacyType_SpeechRecognition = 8, // 语音识别 >= iOS10
ECPrivacyType_Camera = 9, // 相机
ECPrivacyType_Health = 10, // 健康 >= iOS8.0
ECPrivacyType_HomeKit = 11, // 家庭 >= iOS8.0
ECPrivacyType_MediaAndAppleMusic = 12, // 媒体与Apple Music >= iOS9.3
ECPrivacyType_MotionAndFitness = 13, // 运动与健身
};
2.3 权限相关API说明
以相机权限为例,开发者主要关注的API如下:
(1)权限类型
typedef NS_ENUM(NSUInteger, AVAuthorizationStatus){
AVAuthorizationStatusNotDetermined = 0, // 用户从未进行过授权等处理,首次访问相应内容会提示用户进行授权
AVAuthorizationStatusAuthorized = 1, // 已授权
AVAuthorizationStatusDenied = 2, // 拒绝
AVAuthorizationStatusRestricted = 3, // 应用没有相关权限,且当前用户无法改变这个权限,比如:家长控制
AVAuthorizationStatusNotSupport = 4, // 硬件等不支持
};
(2)检查权限是否授予
AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (videoAuthStatus == AVAuthorizationStatusNotDetermined) {
// 未询问用户是否授权
}else if(videoAuthStatus == AVAuthorizationStatusRestricted || videoAuthStatus == AVAuthorizationStatusDenied) {
// 未授权
}else{
// 已授权
}
(3)请求授权
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted){// 用户同意授权
}else {// 用户拒绝授权
}
}];
3. iOS系统对应用程序权限申请的方式
由于iOS系统的封闭性和苹果市场的严格监管,其APP权限没有Android表现的原生权限、定制权限等表现的的那么复杂。
iOS系统对应用程序权限申请的方式有两种:
(1)第一次访问授权:
APP在安装时不会展示所需使用的权限列表,仅在第一次使用APP的该功能时才会询问权限,授予权限后APP永远拥有该权限,除非在隐私中关闭该权限。
另外,iOS各个版本的权限表现还是略有不同的。
a)iOS7之前:
- 对权限控制较弱,APP可以直接调起相机,无需询问权限
b)iOS7~9
- 增强权限控制,加入通知和相机权限;
- APP第一次调用相机会询问权限,允许后一直将拥有该权限,直到在设置中关闭该权限;
- 当关闭了权限之后在APP中再次调用相机,可以提供跳转到设置-隐私去修改权限的入口。
c)iOS10之后
- 支持Siri和电话权限;
- 当关闭了权限之后在APP中再次调用相机,只提示需要在设置中开启权限,不允许APP直接访问设置,也就不能提供通往设置页的入口;
- 每次修改相关权限返回APP,APP都需要重启以生效该权限。
联网权限和通知权限经常是在第一次启动APP时就询问,拒绝联网权限的话进入APP大部分功能是无法加载的。
(2)访问限制/家长控制:
在设置-通用-访问限制,可以通过限制对内建应用的使用、安装、删除,以及对隐私设置的更改,来限制应用程序的权限
例如可以开启定位服务的限制,这样就会禁止应用和网站使用位置信息,当使用时会提示请在设置-隐私-定位服务中开启权限。
在「访问限制 - 网站」里改变过滤设置,就可以在「允许浏览所有网站」、「限制成人内容」和「只允许指定的网站」几种过滤方式之间切换。如果访问被禁止的网站,浏览器就会弹出相应的提示。
4.测试设计矩阵
根据以上内容中的权限分类、iOS多个版本之间的权限重点区别、不同操作方式以及与功能映射关系,得出以下iOS权限测试设计矩阵:
- 该正交表中,1表示对该功能点进行一次测试,0表示不进行测试(因为重复性或者该版本无此权限、路径);
- 该表列出的权限和系统特征项,能基本覆盖iOS系统的版本差异测试,只进行“1”的测试也能大大节省时间,达到目的。