Android是一个权限分离的操作系统,每个应用都有独特的系统标识。正常情况下,应用本身没有权限执行对其他应用或系统产生危害的操作。应用都运行在访问权受限的沙盒中,当应用需要使用沙盒以外的资源时需要申请相应的权限,如读写SD卡、读写联系人、调用摄像头等权限。
根据重要程度,Android权限可以分成3种类型,如表1-6所示。
表1-6 Android权限类型及含义
在Android 5.0及之前的版本中,应用无论申请普通权限还是申请危险权限,只需要在应用的Manifest配置文件中声明,就会在安装时被自动授予。为了提高系统的安全性,更好地保护用户的隐私,Google在Android 6.0版本中针对危险权限开始使用新的权限管理模式,即动态权限申请。应用使用危险权限时需要先在AndroidManifest.xml中声明对应的权限。以访问相机为例,需要先在其中添加相应的<uses-permission>元素进行权限声明,具体添加以下代码行:
<manifest >
<uses-permission android:name="android.permission.CAMERA"/>
<application ...>
...
</application>
</manifest>
应用运行时首次用到声明的危险权限,系统会弹窗提示用户,由用户自主决定授予还是拒绝所申请的权限。若没有被授予相应的权限而直接进行操作,则可能出现应用崩溃(crash)的情况。弹窗提示用户效果如图1-19所示。
图1-19 Android权限申请弹窗
在Android上声明和请求应用运行时权限的工作流程如图1-20所示。
图1-20 Android权限申请流程
在Android 6.0~Android 8.0版本中,若应用在运行时请求权限并且被授予该权限,则系统会错误地将属于同一权限组并且已在清单中声明的其他权限一同授予。也就是说,对于同一组内的权限,只要有一个被同意,其他的都会被同意。在Android 8.0之后,此bug已被修复,只会授予应用明确请求的权限。
iOS一向以注重保护用户隐私而著称,因此iOS系统的权限审核相较于Android系统更加严格。苹果规定应用程序访问受保护的资源之前需要得到用户许可,可以理解为应用程序运行中涉及用户隐私相关权限时都需要弹窗提示,用户手动确认授权后方可使用。
同Android应用一样,iOS应用在使用权限前也需要注册声明。开发者需要将应用运行中用到的权限注册在Info.plist中,如果未在Info.plist中声明而直接使用权限,则将导致应用崩溃。权限在Info.plist中的具体注册格式如图1-21所示。
图1-21 Info.plist权限声明
在Info.plist文件中,通过Key指定应用所需的权限,而在相应的Value处则需填写使用该权限的具体理由。系统在弹出授权提示窗口时会向用户展示Value中填写的信息,让用户了解权限使用的目的,具体效果如图1-22所示。
iOS应用运行时请求权限的工作流程如图1-23所示。
图1-22 iOS权限申请弹窗
图1-23 iOS权限申请流程
Android系统中,如果用户拒绝授予敏感权限,那么开发者有机会通过多次弹窗来提醒用户授权。而iOS系统只允许开发者通过一次弹窗来提示用户授权,如果用户拒绝,则应用无法再次通过弹窗请求授权,只能引导用户前往系统的权限管理设置功能中手动进行授权。