ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

如何在iOS上实现应用封锁器?Foqos基于FamilyControls与ManagedSettings的完整技术解析

如何在iOS上实现应用封锁器?Foqos基于FamilyControls与ManagedSettings的完整技术解析

【免费下载链接】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!

项目地址:https://gitcode.com/gh_mirrors/fo/foqos
点击查看免费下载

Foqos是一款免费开源的 iOS 应用封锁器(App Blocker),它基于苹果官方的 FamilyControls 与 ManagedSettings 两大框架,让你可以封锁 App 和网站,并通过 NFC 标签、二维码、计时器或手动按钮来开始/结束专注会话。本文将带你从框架原理到源码实现,完整解析 Foqos 是如何在 iOS 上实现系统级应用封锁的 🛡️。

一、为什么选 FamilyControls 与 ManagedSettings?

在 iOS 上实现应用封锁器,只有两条官方路径:

框架作用在 Foqos 中的用途
FamilyControls(屏幕使用时间 API)提供应用/网站封锁的授权与执行能力,支持 DeviceActivity 后台活动调度请求 Screen Time 授权、定时封锁
ManagedSettings提供ManagedSettingsStore写入系统级屏蔽(Shield)规则真正"挡住"App 弹窗、拦截应用移除/安装

两者的分工非常清晰:

  1. FamilyControls负责"许可 + 时机"——你有权封锁什么、什么时间封锁;
  2. 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:

  1. DeviceActivityCenterUtil.swift 负责向系统注册DeviceActivitySchedule(开始/结束时间、是否重复),例如每日 21:00–23:00 自动封锁;
  2. 系统在对应时间点唤醒DeviceActivity 扩展,回调intervalDidStart→ 调用activateRestrictions()写入屏蔽规则;
  3. 时间窗口结束触发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 应用封锁器的实现骨架其实非常清晰:

  1. FamilyControls:AuthorizationCenter拿授权,DeviceActivityCenter管"什么时候封锁";
  2. ManagedSettings:ManagedSettingsStore写屏蔽规则,两个 Shield 扩展管"封锁时用户体验";
  3. 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!

项目地址:https://gitcode.com/gh_mirrors/fo/foqos
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表