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

在iOS平台用Flutter获取全量设备信息及开发类加速清理APP咨询

Flutter开发iOS端“加速清理器”设备信息获取方案与开发建议

核心实现方式:Platform Channels桥接原生iOS代码

由于iOS沙盒机制和API限制,无现成Flutter第三方库满足全量设备信息获取需求,必须通过MethodChannel实现Flutter与原生iOS的双向通信,调用原生API获取数据。

1. 内存信息获取

  • 原生iOS端(Swift):
    利用ProcessInfo获取总物理内存,结合mach_task_basic_info计算已用内存:
    import Foundation
    import MachO
    
    func getMemoryInfo() -> [String: Double] {
        let totalMemory = ProcessInfo.processInfo.physicalMemory
        var taskInfo = mach_task_basic_info()
        var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size)/4
        let kerr: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
            $0.withMemoryRebound(to: integer_t.self, capacity: Int(count)) {
                task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
            }
        }
        var usedMemory: Double = 0
        if kerr == KERN_SUCCESS {
            usedMemory = Double(taskInfo.resident_size)
        }
        return [
            "total": Double(totalMemory)/1024/1024/1024, // 转换为GB
            "used": usedMemory/1024/1024/1024
        ]
    }
    
    在AppDelegate中注册MethodChannel:
    let channel = FlutterMethodChannel(name: "com.example.deviceInfo", binaryMessenger: window?.rootViewController as! FlutterBinaryMessenger)
    channel.setMethodCallHandler { call, result in
        if call.method == "getMemoryInfo" {
            let info = self.getMemoryInfo()
            result.success(info)
        } else {
            result.notImplemented()
        }
    }
    
  • Flutter端调用:
    final MethodChannel _channel = MethodChannel('com.example.deviceInfo');
    
    Future<Map<String, dynamic>> getMemoryInfo() async {
      final Map<String, dynamic> result = await _channel.invokeMethod('getMemoryInfo');
      return result;
    }
    

2. 电量信息获取

  • 原生iOS端:
    需先开启电池监控,注意添加权限描述:
    func getBatteryInfo() -> [String: Any] {
        UIDevice.current.isBatteryMonitoringEnabled = true
        let level = UIDevice.current.batteryLevel // 0.0-1.0,-1.0表示不可用
        let state = UIDevice.current.batteryState.rawValue
        return [
            "level": level,
            "state": state
        ]
    }
    
    在Info.plist中添加:
    <key>NSBatteryUsageDescription</key>
    <string>需要获取电量信息以优化清理策略</string>
    
  • Flutter端调用逻辑同内存信息,通过MethodChannel获取数据。

3. 已安装应用列表(iOS限制说明)

iOS沙盒机制严格限制应用访问其他应用数据,公开API无法获取全量已安装应用列表:

  • 若使用私有API(如LSApplicationWorkspace),App Store审核会直接拒绝,仅适用于企业级内部应用。
  • 公开API仅能通过UIApplication.shared.canOpenURL(_:)判断特定URL Scheme应用是否存在,无法获取全量列表。

4. 缓存信息获取与清理

  • 原生iOS端:
    获取当前应用缓存目录并计算大小,清理缓存文件:
    func getCacheSize() -> Double {
        let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!
        let fileManager = FileManager.default
        var totalSize: Double = 0
        do {
            let files = try fileManager.contentsOfDirectory(atPath: cachePath)
            for file in files {
                let filePath = cachePath + "/" + file
                let attributes = try fileManager.attributesOfItem(atPath: filePath)
                totalSize += attributes[.size] as! Double
            }
        } catch {}
        return totalSize/1024/1024 // 转换为MB
    }
    
    func clearCache() -> Bool {
        let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!
        let fileManager = FileManager.default
        do {
            let files = try fileManager.contentsOfDirectory(atPath: cachePath)
            for file in files {
                let filePath = cachePath + "/" + file
                try fileManager.removeItem(atPath: filePath)
            }
            return true
        } catch {
            return false
        }
    }
    
  • Flutter端通过MethodChannel调用这两个方法,实现缓存大小展示与清理功能。

开发关键注意事项

  • 权限合规:所有涉及隐私的操作(如电量)必须在Info.plist添加对应的权限描述,否则应用会崩溃或审核被拒。
  • 私有API规避:不要尝试用私有API获取应用列表等受限数据,避免上架失败。
  • 性能优化:计算缓存大小、获取内存信息等操作耗时较长,需放在原生后台线程执行,避免阻塞Flutter UI。
  • 错误处理:Flutter端调用MethodChannel时需捕获异常,处理原生调用失败的情况,给用户合理提示。

内容的提问来源于stack exchange,提问作者Iroslav Kuune

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:35:42