先说说这个 App 解决了什么问题
说实话,我自己就是被「订阅刺客」刺过的那个人。
某个月查信用卡账单,发现多了一笔 68 元的扣费。找了半天才想起来——三个月前注册了一个 AI 写作工具的试用,当时没取消,它就一直在扣。68 乘以 3,丢了 200 多块,全在毫无感知的情况下。
我猜这事儿不止发生在我身上。
所以我做了这个 App,叫订阅斩(SubKiller),核心就一件事:帮你搞清楚每个月的订阅到底在花多少钱,然后主动斩断那些你已经不需要的。
为什么选择 HarmonyOS
这个 App 原本是 iOS 版本,用 SwiftUI + SwiftData 写的。做完之后我在想,HarmonyOS 用户里有大量华为手机用户,他们同样面临 Netflix、爱奇艺、腾讯视频、各种 SaaS 工具的订阅管理问题,而鸿蒙平台上做这类工具的 App 几乎没有。
加上 HarmonyOS NEXT 的 ArkUI 框架这两年成熟了不少,ArkTS 写起来比早期的 JS/eTS 顺手很多,我就决定移植一版过来。
核心功能设计
订阅仪表盘
App 打开第一屏就是一个总览仪表盘:本月预计支出多少、有几个活跃订阅、有几个「高危」需要审查。
我刻意不做成复杂的图表堆砌。就两个数字最重要:这个月要花多少,有几个该斩的。
风险等级检测
这是我觉得最有价值的功能。每个订阅会根据三个维度自动打分:是否处于试用状态、距下次扣费还有几天、月费金额是否超过 50 元。三个维度组合出高危/中危/低危三个等级,高危订阅在列表里有明显的红色标记。
这比单纯「记账」多走了一步:主动告诉你「这个可能在白花钱」。
「斩」这个交互
停用订阅不叫「删除」或者「停用」,叫斩。
点下去有个小动画,订阅条目会归档到「已斩」Tab。这个设计挺重要——把一个有点难受的行为(承认自己之前在浪费钱)变成一个有仪式感的主动动作。斩了就斩了,干净利落。而且随时可以在「已斩」里恢复,没有心理负担。
技术实现:ArkUI 的几个细节
在 HarmonyOS 版本里,订阅数据的核心模型用 ArkTS 的 class 来描述,周期换算逻辑直接对应了 iOS 端的 BillingCycle.multiplierToMonthly:
enum BillingCycle {
Monthly = 0,
Quarterly = 1,
Yearly = 2
}
function toMonthlyAmount(price: number, cycle: BillingCycle): number {
switch (cycle) {
case BillingCycle.Monthly: return price;
case BillingCycle.Quarterly: return price / 3.0;
case BillingCycle.Yearly: return price / 12.0;
default: return price;
}
}
```
月度总支出就是把所有 active 状态订阅跑一遍 `toMonthlyAmount` 求和,逻辑非常直接。
风险评分这块,高危的判定条件是:**试用状态且 7 天内扣费**,或者**月费超过 50 元且 3 天内扣费**。前者是「试用陷阱」,后者是「大额即将到期」。两个条件满足任意一个就标红。中危是月费超过 50 元但还有 7 天以上,或者试用状态但还有 7 天以上缓冲。
ArkUI 的 `List` + `ListItem` 渲染订阅列表体验还不错,左滑「斩」的手势配合 `animateTo` 做归档动画,整体流畅度在鸿蒙设备上表现可以:
```arkts
@Component
struct SubscriptionCard {
@Prop item: SubscriptionItem
onKill: () => void = () => {}
build() {
Row() {
Text(this.item.icon).fontSize(28)
Column() {
Text(this.item.name).fontSize(16).fontWeight(FontWeight.Medium)
Text(`¥${toMonthlyAmount(this.item.price, this.item.cycle).toFixed(2)}/月`)
.fontSize(13).fontColor('#888888')
}.alignItems(HorizontalAlign.Start).layoutWeight(1)
if (this.item.riskLevel === 'high') {
Text('高危').fontColor(Color.Red).fontSize(12)
}
}
.padding(16)
}
}
```
「高危」标签那个红色提示在实际使用中效果很明显——用户很难忽视它。
---
## 订阅服务预设库
录入订阅是个摩擦点。如果每次都要手动输入名称、金额、周期,用户懒得用。
我内置了一个预设库,覆盖了 Netflix、YouTube Premium、Disney+、爱奇艺、腾讯视频、Spotify、Apple TV+、各类 SaaS 工具等大几十个常见服务,带参考价格和图标。搜索时做了模糊匹配,输入「net」能匹配到 Netflix,输入「yt」能匹配到 YouTube Premium。
匹配算法用了别名打分(`SubscriptionCatalogMatch` 里的 `score` 字段),取最高分的结果自动填入表单。用户只需要确认一下价格和下次扣费日期就行。
---
## 一些没做进去的功能
有几个功能想了很久最后没上:
- **自动识别订阅扣费**(读取短信/邮件):鸿蒙和 iOS 的权限管控都很严,合规风险太大,放弃了
- - **多人共享订阅分摊计算**:数据模型里已经有 `isShared` 和 `membersCount` 字段,UI 层还没完整实现,留到后续版本
- - **导出账单**:有用户问过这个,在排期里
---
## 现在的状态
iOS 版本已经在 App Store 上架,上架两周,下载量不到 100。冷启动阶段嘛,没什么可遮掩的。有意思的是,第一个留言的用户说「一打开就发现了两个忘掉的订阅,直接斩了,感觉很爽」——这个反馈让我觉得方向是对的。
鸿蒙版本正在适配 HarmonyOS NEXT,预计近期提交华为应用市场审核。
**iOS 版可以直接在 App Store 搜「订阅斩」或「SubKiller」,App ID 是 6761400615。鸿蒙版上架了我会在评论区第一时间更新链接。**
有 iOS 背景的同学迁移 ArkUI 比想象中顺,Preferences 那块坑挺多,有问题欢迎评论区聊。
1431



被折叠的 条评论
为什么被折叠?



