权限、系统能力与可访问性
星线按扫码、通话、城市识别、实时位置和文件操作分别接入系统能力。本文列明源码声明及触发路径,并说明现有可访问性实现与验收范围。
iOS 权限与能力
| 能力 | 触发与用途 |
|---|---|
| 相机 | 扫码、拍摄和视频通话,在对应路径请求视频访问 |
| 麦克风 | 发起或接入音视频通话时请求音频访问 |
| 使用期间定位 | 城市贴纸、位置选择、附近地点及用户确认后的实时共享 |
| 文件与照片选择 | 使用系统选择器读取用户明确选中的项目 |
Info.plist 和 project.yml 提供相机、麦克风、使用期间定位说明;后台模式声明 location、audio、voip。城市识别只发起一次前台请求,实时共享在用户开启后才允许后台定位,结束时关闭后台更新。声明后台模式本身不会让共享自动开始。
扫码检查 DataScannerViewController.isSupported 和 isAvailable。相机不可用或未授权时保留照片选择、粘贴内容和系统设置入口;相册使用 PhotosPicker,文件使用 fileImporter,不要求扫描整个照片库。通话分别处理麦克风与摄像头授权,视频开关会检查摄像头访问。
系统来电桥接使用 CallKit/PushKit,APNs entitlement 根据 Debug/Release 注入 development/production 环境。推送凭据、服务和描述文件是否可用,需要独立验收,不能由 entitlement 存在推断后台来电已交付。
Android 清单与运行时请求
清单声明 INTERNET、CAMERA、RECORD_AUDIO、MODIFY_AUDIO_SETTINGS、ACCESS_NETWORK_STATE、FINE/COARSE_LOCATION、FOREGROUND_SERVICE、FOREGROUND_SERVICE_LOCATION 和 POST_NOTIFICATIONS。其中敏感权限还需运行时获得用户授权。
扫码相机进入页面后请求 CAMERA,CameraX 随生命周期绑定与释放;拒绝后仍可选择图片或粘贴。通话依据接听、入会、开麦或开摄像头动作请求所需权限,支持视频通话的仅音频加入路径。
城市贴纸优先使用已获得的 COARSE_LOCATION,界面提供主动授权按钮;即使没有定位权限也可用 IP 粗略城市或手选。实时共享同时处理精确/粗略位置,以及 Android 13 及以上的通知权限,再启动带持续通知的定位前台服务。清单没有申请 ACCESS_BACKGROUND_LOCATION;前台服务的系统限制和厂商后台策略仍需真机检查。
应用关闭系统自动备份,Release 禁止明文网络,Debug 单独允许本地联调。FileProvider 不对外导出组件,只向选中的接收应用授予临时 URI 权限。文件选择通过系统文档选择器读取指定内容,没有请求广泛存储访问。相关数据边界见安全与隐私。
拒绝、撤权与替代路径
| 场景 | iOS 当前行为 | Android 当前行为 |
|---|---|---|
| 扫码相机拒绝 | 保留照片/粘贴,显示系统设置入口 | 相机区域可再次申请,照片/粘贴仍可用;永久拒绝后不能假设重按必有弹窗 |
| 扫描硬件不支持 | VisionKit 能力检查后显示替代入口 | CameraX 初始化失败显示错误,不把取景框存在算识别可用 |
| 通话麦克风拒绝 | 准备媒体阶段报错,不能正常发布音频 | 动作提示所需权限,可重新授权 |
| 视频摄像头拒绝 | 摄像头状态保持关闭,不能声称发送视频 | 视频发起要求相机;来电/加入可选择仅音频路径 |
| 城市粗略位置未授权 | 单次请求可能触发授权;失败保留 IP 与手选 | 不强制先授予精确定位,用户可主动申请粗略位置 |
| 实时位置所需通知拒绝 | 不适用 Android 通知前台服务门槛 | Android 13及以上通知未授权时不开始持续共享 |
| 共享中撤销位置 | 停本机位置更新,页面须呈现最后更新时间 | 前台服务停采集并提示处理原有共享;不等于服务器已删除旧坐标 |
| 文件或照片选择取消 | 不添加本次项目 | 不添加本次项目 |
权限“已拒绝”和系统定位/相机服务关闭不同;同一个按钮重新点击也不能替代前往系统设置。普通文件选择、附件预览和 JSON 转出也属于不同授权范围:选择输入文件不表示允许读取整个目录,授予 FileProvider 读权限不表示接收应用不能复制内容,选择转出目标可能涉及用户所选云盘。详细明文和清理边界见记忆转出。
回归按以下顺序记录:在明确的初始权限下进入功能;拒绝并确认替代入口;到系统设置改变权限后回前台;重新触发;进行中再次撤权;最后退出页面和进程,检查资源释放及服务器状态。不得为了截图统一清除已有 App 数据,测试夹具和权限状态应使用专用设备或明确授权的范围。
已有可访问性实现
iOS 为扫码、记忆操作、任务完成、名片和消息等提供语义标签或提示;部分纯装饰插画隐藏于辅助技术。任务筛选在辅助功能大字号下由横排改为纵排;新事及个人页读取 Reduce Motion,减少过渡动画。测试使用的 accessibilityIdentifier 是定位标识,不能替代用户能听到的 accessibilityLabel。
Android 底部导航提供 Role.Tab 与导航描述,设置开关使用 Switch 语义,任务操作描述包含目标任务。通话状态和错误使用 polite live region;装饰插画移除语义,动作图标提供中文描述。主要工具栏动作采用 48dp 点击区域;插画与页面过渡读取系统动画时长开关,关闭动画时使用静态状态。
扩展与验收
新增能力应将用途说明、运行时请求、拒绝后的可用路径和资源释放放在同一功能中检查。新增图标沿用已有矢量体系,统一尺寸、线宽和语义颜色;功能名称由标签表达,装饰图不重复播报。布局需检查窄屏、键盘弹出、较大字体、长文件名和多行内容的实际摆放。
本篇依据源码,不宣称已通过完整 VoiceOver、TalkBack、大字号、对比度或无障碍合规认证。本轮未操作设备。回归需覆盖首次允许、拒绝、永久拒绝、系统设置撤权、前后台切换与进程恢复,并实际检查焦点顺序、朗读、触控区域及动画关闭后的状态,见测试。源码入口为 iOS ScannerView/ChatCallCoordinator/ChatLiveLocation/TaskListView 与 Android ScanCameraPreview/CallScreen/LiveLocationPanel/VisualArtwork。城市与医疗的专项边界分别见城市贴纸和医疗健康记录。