行业资讯
基于鸿蒙os开发跑步管理系统(十一)-权限与安全
权限与安全权限总览RunAdvisor 共声明 5 项权限权限类型用途声明位置ohos.permission.INTERNETnormal天气 API 网络请求module.json5ohos.permission.APPROXIMATELY_LOCATIONuser_grant模糊位置获取module.json5ohos.permission.LOCATIONuser_grant精确位置获取module.json5ohos.permission.ACTIVITY_MOTIONuser_grant计步器数据读取module.json5ohos.permission.GYROSCOPEuser_grant陀螺仪数据读取module.json5module.json5 配置所有权限在 entry/src/main/module.json5 的 requestPermissions 中声明requestPermissions: [ { name: ohos.permission.INTERNET, reason: $string:perm_internet_reason, usedScene: { abilities: [EntryAbility], when: inuse } }, { name: ohos.permission.APPROXIMATELY_LOCATION, reason: $string:perm_location_reason, usedScene: { abilities: [EntryAbility], when: inuse } }, { name: ohos.permission.LOCATION, reason: $string:perm_location_reason, usedScene: { abilities: [EntryAbility], when: inuse } }, { name: ohos.permission.ACTIVITY_MOTION, reason: $string:perm_step_reason, usedScene: { abilities: [EntryAbility], when: inuse } }, { name: ohos.permission.GYROSCOPE, reason: $string:perm_gyro_reason, usedScene: { abilities: [EntryAbility], when: inuse } } ]reason 字符串资源在 entry/src/main/resources/base/element/string.json 中定义资源名值perm_internet_reasonUsed to fetch weather data for run adviceperm_location_reasonUsed to get your location for route recommendationsperm_step_reasonUsed to read step count for health trackingperm_gyro_reasonUsed to enhance location accuracy with gyroscope data运行时权限处理传感器权限 (GYROSCOPE / ACTIVITY_MOTION)传感器调用在 try-catch 中执行权限拒绝时优雅降级// LocationEnhanceService.startGyroscope()try{sensor.on(sensor.SensorId.GYROSCOPE,callback,options);this.listeningtrue;}catch(e){this.gyroAvailablefalse;// 降级处理}// StepService.querySensorSteps()try{sensor.once(sensor.SensorId.PEDOMETER,callback);}catch(e){resolve(0);// 返回 0 步}定位权限 (LOCATION)LocationService.getCurrentLocation() 在 try-catch 中执行失败时返回默认北京坐标asyncgetCurrentLocation():Promisenumber[]{try{constlocationawaitgeoLocationManager.getCurrentLocation(requestInfo);return[location.latitude,location.longitude];}catch(e){return[Constants.BEIJING_LAT,Constants.BEIJING_LNG];// 默认北京}}网络权限 (INTERNET)WeatherService 网络请求在 try-catch 中执行失败时返回默认天气asyncgetWeather(lat,lng):PromiseWeatherInfo{try{constresponseawaitrequest.request(url,options);// 解析天气数据}catch(e){// 降级到默认天气}returnthis.getDefaultWeather();// 北京 22°C 晴}安全注意事项API Key 安全: 天气 API Key 使用占位符 “YOUR_KEY”生产环境应通过安全后端代理数据存储: 用户数据通过 Preferences 本地存储不涉及网络传输位置数据: 位置数据仅在本地使用不上传到任何服务器签名配置: 当前未配置签名 (Will skip sign ‘hos_hap’)真机部署需要在 DevEco Studio 中手动配置权限分级详解normal 级别权限INTERNET 权限属于 normal 级别安装时自动授予无需用户确认{ name: ohos.permission.INTERNET, reason: $string:perm_internet_reason, usedScene: { abilities: [EntryAbility], when: inuse } }normal 级别权限的风险较低仅允许应用发起网络请求不涉及用户敏感数据。reason 字段仍需提供作为应用商店审核的依据。usedScene.when “inuse” 表示权限仅在前台使用时生效。user_grant 级别权限其余 4 项权限均为 user_grant 级别需要用户在运行时主动授权权限授权时机拒绝后果APPROXIMATELY_LOCATION首次使用位置时弹窗无法获取模糊位置LOCATION首次使用精确位置时弹窗无法获取精确位置ACTIVITY_MOTION首次读取步数时弹窗步数始终为 0GYROSCOPE首次访问陀螺仪时弹窗位置增强不可用HarmonyOS 的 user_grant 权限机制与 Android 类似首次调用受保护 API 时系统自动弹出授权弹窗。用户拒绝后应用应优雅降级而非反复请求。权限声明格式每项权限的声明包含三个必要字段{ name: ohos.permission.LOCATION, reason: $string:perm_location_reason, usedScene: { abilities: [EntryAbility], when: inuse } }name: 权限标识符必须与 HarmonyOS 权限列表中的名称完全一致reason: 向用户解释为何需要该权限的字符串资源引用不能为空usedScene: 描述权限的使用场景abilities 指定使用该权限的 Abilitywhen 指定使用时机reason 字段必须使用 $string 引用而非硬编码字符串这是 HarmonyOS 的编译要求。直接写字符串会导致构建失败。reason 字符串资源详解string.json 配置权限说明字符串定义在 entry/src/main/resources/base/element/string.json 中{string:[{name:perm_internet_reason,value:Used to fetch weather data for run advice},{name:perm_location_reason,value:Used to get your location for route recommendations},{name:perm_step_reason,value:Used to read step count for health tracking},{name:perm_gyro_reason,value:Used to enhance location accuracy with gyroscope data}]}当前 reason 文本为英文面向开发者和审核人员。生产环境建议提供中文版本使用多语言资源目录如 zh/element/string.json实现国际化。reason 文本应简明扼要说明权限的用途和益处而非技术细节。reason 文本的审核要求HarmonyOS 应用商店对 reason 文本有以下要求必须明确说明权限用途不能使用模糊描述如用于应用功能必须说明权限对用户的价值如获取位置用于推荐附近路线不能包含误导性描述如不授权将无法使用应用对于非核心功能文本长度建议 20-100 字符运行时权限处理策略优雅降级模式RunAdvisor 采用请求但允许拒绝的权限处理策略每个受权限保护的 API 调用都包裹在 try-catch 中调用受保护 API ├── 成功 → 使用真实数据 └── 异常 → 使用默认数据 ├── LocationService → 北京默认坐标 ├── StepService → 0 步 ├── LocationEnhanceService → GPS 原始坐标 └── WeatherService → 默认天气 (北京 22°C 晴)这种策略的优势用户不会因拒绝某个权限而无法使用应用应用不会反复弹窗骚扰用户功能降级对用户透明部分功能使用默认值仍可运行定位权限的双重声明APPROXIMATELY_LOCATION 和 LOCATION 同时声明遵循 HarmonyOS 的定位权限要求{ name: ohos.permission.APPROXIMATELY_LOCATION, reason: $string:perm_location_reason, usedScene: { abilities: [EntryAbility], when: inuse } }, { name: ohos.permission.LOCATION, reason: $string:perm_location_reason, usedScene: { abilities: [EntryAbility], when: inuse } }HarmonyOS 要求精确位置权限 (LOCATION) 必须与模糊位置权限 (APPROXIMATELY_LOCATION) 同时声明。仅声明 LOCATION 而不声明 APPROXIMATELY_LOCATION 会导致编译错误。这一设计遵循了权限最小化原则应用先获取模糊位置仅在用户明确授权后才使用精确位置。传感器权限的使用时机GYROSCOPE 和 ACTIVITY_MOTION 权限在应用启动时即开始使用// EntryAbility.onCreate()PreferencesService.init(this.context);LocationEnhanceService.getInstance().startGyroscope();startGyroscope() 在 onCreate 中调用此时应用尚未显示 UI但传感器数据需要提前订阅以确保首页加载时已有陀螺仪数据。如果延迟到首页显示后再订阅首次 enhance() 调用时 gyroAvailable 为 false会直接返回 GPS 原始坐标错失滤波效果。权限拒绝后的用户体验权限被拒绝用户可见影响补偿措施INTERNET天气始终为默认值显示北京 22°C 晴作为占位APPROXIMATELY_LOCATION位置始终为北京路线功能仍可使用北京路线LOCATION同上同上ACTIVITY_MOTION步数始终为 0可通过饮食记录追踪热量GYROSCOPE位置增强不可用路线功能不受影响安全分析API Key 安全当前天气 API Key 为占位符存在以下安全隐患staticreadonlyWEATHER_API_KEY:stringYOUR_KEY;如果替换为真实的 OpenWeatherMap API Key 并直接写在源码中存在以下风险APK 反编译后 Key 明文暴露Key 可被第三方提取用于非授权调用OpenWeatherMap 免费版有调用频率限制Key 泄露可能导致配额耗尽推荐的 Key 安全方案方案安全等级实现复杂度说明后端代理服务高中应用请求自有服务器服务器转发天气 API加密存储 Key中低Key 加密后存储运行时解密HarmonyOS 凭据管理高高使用 HarmonyOS Credential Manager API环境变量注入中中构建时从环境变量注入不进入源码本地数据安全用户数据通过 Preferences 本地存储安全特性分析数据隔离: HarmonyOS 应用沙箱机制确保每个应用的 Preferences 数据对其他应用不可见。即使设备上有恶意应用也无法读取 RunAdvisor 的用户数据。数据内容: Preferences 中存储的数据包括用户资料 (体重、身高、年龄、性别)健身目标 (步数目标、热量目标、跑步目标)缓存数据 (步数、热量、天气缓存)状态标志 (is_profile_set)这些数据均为非敏感的健康和运动信息不涉及密码、银行卡等高敏感数据。删除行为: 卸载应用时 Preferences 数据随应用沙箱一起删除不存在数据残留问题。位置数据安全位置数据的处理遵循最小化原则仅在需要时获取: getCurrentLocation() 只在首页加载和天气查询时调用不持续追踪不持久化位置: 原始 GPS 坐标和增强后坐标均不写入 Preferences不上传位置: 位置数据仅用于本地天气查询不发送到任何服务器增强后丢弃: enhance() 返回增强坐标后原始坐标不再保留网络通信安全应用唯一的网络请求来自天气 API 调用consturl:stringhttps://api.openweathermap.org/data/2.5/weather?lat${lat}lon${lng}appid${Constants.WEATHER_API_KEY}unitsmetric;constresponseawaitrequest.request(url,{method:GET,connectTimeout:5000,readTimeout:5000});安全特性使用 HTTPS 协议加密传输请求包含用户位置坐标经纬度但不包含其他个人信息超时限制5 秒防止网络请求阻塞应用请求失败时自动降级到默认天气数据代码层面安全变量声明安全ArkTS 严格模式要求所有变量在声明时初始化防止使用未定义变量导致的安全隐患StatestepCount:number0;StatetodayCalories:number0;StateisFirstLaunch:booleanfalse;类型安全ArkTS 的强类型系统防止了类型混淆攻击constweight:numberparseInt(this.setupWeight);if(isNaN(weight))return;显式类型声明和运行时类型检查parseInt isNaN 验证双重保障数据类型正确性。构建警告与安全GYROSCOPE 权限警告构建时出现警告WARN: ohos.permission.GYROSCOPE is a user_grant permission, please ensure it is requested at runtime此警告提醒开发者 GYROSCOPE 是 user_grant 权限需要在运行时请求。当前应用通过 try-catch 处理权限拒绝场景已满足要求。此警告不影响构建和运行。签名警告WARN: Will skip sign hos_hap (no signing config)签名缺失的影响无法在真机上安装运行无法发布到应用商店不影响模拟器调试签名配置步骤在 DevEco Studio 中打开 File Project Structure Project Signing Configs勾选 “Automatically generate signature”登录华为开发者账号自动生成调试签名证书权限最佳实践1. 最小权限原则RunAdvisor 仅声明了 5 项必要权限未申请任何冗余权限不申请 CAMERA无拍照功能不申请 MICROPHONE无语音功能不申请 READ_WRITE_DOWNLOAD_DIRECTORY不操作文件系统不申请 KEEP_BACKGROUND_RUNNING无后台跑步追踪2. 运行时请求时机权限请求的最佳时机是在用户即将使用相关功能时而非应用启动时。RunAdvisor 当前在 onCreate 中即启动陀螺仪订阅不完全符合此原则。优化方案是将 startGyroscope() 延迟到首页加载时调用但需权衡延迟启动对首页数据加载的影响。3. 权限说明透明性每个权限的 reason 文本都清晰说明了权限用途和用户价值符合 HarmonyOS 应用商店的审核要求。使用场景场景一全新安装的权限流程用户首次安装并打开 RunAdvisor应用启动INTERNET 权限自动授予首页加载调用 getCurrentLocation()系统弹出 LOCATION 权限授权弹窗用户点击允许应用获取精确位置查询天气步数功能触发 ACTIVITY_MOTION 权限弹窗用户点击拒绝步数显示 0其他功能正常场景二权限被拒绝后的体验用户在设置中关闭了 LOCATION 权限首页加载时 getCurrentLocation() 抛出异常应用降级使用北京默认坐标天气显示北京 22°C 晴路线功能正常路线数据不依赖实时位置用户无感知降级应用功能完整场景三安全审计应用商店审核人员检查 RunAdvisor 的权限声明5 项权限各有明确的 reason 说明usedScene.when “inuse” 确保权限仅在前台使用无后台位置追踪、无联系人读取等高风险权限API Key 为占位符不存在密钥泄露风险审核通过
郑州网站建设
网页设计
企业官网