Prototype · Private sourceCase 06 / On-device iOS

小柴。

每天一张中文小纸条,可以随手画一笔、生成分享图,也能在主屏幕 Widget 上安静出现。

A private-source, local-first iOS prototype for one daily Chinese note, lightweight drawing, shareable cards, and home-screen widgets.

Role
独立 iOS 开发者 · 产品与工程实现
Stage
v0.0.2 · 本地验证原型 · 源码私有
Core loop
每日纸条 → 涂鸦 → 分享 / Widget
Privacy
无登录 · 无云 · 无追踪 · 无第三方依赖
小柴 iOS 应用生成分享卡片并打开系统分享面板的模拟器验证截图

不是再造一个内容 Feed,而是让一天只出现一张纸条。

小柴把信息量主动压到最低:每天由本地资源决定一张纸条,用户可以读、画、分享,也可以什么都不做。最近 14 天的导航提供回看,但不制造无限下滑。

产品的信任前提同样简单:纸条、涂鸦和偏好不需要账户,不上传云端,也不依赖第三方分析服务。

UIKit 主应用与 WidgetKit 共用一个确定性的本地模型。

  1. Bundled JSON 提供纸条内容,本地文件保存用户涂鸦与偏好。
  2. UIKit 纯代码布局承载纸条、历史日期、涂鸦、撤销、清空和主题交互。
  3. 分享渲染器把纸条与涂鸦组合为图片,再交给系统分享面板。
  4. WidgetKit 读取 App Group payload;共享容器不可用时显示 bundled deterministic fallback。
  5. 版本、隐私清单、发布标识、图标、iPhone / iPad 构建与 UI 测试进入统一 Makefile 门禁。
  • Swift
  • UIKit
  • SwiftUI
  • WidgetKit
  • XCTest
  • Privacy Manifest
  • App Group

隐私不是说明文字,而是架构中没有网络层。

主 App 使用 UIKit,Widget 使用 SwiftUI

UIKit 负责需要手势、绘制和生命周期控制的主界面;WidgetKit 的 SwiftUI 声明式视图负责系统小组件。两种 UI 技术围绕共享模型协作,而不是强行统一。

共享失败时不悄悄写回普通偏好

App Group suite 不可用时,主应用不会回退到标准 UserDefaults;Widget 只展示可预测的 bundled fallback,避免两个进程看起来同步、实际数据分叉。

发布检查前置

App、Widget 与 Tests 的版本一致性、Privacy Manifest、标识和图标由脚本检查,减少“模拟器能跑但发布配置缺失”的后期返工。

本案例公开的验证证据。

  • 模拟器画面本页截图来自分享链路的模拟器验证,展示主卡片与系统分享面板。Visual proof
  • 构建与测试项目具备 iPhone / iPad clean test、独立 UI test 与无签名 Release build 命令。Private logs
  • 隐私门禁App 与 Widget 各自包含 Privacy Manifest,并声明不追踪、不收集数据。Static checks
  • 学习前置公开的 UIKitLifecycleDemo 记录 UIKit 生命周期、事件路由与测试工作流。Review ↗

原型边界与分发状态。

Private-source boundary

本案例只发布脱敏截图与工程说明,不公开源码仓库地址、签名信息、设备标识或构建日志。页面不提供下载,也不暗示已经上架。

当前版本以模拟器和本地设备开发为主,尚未完成 TestFlight / App Store Connect 分发。无签名 CI 可以验证编译与 fallback,但不能替代真实签名后的 App Group 跨进程共享验收。

Back to first case · 01 / 06全智评 · 证据优先的实操评价