独立开发订阅管理App技术复盘:SwiftData踩坑、周期换算与风险检测

利用MATLAB 4f光学系统,在Python中进行弗劳恩霍夫衍射和傅里叶面滤波——用镜头模拟光学图像处理。.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

起因:信用卡账单上那笔想不起来的扣费

去年年底,我翻信用卡账单的时候发现一笔 15 块的扣费,死活想不起来是什么。查了半天才发现是某个 App 的试用期过了自动续费了——我甚至都没打开过第二次。

这事儿让我挺不爽的。我就想,能不能做一个工具把自己所有的订阅服务都记下来,哪些该续、哪些该砍,一眼就能看清楚。

于是「订阅斩」就这么开始做了。

产品定位:不只是记账,要有「斩掉」的仪式感

市面上有不少订阅管理工具,但大多数做法就是一个列表加一个总价。我觉得这不够——问题不在于「看见」,在于「行动」。

所以我给 App 设计了一个核心交互隐喻:斩。你不是在删除一条记录,你是在斩断一笔持续失血的开支。停用之后它会进入「已斩」Tab,带有一种完成任务的成就感。

说白了就是把无聊的记账操作包装成带点游戏感的动作。

技术选型:SwiftData + Swift 6

项目从一开始就用了 SwiftData 做持久化。说实话当时 SwiftData 刚出来不久,踩了不少坑,但好处是跟 SwiftUI 的数据流配合很顺畅,不用写一堆 NSFetchedResultsController 的样板代码。

核心的数据模型是 Subscription,长这样:

