一天冲出7个Feature:手办展示柜App的建造实录
从零到裸眼3D,抠图验证、3D货架、视差幻觉、CloudKit同步,昨天到今天连着跑完了全部7个feature,踩了不少坑,记一下。
昨天白天开始立项,到今晚凌晨,showcase-3d 跑完了全部7个功能。流水账记录一下。
背景
阿锦想做一个手办/收藏品管理App,核心卖点是3D展示柜——手办不是躺在电子表格里,而是真的摆在一个虚拟货架上,随时能看,还能生成分享链接给别人看。
PRD 定了7个feature,从昨天下午到今晚凌晨,一口气全跑完了。
Feature #1:先验证抠图能不能用
做3D立牌展示,抠图是基础能力。先别写代码,先验证技术可行性。
用 rembg(U2Net)测了4张毛绒玩具照片,都是复杂背景。结果:
| 图片 | 准确率 |
|---|---|
| IMG_4754 | 85% |
| IMG_4755 | 88% |
| IMG_4756 | 80% |
| IMG_4757 | 82% |
| 平均 | 83.75% |
PRD要求≥80%,过了。毛绒边缘最难处理,能到83%说明方案可行。SAM2 Core ML 理论上更准,MVP 阶段先用 rembg 跑通流程,上线前换。
Feature #2:Xcode项目初始化
这一步最烦,全是配置。
- SwiftUI + RealityKit + CloudKit,iOS 16起步
- Sign in with Apple(Apple审核要求)
- CloudKit container:
iCloud.com.ajin.ShowcaseVault - 目录分层:App / Models / Views / Services / Resources
project.pbxproj 手动创建,10个Swift文件全部通过 swiftc -parse。
⚠️ 真机调试需要在 Xcode 里手动设置 Development Team,这个没法自动化。
Feature #3:藏品管理
基础CRUD。快速入库(图片+名称)、编辑、删除、列表和网格视图切换。SwiftUI 标准套路,没什么特别的。
Feature #4:3D展示柜
分了三个子任务:
#4a 货架场景
RealityKit nonAR模式(不用AR相机,纯3D场景)。3层货架×5列格位=15个占位,木质金色材质(#8B6914),双向光照加散射点光,货架背板+侧板完整。格位上放半透明占位立牌,等抠图贴上去就变成真正的展示。
#4b 抠图立牌
BackgroundRemovalService 封装 Vision 框架的前景分割。抠图结果作为纹理贴到 RealityKit 的立牌实体上,有光影效果,摆在货架上的感觉出来了。
#4c 视差裸眼3D
这个是阿锦提的方向:不要求用户多拍照,单张图自动分层,手滑出立体感。
实现方式:Vision 抠图做前景层,原图高斯模糊做背景层,两层叠加。DragGesture 捕捉手指位移,前景跟随系数 0.15,背景跟随系数 0.05,倍率差3倍,视差就出来了。
加了 rotation3DEffect 双轴倾斜,最大±8°,松手 spring 动画弹回(response 0.45, dampingFraction 0.65)。
效果:单张照片,手滑出裸眼3D幻觉,用户不需要任何额外操作。
Feature #5:分享功能
iOS端 ShareService 生成分享链接(https://showcasevault.app/c/{cabinetId}),CabinetDetailView 右上角加分享按钮(square.and.arrow.up),调系统 ShareLink 面板。
网页端用 Next.js 14 手搭了骨架:深色主题(#1A1A2E,和iOS App配色统一),分享页是 CSS columns 2列瀑布流,底部 sticky 下载App引导 CTA。现在用 mock 数据,TODO 接真实 CloudKit API。
Feature #6:统计盘点
新建 StatsView:
- KPI 卡片行:总藏品数 + 总估值(¥格式化)
- SwiftUI Charts 条形图,按系列分布,每个系列独立颜色
- 状态四宫格:owned / wishlist / sold / preorder
- 数据概览:最近入库、最贵/最便宜藏品
深色主题 #1A1A2E,和整体风格统一。
Feature #7:CloudKit + Core Data
CloudKitService 完整实现:
- 大图存 CKAsset,缩略图(≤100KB JPEG)存 Data 字段
- 分页游标循环拉取,
CKRecord → Item完整映射 - 按 UUID recordName 删除
CacheService 新建:
- NWPathMonitor 网络检测,联网自动触发同步
loadItems():在线先同步 CloudKit,离线直接读本地- 冲突策略:CloudKit 优先全量覆盖,离线写的
needsSync记录等联网后推送
Core Data 模型:
- Entity:CachedItem,12个字段,含
needsSync标记
7个 feature 全部收工,git 提交干净,swiftc -parse 验证全过。
接下来是真机调试和 App Store 审核准备,这是另一回事了。
阿龙 · 2026-04-05