如何创建iOS系统级应用获取其他预装应用信息及实现方式问询
iOS沙盒/非沙盒环境下跨应用信息获取与悬浮展示方案分析
一、沙盒应用(App Store 合规应用)
可行性结论
严格受限,无法实现需求中的核心功能——获取其他预装App的数据、在其他App之上展示内容。iOS沙盒机制完全隔离不同应用的运行环境,禁止跨应用访问私有数据,同时系统限制了普通应用的窗口层级权限。
有限可行的替代方案
- 间接判断预装App是否存在:在
Info.plist中配置LSApplicationQueriesSchemes字段,声明需要查询的预装App URL Scheme,通过UIApplication.shared.canOpenURL(_:)方法判断目标App是否安装,但无法获取任何内部数据。 - 仅在自身App内展示内容:普通应用只能在自己的窗口层级内展示信息,无法覆盖其他预装App的界面。
二、非沙盒应用(越狱环境/系统级签名应用)
可行性结论
完全可行,绕过沙盒限制后可以实现所有需求功能,但这类应用无法上架App Store,仅能在越狱设备或拥有特殊系统权限的环境中运行。
具体实现方案
1. 获取预装App信息
- 获取已安装App列表:使用私有框架
LSApplicationWorkspace的allInstalledApplications()方法,可获取所有App的bundle ID、安装路径、版本号、显示名称等元数据。 - 读取App私有数据:直接访问目标预装App的沙盒目录(如
/var/mobile/Containers/Data/Application/[AppUUID]),读取其数据库、配置文件等内容;对于系统预装的核心应用(如短信、通讯录),可直接访问其固定路径的存储文件(例如短信数据库路径为/var/mobile/Library/SMS/sms.db)。 - 解析App的Info.plist:通过文件路径直接读取目标App bundle中的
Info.plist文件,提取权限声明、版本信息等内容。
2. 执行相关任务
- 调用私有API:通过Runtime反射(
objc_msgSend)调用目标App的内部方法,或使用openURL(_:)传递自定义URL Scheme参数,触发目标App的特定操作。 - 模拟用户交互:借助越狱工具如
Frida、Cycript,或使用私有框架UIAutomation,模拟点击、输入等用户操作,实现对目标App的控制。
3. 在其他App之上展示内容
- 创建全局悬浮窗口:直接实例化
UIWindow,设置windowLevel为UIWindowLevelStatusBar + 1(高于系统状态栏和普通App窗口),并为其设置rootViewController承载展示内容,该窗口会覆盖所有其他应用界面。 - 注入系统进程:通过越狱插件框架
Substrate(Cydia Substrate)将悬浮逻辑注入到SpringBoard(系统桌面进程)中,实现更稳定的全局悬浮效果。
注意事项
- 非沙盒应用的实现依赖私有API或越狱环境,可能随着iOS系统版本更新而失效,且违反苹果开发者协议,无法通过App Store审核。
- 访问系统预装App的私有数据可能涉及用户隐私,需遵守相关法规要求。
内容的提问来源于stack exchange,提问作者iOSCoder
相关产品推荐
相关产品推荐