@Model
final class Subscription {
    var id: UUID
        var name: String
            var price: Double
                var cycle: Int          // 0=月付, 1=季付, 2=年付
                    var isTrial: Bool
                        var nextBillingDate: Date
                            var status: Int         // 活跃 / 已斩
                                var killedDate: Date?
                                    var isShared: Bool
                                        var membersCount: Int
                                            var icon: String
                                                var unsubscribeURL: String
                                                    var source: Int
                                                        var categoryStorage: String?
                                                        }
                                                        ```
这里有个设计取舍:`cycle` 和 `status` 我存的是 Int rawValue 而不是直接存枚举。原因是 SwiftData 对枚举的迁移支持当时还不太稳定,用 Int 更保险,上层再包一个计算属性转回枚举就行。

## 账单周期统一换算

用户录入订阅时可以选月付、季付、年付,但仪表盘要展示的是「每月总支出」,所以需要把所有订阅统一折算成月度金额:

```swift
enum BillingCycle: Int, CaseIterable {
    case monthly = 0
        case quarterly = 1
            case yearly = 2
    var multiplierToMonthly: Double {
            switch self {
                    case .monthly:   1
                            case .quarterly: 1.0 / 3.0
                                    case .yearly:    1.0 / 12.0
                                            }
                                                }
                                                }
                                                ```
计算月度开销的时候,每条订阅的 `price * billingCycle.multiplierToMonthly` 再求和就行。看着简单,但我一开始犯了个低级错误——季付写成了 `3.0 / 1.0`,导致仪表盘显示的金额离谱地高,自己测试的时候还以为是 UI 刷新问题,排查了好一阵。

## 风险检测:哪些订阅该「斩」

这是我比较满意的一个功能。App 会根据几个维度给每条订阅打风险标签:

- **高危**:试用期订阅且距离下次扣费不到 3 天(很多人就是在这个窗口期忘了取消)
- - **中危**:超过 60 天没有手动确认仍需要的订阅
中危这个怎么判定呢?实现上很简单——每条订阅详情页有个「我仍需要」的按钮,用户点击后会重置一个 `lastConfirmedDate` 时间戳。App 拿当前日期跟这个时间戳做 diff,超过 60 天就标中危。如果你从来没点过这个按钮,那从创建日期开始算。

另外共享订阅会降低风险权重(毕竟分摊了成本,单人月均花费低)。

逻辑不复杂,但实测下来确实能帮自己抓出不少「订阅刺客」。我自己用了两个月,砍掉了 4 个订阅,每月省了大概 80 块。

## 内置订阅预设库

为了降低用户录入成本,我在代码里维护了一个 `SubscriptionCatalog`,内置了常见订阅服务的预设信息——名称、图标、默认周期、参考价格、是否适合共享等。用户输入名称的时候会做模糊匹配,命中预设就自动填充其他字段。

目前收录了 Netflix、YouTube Premium、Disney+、Spotify、iCloud+ 这些主流服务,还有国内的爱奇艺、B站大会员、QQ音乐等。这个库还在慢慢补充。

## 提醒系统

`AppSettings` 里有三档提醒配置:提前7天、3天、1天。我用 UserNotifications 在每次订阅数据变更时重新计算并注册本地通知。

这里有个细节:iOS 对本地通知的 pending 数量有 64 条的限制。如果用户录了很多订阅且三档全开,很容易超限。我的做法是按紧急程度排序,优先注册距离最近的扣费提醒,超出的部分下次打开 App 时再补。

## 多币种支持

因为我自己有美元订阅也有人民币订阅(对,就是那些海外 SaaS 工具),所以 App 支持多币种显示。默认币种根据设备 Locale 自动推断:

- `CNY` → ¥
- - `USD` → $
- - `JPY` → JP¥
- - `TWD` → NT$
- - 其他一律 fallback 到 ¥
为什么 fallback 选 ¥ 而不是 $ 或者直接显示货币代码?原因很实际——我的目标用户绝大多数是中文用户,设备 Locale 拿不到货币信息的情况基本只发生在一些小众地区设置上,这种边缘 case 显示 ¥ 比显示一个用户可能不认识的三字母代码(比如 MYR、THB)体验更好。以后如果海外用户多了再改成显示货币代码也来得及。

## 上架情况

App 2024年底上架 App Store,当前版本 1.2。感兴趣的可以在 App Store 搜「订阅斩」。

说实话下载量还很少,独立开发最难的不是写代码,是让别人知道你做了这东西。没有投过广告,也没找人推过,就靠自然搜索慢慢来。

## 几个踩坑点总结

1. **SwiftData 的 `@Attribute(originalName:)` 是救命的**。我中途改过好几次字段名,有这个注解才不至于丢用户数据。
2. **枚举存 rawValue 虽然丑但稳**。Swift 的类型安全是好事,但持久化层还是得对迁移友好一点。
3. **游戏化设计比我预想的有效**。加了「已斩」计数器之后,我自己都会有冲动去多砍几个订阅。这算是产品设计中一个小验证。
4. **预设库的模糊匹配最初用的是 `contains`,后来改成了加权评分**。因为 `contains` 会把 "Apple TV+" 匹配到所有带 "apple" 的预设上,误报太多。
## 下一步计划

- 支持 OCR 识别截图中的订阅信息(已经做了基础版本,每日有免费额度限制)
- - iCloud 同步(模型层已经预留了 `iCloudSyncEnabled` 字段)
- - 考虑做一个 HarmonyOS NEXT 版本,ArkTS + ArkUI 那套我还在学,等 iOS 版稳定了再说
---

对了,想问问同样在做 iOS 独立开发的朋友:你们现在持久化选 SwiftData 还是 CoreData?SwiftData 的 lightweight migration 你们踩过坑吗?我遇到过改字段类型之后 migration 静默失败的情况,最后是靠 `@Attribute(originalName:)` 绕过去的,不知道有没有更好的解法。
利用MATLAB和Excel对逆流双管热交换器的热性能进行分析。.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

相关推荐

利用MATLAB对5G NR波束成形技术的性能分析.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

华为昇腾910B4(A2)服务器环境搭建笔记

Qwen3.5 默认支持思考模式。首次测试建议关闭思考模式,更容易判断模型是否成功回答。我建议把模型统一存放在宿主机的 /data/models 目录中。这样即使删除 Docker 容器,模型文件也不会丢失。这里先进行单卡测试,确保容器能正确调用 NPU。安装ModelScope 用于下载模型。继续在刚才的容器内部执行。

guoqingru0311的博客 282

工业互联网工控安全与工业质检AI大模型建设方案.pptx

工业互联网工控安全与工业质检AI大模型建设方案.pptx

华为VXLAN OVER EVPN(EBGP)

本文基于 eNSP Pro 模拟器,完整复现 Spine-Leaf 架构下 VXLAN over EVPN 的二层互通实验。实验目标是:通过 EBGP 在 Spine 与 Leaf 之间建立 Underlay 路由,再借助 BGP EVPN 承载 VXLAN 隧道,最终实现跨 Leaf 的同一子网二层互通,并验证头端复制(Head-End Replication)方式的 BUM 流量转发。

246

通信行业CentOS 7内核网络栈优化:高并发连接下UDP/TCP性能调优与系统资源管理

内容概要:本文聚焦于CentOS 7系统在通信行业高并发场景下的性能调优实践,重点围绕内核网络栈优化展开,涵盖UDP/TCP缓冲区调整、文件句柄与连接跟踪表扩容、TIME_WAIT状态复用、软中断分布优化及tuned工具的自动化调优。通过具体配置参数和实际案例(如VoIP软交换系统)深入解析各项调优措施的设计原理与实施效果,有效解决高CPS下丢包、连接失败等问题,并展望了向云化、eBPF等动态智能调优方向的发展趋势。; 适合人群:从事通信系统运维、网络开发或Linux系统性能优化的技术人员,具备一定操作系统和网络基础知识,工作经验1年以上的中初级工程师。; 使用场景及目标:①应用于软交换、媒体网关、信令网关等高并发通信设备的系统调优;②解决UDP丢包、conntrack表满、TCP连接队列溢出等典型性能瓶颈;③提升系统在小包高频、低时延要求场景下的稳定性和吞吐能力。; 阅读建议:建议结合实际生产环境或测试平台同步验证文中配置,重点关注参数背后的物理意义(如BDP、softirq、conntrack机制),并配合ss、conntrack、dmesg等命令进行调优前后对比分析,确保安全可控地实施变更。

2024 《计算机网络》实验教学指导书.doc

2024 《计算机网络》实验教学指导书.doc

华为云云硬盘 EVS:挂载、初始化与快照回滚,一块数据盘的完整生命周期

一块云硬盘的生命周期是「买 → 挂 → 初始化 → 用 → 卸 → 再挂」。Windows 靠磁盘管理初始化、靠脱机保证能换机;Linux 靠。

xbzb的博客 700

不平衡电网下自抗扰顺序模型预测PWM整流器控制仿真模型(Simulink仿真实现)

内容概要:本文围绕面向城市空中交通的多无人机路径规划问题展开研究,提出了一套融合全局规划、动态避障与局部协同调整的综合路径规划方法。研究内容涵盖基于改进RRT算法与图论的全局路径规划、基于动态风险场和动态窗口法(DWA)的模型预测控制实现动态避障,以及基于分布式协同控制的多无人机局部路径协同策略。通过Matlab平台构建仿真环境,在多种典型城市交通场景下对所提方法进行了系统性验证,结果表明该方法在路径安全性、编队稳定性与任务效率方面表现优异。文章还深入探讨了算法的创新点与未来研究方向,为复杂城市环境下多无人机系统的自主协同提供了理论支撑与技术路径。; 适合人群:具备自动化、控制理论、计算机科学或相关领域基础知识,从事无人机系统、智能交通、路径规划、多智能体协同控制等方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①为城市空中交通系统中的多无人机安全、高效飞行提供可靠的路径规划解决方案;②支持在复杂、动态的城市场景中开展无人机自主导航、编队飞行与协同控制的技术研究与仿真验证。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点关注算法的具体实现细节、参数配置对性能的影响以及不同仿真场景下的实验设计,以深入理解各模块的集成逻辑与实际应用效果。

手头只有华为配置,新设备是华三?粘进来自动翻

手头有华为配置,新设备是华三?用「跨厂商转换」工具,粘贴配置后自动识别源厂商,一键转成目标厂商语法,支持华为、华三、锐捷、迈普、思科等主流设备。精准处理VLAN、access/trunk口、SVI IP、VTY/SSH等差异,避免手动修改时漏改“拼写级”错误。转换后需人工核对核心项与独有特性,建议结合备份、比对与模拟验证,确保安全上机。

qq_42614669的博客 380

【选址和定容】模拟退火改进多目标粒子群算法在分布式电源选址和定容中的应用【IEEE69节点】(Matlab代码实现)

内容概要:本文研究了模拟退火改进多目标粒子群算法在分布式电源选址和定容中的应用,以IEEE69节点配电系统为算例进行仿真分析。通过融合模拟退火算法的强全局搜索能力与粒子群算法的高效局部收敛特性,构建了一种改进的多目标优化算法,用于解决分布式电源在配电网中的最优位置选择与容量配置问题。研究旨在实现多重优化目标,包括最小化网络有功损耗、提升节点电压质量、增强系统运行的经济性与稳定性。文中详细阐述了多目标优化模型的数学构建、算法的改进机制与实现流程,并基于Matlab平台完成了算法编程与仿真验证,结果表明所提方法在求解质量和收敛性能上均优于传统算法。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力,从事配电网规划、分布式能源系统优化、智能优化算法应用等相关领域的科研人员、工程师以及高校研究生。; 使用场景及目标:①解决高比例分布式电源接入背景下配电网的科学规划问题;②为新型电力系统中源网协调设计提供有效的优化工具;③为相关领域的科研工作提供可复现、可拓展的算法模型与仿真代码实例,支持进一步的算法对比与功能升级。; 阅读建议:建议读者结合提供的Matlab代码与IEEE69节点标准数据,动手复现实验结果,深入理解算法的参数设置、迭代过程与多目标折衷分析方法,并可根据实际研究需求修改目标函数或引入新的约束条件以适应不同的应用场景。

F5 GTM DNS 实战指南:智能DNS的监控与健康检查机制

本文深入解析F5 BIG-IP GTM智能DNS的核心机制,重点阐述其监控与探针两大功能如何协同工作。监控器负责深度检查服务器应用健康,确保服务可用性;探针则实时测量网络路径质量,实现基于延迟的智能流量调度。文章通过实战配置步骤,指导如何构建逻辑架构、建立iQuery通信、配置业务级健康检查及探针,从而构建高可用、高性能的全局负载均衡解决方案。

weixin_29240711的博客 468

IPD咨询洞察:华为项目文化:让胜利成为一种信仰

华为“让胜利成为信仰”的本质是使命必达,落地为五项内核:开放创新、勇于担当、团队协同、契约精神、善思善结。使命必达不能停留在墙面标语,须转化为可落地、可考核的行为准则,胜利才能真正成为团队习惯。

weixin_58096508的博客 90

OpenClaw 完整命令文档(2026.3.13 最新版)

本文档为OpenClaw 2026.3.13通用版使用指南,包含核心命令大全。主要内容包括:1)基础安装/升级/卸载命令;2)ClawHub扩展安装命令(支持飞书/钉钉/企微等平台连接);3)Skills技能安装命令(实现聊天/搜索/记忆等功能);4)飞书机器人授权与配对命令;5)启动运行与配置检查命令;6)工作区与记忆管理命令;7)插件安全设置命令;8)调试日志命令;9)飞书机器人一键部署简化流程。文档特别强调飞书机器人部署需feishu扩展+对应技能+用户授权的完整配置,所有命令均需在终端执行,安装后需

MKliudan的专栏 1288

YOLOv11m 部署华为 Atlas 300I Pro

部署到的全过程拆成可照抄的步骤:装驱动固件 → 装 CANN toolkit 与算子包 → 装 Ultralytics / ais_bench → 导出 ONNX → ATC 编译成.om→ 命令行/Python 推理 → CPU 端解码 NMS。给出两条路线(一键导出 / 手工 ATC)、完整可运行的预处理与后处理代码、报错排查表和验收清单。先认清硬件:300I Pro 到底是颗什么芯片部署总览:软件栈与两条技术路线环境与软件清单(开工前先对齐)

巽视达的专栏 530

T型三电平逆变器中点电位平衡详解

T型三电平逆变器(T-type Three-Level Inverter)是一种高效的多电平拓扑,相比传统NPC(Neutral Point Clamped)三电平逆变器,具有更低的开关损耗、更高效率和更简单的结构,尤其适用于中功率应用(如光伏逆变器、风电变换器和工业驱动)。(T-type Three-Level Inverter)中的应用已成为当前中高压功率变换领域(如光伏逆变器、储能PCS、电动汽车充电桩、风电并网和工业驱动)的热门方案。针对 T型逆变器,类似 NPC 的零序注入法适用。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 544

XCP详解「3.1·ASAP2新建A2L文件」

后面是ASAP2新建A2L的操作步骤,如果是APE中新建的A2L就无需以下操作,APE只需要导入现成的A2L即可。退出点击保存时会提示保存A2L文件,是因为前面导出的是1.70版本,工程最低1.71,可以另外起个名字即可。导入elf文件,elf路径建议直接索引编译生成的Debug下的,防止编译后忘记更新。导出V1.70格式A2L文件,APE17支持V1.70。通过ASAP2生成需要A2L文件更常用些。同一个信号可以创建不同属性量。ASAP2中新建A2L文件。设置标定信号数量最大值。XCP详解「总目录」

光明磊学习&积累的地方 3058

变相解决华为Mate 8锁屏后无法建立入站网络连接

当你的华为Mate 8手机锁屏时,拒绝一切入站网络连接……

xyzzklk的博客 356

YOLOv8改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用

本文记录的是利用双级路由注意力机制优化的目标检测网络模型。传统的复杂度高,随着输入空间分辨率增加,计算量呈平方增长,导致严重的可扩展性问题。而本文所使用的在获取全局信息的同时,通过区域到区域路由和令牌到令牌注意力的合理设计,减少了不必要的计算量。BiFormer: Vision Transformer with Bi-Level Routing Attention采用四阶段金字塔结构,与一些先进的视觉Transformer类似。在每个阶段,首先使用重叠的补丁嵌入(在第一阶段)或补丁合并模块(在第二到第四阶段

Limiiiing的博客 613

第10篇:打包上架:签名、打包 HAP、发布到华为应用市场

打包上架:签名、打包 HAP、发布到华为应用市场

信息安全领域优质创作者|操作系统领域专家 74

动力学约束下的运动规划算法——Hybrid A*算法(附程序实现及详细解释)

本文主要介绍动力学约束下的运动规划算法中非常经典的Hybrid A*算法,大致分为三部分,第一部分是在传统A * 算法的基础上,对Hybrid A * 算法的原理、流程进行理论介绍。第二部分是详细分析 MotionPlanning运动规划库中Hybrid A * 算法的源码,进一步深入对Hybrid A * 算法的具体细节 进行理解。 第三部分是结合前面第一部分的理论和第二部分的详细源码,对Hybrid A * 算法的流程进行综合的概括总结。

慕羽★的博客 1万+

WiFi基本概念(六)(L-STF,L-LTF)

L-STF它由10个OFDM symbol(1,0,1,0,1,0,1,0,1,0)构成,每个symbol是0.8us,GI是0.2us,总计10us。Symbol的长度是正常长度的1/4,因此称为Short training field,主要用于快速进行信号检测,信号同步,自动增益控制,接收天线选择(Diversity Selection)。 由于symbol长度是正常的1/4,子载波的宽度是正常的4倍,能进行初略的信道估计,其使用了-24, -20, -16, -12, -8, -4, 4, 8, 1

reekyli的专栏 6860

【2026-11-06】华为研发机试三道编程题解

本文整理了华为11月6日研发岗三道编程题解法:第一题为按列填充句子,通过枚举行数模拟列宽计算,求最小行数;第二题为生鲜库存优化,利用动态分配思想,预处理“采购-销售”成本,贪心选择最便宜来源满足需求;第三题涉及AC自动机与动态规划结合的序列化奖励问题。代码均以Java实现,思路清晰,适合笔试刷题参考。关注公众号【TechGuide】获取更多真题解析。

试问道几许 328

破解现代反爬虫:JS加密、OB混淆与CSS反爬的实战攻防分析

摘要: 随着反爬技术的升级,JS加密、OB混淆和CSS反爬成为主流防护手段,阻碍传统爬虫获取数据。本文解析了这些技术的工作原理,并提出破解策略:通过模拟浏览器(如Selenium、Puppeteer)执行动态JS,逆向混淆代码,以及利用开发者工具突破CSS隐藏。针对复杂防护,开发者需结合技术分析与工具应用,如API接口抓取、动态渲染破解等,以应对不断演进的反爬机制。未来,爬虫攻防将持续升级,需保持技术敏锐性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1643

如何在华为/小米/OPPO/Vivo等手机上恢复误删除的照片文件?五种方法了解下

手机相册里突然少了几张照片,是很多人都经历过的一瞬间——可能是清理内存时手滑,可能是批量删截图时误勾了一张合影,也可能是手机卡顿重启之后,相册里一整段时期的照片都不见了。 第一反应通常是"完了,删了就没了"。但真实情况恰恰相反:手机删除照片时,并不会像橡皮擦那样把画面从存储里抹掉,它做的只是注销一条索引记录。照片本身还躺在闪存里,直到被新的数据写上去覆盖掉。

2604_97005292的博客 959

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

鸿蒙远程控制软件哪个好?华为远程PC、ToDesk、向日葵三款实测

综合来看,本次横测最终更推荐ToDesk:它在支持跨品牌连接的基础上,外接鼠标、全屏远控、移动设备协助和多屏功能覆盖更完整,更适合作为主力远控工具。

2401_85083137的博客 329

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 独立开发一款「行走占领地图」的像素风App,聊聊8×8格子征服+热力衰减的实现思路
下一篇: iOS拨轮交互实现:UIScrollView吸附+Haptic Feedback,3秒录入血压数据
SameX-4869
博客等级 码龄17年 3354粉丝 657原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值