上个月被扣了 847 块,我决定写个 App 来算笔账
信用卡账单出来那天,我盯着自动扣款列表数了数:Notion、Figma、ChatGPT Plus、iCloud 200G、YouTube Premium、Spotify、一个健身 App、一个冥想 App……加起来 847 块。其中至少三个我已经超过两周没打开过了。
我知道自己花了多少钱,但不知道这些钱花得值不值。记账解决不了这个问题,我需要的是一个更直觉的指标。于是我做了「订阅斩」,核心逻辑就一句话:订阅费用 ÷ 实际使用次数 = 单次使用成本。当一个 App 每次打开的成本比打车去图书馆还贵,大概就该砍了。
产品定位:不是记账,是量化决策
订阅斩面向的是订阅了 5 个以上 SaaS/App 服务、每月固定支出 200-1000 元区间、想量化管理这笔开支的年轻上班族。它不是记账工具,也不是提醒闹钟,它要做的事情是把「感觉不太用得到」变成「数据证明你确实不需要」。
功能上分三个模块:账单日历加多档到期提醒(防止静默扣费),Screen Time 打卡计算使用成本,以及一个 AI 顾问给出砍/留/降级建议和平替推荐。
技术核心:Screen Time 数据怎么拿
这是我踩的最大坑。iOS 的 Screen Time 数据并不像想象中那么容易获取。Apple 在 iOS 16 之后提供了 DeviceActivityReport 这个 framework,但它的设计初衷是家长监控,拿来做个人用途有不少限制。
我最终的方案是通过 DeviceActivityMonitor 注册一个 Extension,在用户授权 Family Controls 之后,监听目标 App 的使用时段:
import DeviceActivity
import ManagedSettings
class SubscriptionMonitor: DeviceActivityMonitor {
override func intervalDidStart(for activity: DeviceActivityName) {
// 记录本次使用开始时间
let store = UserDefaultsStore.shared
store.markSessionStart(activity: activity.rawValue, at: Date())
}
override func intervalDidEnd(for activity: DeviceActivityName) {
let store = UserDefaultsStore.shared
store.markSessionEnd(activity: activity.rawValue, at: Date())
// 触发成本重新计算
CostEngine.recalculate(for: activity.rawValue)
}
}
这里有个很隐蔽的坑:DeviceActivityMonitor 跑在独立的 Extension 进程里,和主 App 不共享内存。数据同步我最终用了 App Group + UserDefaults suite,没有上 CoreData,因为写入频率不高且结构简单。如果你也在做类似的事,一定要先确认 entitlements 配置无误,否则 Extension 会静默失败且没有任何报错日志。我在这上面浪费了大半天,完全是盲调。
成本计算:几个需要拍板的设计决策
拿到使用次数之后,计算本身不复杂,但有几个点需要做取舍。
第一个是「使用一次」怎么定义。我的规则是:同一个 App 在 30 分钟内的多次前后台切换只算一次使用。这个阈值是根据自己的使用习惯拍的,后续会开放给用户自定义。
第二个是账单周期的对齐问题。有些订阅按月扣,有些按年扣。年付的我会折算成月均成本再除以当月使用次数,这样横向比较时口径一致。
AI 顾问怎么做的
这部分我接了 OpenAI 的 API,把用户的订阅列表、各项使用频率、费用数据打包成 prompt,让模型给出三类建议:继续保留、降级到免费版/低价档、直接取消并推荐平替。推荐平替这个功能反馈很好,比如有用户通过它发现 Notion 的轻度使用完全可以用 Apple 备忘录加快捷指令替代,每月省下 96 块。
实际效果
我自己用了两个月,月订阅支出从 847 降到了 412。砍掉了三个几乎不用的服务,两个从付费降级到免费版。体感上没有任何损失,因为数据告诉我那些东西确实没在用。
回头看这个项目,最大的收获是:Screen Time API 虽然文档稀烂、设计偏家长控制场景,但只要绕过 Extension 进程隔离的问题,用来做个人使用统计是完全可行的。如果你也在折腾 DeviceActivity 相关的开发,评论区可以聊聊,这块踩坑的人不多,网上能找到的中文资料几乎为零。
App Store 搜索「订阅斩」可以体验。