iOS Swift技术问询:如何检测用户是否正在使用其他应用?
检测后台时用户正在使用的其他应用
以下分Android和iOS平台给出具体实现方案:
Android平台实现
- 权限申请:必须获取
PACKAGE_USAGE_STATS权限,该权限无法通过常规权限弹窗申请,需引导用户前往系统设置开启:val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS) startActivity(intent) - 获取当前前台应用:使用
UsageStatsManager查询近期应用使用数据,筛选出当前活跃的应用包名:fun getForegroundAppPackageName(context: Context): String? { val usageStatsManager = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager val currentTime = System.currentTimeMillis() // 查询最近10秒内的应用使用记录 val stats = usageStatsManager.queryUsageStats( UsageStatsManager.INTERVAL_BEST, currentTime - 10000, currentTime ) return stats.maxByOrNull { it.lastTimeUsed }?.packageName } - 关键说明:Android 10(API 29)及以上版本已废弃
getRunningAppProcesses,必须使用UsageStatsManager;该权限属于敏感权限,需向用户明确说明用途以提高授权率。
iOS平台实现
iOS出于隐私保护,对应用间数据获取有严格限制,分两种情况处理:
- 常规场景:无法直接检测用户当前正在使用的其他应用,仅能监听自身应用的前后台状态(通过
UIApplicationDelegate的applicationWillEnterForeground/applicationDidBecomeActive方法)。 - 特殊场景(如家长控制类应用):可通过
Screen Time框架申请权限获取应用使用数据,但需苹果审核通过特定权限类型:import ScreenTime func requestScreenTimeAuthorization() { STAuthorizationCenter.shared.requestAuthorization { status in switch status { case .authorized: fetchAppUsageRecords() case .denied, .restricted: // 授权失败,无法获取数据 break @unknown default: break } } } func fetchAppUsageRecords() { let store = STUsageStore() let startDate = Date().addingTimeInterval(-86400) // 查询最近24小时数据 store.fetchUsage(for: .daily, from: startDate, to: Date()) { results, error in guard let results = results, error == nil else { print("获取数据失败:\(error?.localizedDescription ?? "未知错误")") return } results.forEach { record in print("应用包名:\(record.bundleIdentifier ?? "未知"),使用时长:\(record.totalUsageTime)秒") } } } - 关键说明:
Screen Time仅能获取历史使用数据,无法实时获取当前前台应用;普通应用申请该权限大概率会被苹果审核拒绝,仅适用于符合特定场景的应用。
内容的提问来源于stack exchange,提问作者VipinYadav
相关产品推荐
相关产品推荐

