【免费下载链接】foqos
Foqos allows you to lock apps behind the tap of a NFC tag or scan of a QR code. Free and open source alternative to Brick, Opal, ScreenZen, Unpluq, Scrolly, Blok and more!
Foqos是一款免费开源的 iOS 应用封锁器(App Blocker),它基于苹果官方的 FamilyControls 与 ManagedSettings 两大框架,让你可以封锁 App 和网站,并通过 NFC 标签、二维码、计时器或手动按钮来开始/结束专注会话。本文将带你从框架原理到源码实现,完整解析 Foqos 是如何在 iOS 上实现系统级应用封锁的 🛡️。
一、为什么选 FamilyControls 与 ManagedSettings?
在 iOS 上实现应用封锁器,只有两条官方路径:
| 框架 | 作用 | 在 Foqos 中的用途 |
|---|---|---|
| FamilyControls(屏幕使用时间 API) | 提供应用/网站封锁的授权与执行能力,支持 DeviceActivity 后台活动调度 | 请求 Screen Time 授权、定时封锁 |
| ManagedSettings | 提供ManagedSettingsStore写入系统级屏蔽(Shield)规则 | 真正"挡住"App 弹窗、拦截应用移除/安装 |
两者的分工非常清晰:
- FamilyControls负责"许可 + 时机"——你有权封锁什么、什么时间封锁;
- ManagedSettings负责"执行 + 界面"——系统弹出自定义 Shield 挡住被封锁的 App。
这是 Foqos 无需越狱、无需 MDM 就能实现系统级封锁的关键,也是它与 Brick、Opal 等付费应用封锁器的共同技术底座。
二、整体架构:5 个协同工作的 Target
Foqos 由 5 个 Target 组成,各自承担一个封锁链路环节:
foqos/ |-- Foqos/ # 主 App:UI、策略、封锁规则写入 |-- FoqosDeviceMonitor/ # DeviceActivity 监控扩展(计时器触发点) |-- FoqosShieldAction/ # Shield 按钮动作扩展(临时放行逻辑) |-- FoqosShieldConfig/ # Shield 外观定制扩展(主题色/趣味文案) `-- FoqosWidget/ # Widget 与 Live Activity- 主 App:管理封锁 Profile、策略选择、写入 ManagedSettings 规则;
- DeviceActivity 扩展:DeviceActivityMonitorExtension.swift 监听系统计时活动的起止,在
intervalDidStart/intervalDidEnd回调中启动或解除封锁——这是"到点自动封锁/解封"的核心触发器; - 两个 Shield 扩展:定制被封锁 App 弹出时看到的系统界面(后文详述)。
NFC计时器封锁策略:NFC标签与计时器组合的专注封锁模式
三、第一步:请求 Screen Time 授权(FamilyControls)
一切的前提是获得系统授权。Foqos 通过 RequestAuthorizer.swift 封装了这一步:
- 调用
AuthorizationCenter.shared.requestAuthorization(for: .individual)请求个人模式授权(即用户封锁自己的设备,而非儿童账户); - 通过
authorizationStatus判断当前授权状态,驱动 App 的引导页跳转。
对应的开发者权限在 foqos.entitlements 中声明:
<key>com.apple.developer.family-controls</key> <true/>⚠️ 本地开发时需要 Apple Developer 账户申请 Screen Time 权限(App ID 勾选 Family Controls capability),这是该框架的硬性门槛。
授权数据还通过 App Group(group.dev.ambitionsoftware.foqos,见 Shared.swift)在 App 与各扩展之间共享,保证 Shield 扩展、DeviceActivity 扩展能读到同一个会话状态。
四、第二步:写入 ManagedSettings 屏蔽规则
授权完成后,真正的"封锁动作"发生在 AppBlockerUtil.swift 中。它持有一个独立的ManagedSettingsStore:
let store = ManagedSettingsStore( named: ManagedSettingsStore.Name("foqosAppRestrictions") )激活封锁时,它会设置以下几类系统级规则:
| 属性 | 含义 |
|---|---|
store.shield.applications | 按 App 黑名单封锁(或白名单模式.all(except:)) |
store.shield.webDomains | 封锁指定网站域名 |
store.webContent.blockedByFilter | 通过 Web Content Filter 扩展拦截网页内容(含成人内容自动拦截) |
store.application.denyAppRemoval | 严格模式下禁止卸载被封锁的 App |
store.application.denyAppInstallation | 禁止安装新 App |
这套"黑名单 / 白名单(Allow Mode)/ 严格模式(禁止移除 App)"三档设计,正是应用封锁器对抗"直接卸载绕过"的经典做法。停止会话时,deactivateRestrictions()会逐项置nil并调用store.clearAllSettings()清理全部规则。
五、第三步:DeviceActivity 实现"到点自动封锁"
手动开始/停止太简单了,真正体现技术含量的是无人值守的定时封锁。Foqos 使用 FamilyControls 的DeviceActivityCenter:
- DeviceActivityCenterUtil.swift 负责向系统注册
DeviceActivitySchedule(开始/结束时间、是否重复),例如每日 21:00–23:00 自动封锁; - 系统在对应时间点唤醒DeviceActivity 扩展,回调
intervalDidStart→ 调用activateRestrictions()写入屏蔽规则; - 时间窗口结束触发
intervalDidEnd→ 调用deactivateRestrictions()解除封锁。
由于由系统进程而非 App 本身驱动,即使 Foqos 被杀进程、甚至设备重启,计时封锁依然生效——这是纯 Timer 方案做不到的。类似的机制还被复用在:
- 临时放行(Soft Unblock)到期收回:SoftUnblockGrantScheduler.swift 为每次"放行 N 分钟"单独注册一个计时活动,到期自动收回权限;
- 暂停计时器、休息时段、策略倒计时等多类计时场景,统一定义在 Timers/ 目录。
六、第四步:定制 Shield 界面与"软解锁"按钮
当用户点击被封锁的 App 时,系统会弹出 Shield 界面。Foqos 用两个扩展把它做成了产品亮点:
1. 外观定制—— ShieldConfigurationExtension.swift(位于FoqosShieldConfig/):
- 继承
ShieldConfigurationDataSource,为每个被封锁的 App/网站返回自定义ShieldConfiguration; - 支持用户主题色背景、Emoji 图标,以及按"日期 + App 名"稳定随机挑选的 17 条趣味劝返文案(如"Brain check:你真的是想用这个 App,还是无意识点了?")。
2. 临时放行按钮—— ShieldActionExtension.swift(位于FoqosShieldAction/):
- 继承
ShieldActionDelegate,拦截用户在 Shield 上的主按钮点击(.primaryButtonPressed); - 校验剩余放行额度后,创建一条
SoftUnblockGrant(含过期时间),并通过 DeviceActivity 注册到期自动收回——实现"允许打开 5 分钟,之后自动重新封锁"的Soft Unblock策略,且整个流程无需打开 Foqos 主 App。
七、策略模式:12 种启动/停止方式如何统一
Foqos 把"怎么开始、怎么结束"抽象为策略模式,核心协议见 BlockingStrategy.swift:
- 每个策略声明
usesNFC、usesQRCode、hasTimer等能力位,UI 由策略自行返回; - StrategyManager.swift 注册了 12 个策略实现:手动、NFC 碰一下、二维码、NFC+计时器、暂停计时器、NFC/QR 软解锁等;
- 统一入口
startBlocking/stopBlocking分发到具体策略,最终都收敛到AppBlockerUtil的激活/解除方法。
NFC 与 Shortcuts 集成是它的特色玩法:App 内可直接向 NTAG213 标签写入 Profile 深链接(https://foqos.app/profile/<UUID>),碰一下就切换封锁状态;也可以配合 iOS Shortcuts 的 NFC 自动化(开启 Run Immediately)实现"贴标签 = 启动专注"。仓库还提供了 25mm 标签的 3D 打印 NFC 砖块/钥匙扣设计:
八、如何获取与开发 Foqos
使用:直接从 App Store 下载 Foqos,授予 Screen Time 权限,创建 Profile(选择 App/网站 + 策略)即可开始封锁。数据全部存于本机 SwiftData,无账号、无广告、无订阅。
本地开发:
git clone https://gitcode.com/gh_mirrors/fo/foqos cd foqos make build # 构建项目 make lint # Swift 格式检查开发环境要求 Xcode 15+、iOS 17.6+ SDK,以及具备 Screen Time / NFC entitlements 的 Apple Developer 账户。想深入阅读源码,建议按这个顺序:AppBlockerUtil.swift → DeviceActivityMonitorExtension.swift → ShieldConfigurationExtension.swift → StrategyManager.swift。
九、总结
回顾 Foqos 的技术路线,iOS 应用封锁器的实现骨架其实非常清晰:
- FamilyControls:
AuthorizationCenter拿授权,DeviceActivityCenter管"什么时候封锁"; - ManagedSettings:
ManagedSettingsStore写屏蔽规则,两个 Shield 扩展管"封锁时用户体验"; - App 层:用策略模式封装 12 种 NFC/二维码/计时器/手动触发方式,统一调用上述两套 API。
想给自己的 App 加"专注模式"能力、或实现类似 Brick 的物理触发封锁?Foqos 的 MIT 开源代码(见 LICENSE)正是一份现成的最佳实践教材。🚀
【免费下载链接】foqos
Foqos allows you to lock apps behind the tap of a NFC tag or scan of a QR code. Free and open source alternative to Brick, Opal, ScreenZen, Unpluq, Scrolly, Blok and more!
相关推荐
为什么值得从Brick换到Foqos:免费开源NFC应用封锁器的完整对比指南
为什么值得从Brick换到Foqos:免费开源NFC应用封锁器的完整对比指南 Foqos 是一款 免费开源的 iPhone 应用封锁器 ,让你用一张 NFC 标
PrimeFaces与Spring Boot集成:构建现代化Java Web应用的完整指南
PrimeFaces与Spring Boot集成:构建现代化Java Web应用的完整指南 PrimeFaces是一个功能强大的Jakarta Faces(JS
UI库/组件[技术突破]如何在iOS设备实现永久应用侧载:TrollInstallerX全解析
技术突破 如何在iOS设备实现永久应用侧载:TrollInstallerX全解析 价值定位:重新定义iOS应用侧载技术 在iOS生态系统中,应用侧载长期面临签名
移动开发网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考