You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:26:01