本页与 支持页面 内容一致地对照产品当前代码逐句核实(2026-09-05)。「定稿」不代表「不会再改」——本文只保证在核实那一刻与当时代码一致,代码或 Apple 隐私问卷要求变化时会跟着更新。
生效日期:2026-09-05
最后更新:2026-09-05
一、这份政策适用于谁
本政策适用于「眺一下」iPhone App 及其配套的 Apple Watch App(以下统称「本 App」)。本 App 是一款帮助你执行 20-20-20 用眼休息习惯的工具,不提供医疗诊断功能,也不应被当作医疗建议。
二、一句话结论
本 App 不收集你的任何数据,也没有我们自己的服务器。 它没有账号系统,没有第三方分析 / 广告 / 崩溃上报 SDK。你在 App 里产生的周期状态、个性化设置、今日次数,全都留在你自己的设备上。
但「没有我们的服务器」不等于「这个 App 从不联网」,这两件事必须分开说清楚。 准确的说法是:
- 本 App 自己没有写任何一行网络请求代码。 截至本文定稿,四个发布 target 的 Swift 源码里对
URLSession、URLRequest、NWConnection的检索零命中;Core/Package.swift未声明任何第三方依赖。 - 它与外界的全部交互,都发生在 Apple 的系统框架里,而不是我们自己的通道:
| 系统框架 | 用来做什么 | 会不会离开你的设备 |
|---|---|---|
| StoreKit | 查询 Pro 商品信息、发起购买、恢复购买、核对当前权益 | 会。这一条确实会与 Apple 的 App Store 服务器通信,「恢复购买」还可能要求你重新登录 Apple 账户。经手的是 Apple,不是我们——我们既拿不到也不存储你的支付信息 |
| WatchConnectivity | iPhone ↔ Apple Watch 同步周期状态与控制指令 | 不会。走苹果系统层的设备间本地配对通道 |
| UserNotifications / AlarmKit | 排程与呈现提醒、持续警报 | 不会。本机系统服务 |
| WidgetKit | 刷新「今日进度」小组件(主屏 / StandBy 小组件位;不支持锁屏小组件位) | 不会。本机系统服务 |
| ActivityKit | 呈现锁屏上那张会走倒计时的实时活动卡片与灵动岛 | 不会。本机系统服务,状态由系统在本机保管 |
Apple 如何处理经过 StoreKit 的信息,适用 Apple 官方隐私政策。
随 App 一起提交给 Apple 的隐私清单 PrivacyInfo.xcprivacy 声明 NSPrivacyTracking = false、采集数据类型为空数组——这说的是「我们不采集、不追踪」,不是「不产生任何网络流量」。
三、我们不收集哪些信息
本 App 不需要注册账号,因此不会、也没有渠道收集:
- 姓名、邮箱地址、电话号码
- 登录凭证(密码、验证码等)
- 任何形式的用户唯一身份标识——本 App 不建自己的用户系统,也不生成任何自定义用户 ID、设备指纹或广告标识符
我们没有自建服务器,产品功能不依赖任何我们自己的后端,因此:
- 不存在「我们的服务器收到了你的数据」这种情形
- 不向任何第三方共享、出售你的数据,也不用于广告投放
- 本 App 不含广告,未集成任何广告 SDK、分析统计 SDK 或崩溃上报 SDK
唯一的例外是内购:Pro 的商品查询、购买与恢复购买要经过 Apple 的 App Store 服务器(见第二节的表和第四节)。那条通道由 Apple 提供、由 Apple 经手,我们既看不到也存不下你的支付信息。
四、Pro 购买与支付信息
本 App 提供一项「Pro 一次性购买」内购项目(非消耗型,不是订阅,不会自动续费),用于解锁个性化的工作时长、远眺时长、提醒铃声、延后时长四项设置。
- 购买流程完全由 Apple StoreKit 处理。 本 App 通过苹果官方接口(
Product.products查询商品、product.purchase发起购买)完成购买,全程不接触、不存储你的银行卡号、账单地址等任何支付信息。 - 这几步会与 Apple 的 App Store 服务器通信——商品价格、购买结果都来自 Apple;当前权益的判断不以 App 自行保存的某个布尔标记为准,而是看系统本地维护的已验证交易记录(见下一条)。我们自己没有服务器参与这条链路,但这不等于这条链路不联网,前一句和后一句都得说。
- 你的购买记录、发票与退款均由 Apple 管理。本 App 判断「你是否拥有 Pro」的唯一依据,是系统(StoreKit)提供的已验证交易记录(
Transaction.currentEntitlements)——本 App 不自己保存一份「已购买」的凭证,也没有地方可以上传它。(这份记录由系统在本机维护,读它本身不一定需要联网;真正需要联网的是上面那几步与 Apple 的交互。) - 「恢复购买」入口在 App 内:设置 →「关于」→ 打开购买页 → 页面底部「恢复购买」(那一行入口的文字:未购买时显示「解锁 Pro」,已购买时显示「眺一下 Pro」)。它做的事是调用
AppStore.sync()让系统重新核对你 Apple 账户下的购买记录——这一步同样要连 Apple 的服务器,而且可能要求你重新登录 Apple 账户。 - 关于苹果如何处理你的支付信息,请参阅 Apple 官方隐私政策。 Apple 对这两件事的官方说明:内购、AppStore.sync()
基础提醒能力在免费版中完整提供,不是付费功能——标准 20 分钟工作 / 20 秒远眺周期与默认到时提醒不收费;AlarmKit 持续警报同样不收费,但它需要 iOS 26.0 及以上并授予「闹钟」权限,条件不满足时自动改走普通系统通知(见上一节)。Pro 只解锁上面那四项个性化设置。提醒能不能按时响,还取决于系统版本、权限、设备状态以及静音、专注等系统设置,本 App 不承诺必响,也不会无条件穿透静音或专注模式。
五、系统权限说明
本 App 只在需要时申请以下系统权限,全部只用于完成提醒功能,不用于收集任何个人信息。
权限请求的时机:本 App 不会在你第一次打开它时就连环弹出授权框。首次引导看完之后,直到你第一次真正点下「开始」,才会请求提醒相关的权限;无论你允许还是拒绝,这一次「开始」都会照常执行,不会因为拒绝授权就吞掉你的操作,也不会反复追问第二次。
下面两项是相互独立的两次系统授权,不是一个开关:通知权限归 iOS 的「通知」设置管,AlarmKit 权限是 iOS 26 起新增的另一项授权。允许其中一个、拒绝另一个都是可能的,App 会按实际拿到的权限选择用哪条通路提醒你。
1. 通知权限(UNUserNotificationCenter)
用于在工作到时、远眺结束时提醒你,也作为下方 AlarmKit 不可用时的兜底提醒方式。通知内容只有「该休息了」这一类提示文案与操作按钮,不包含任何个人信息,也不上传到任何地方。
2. AlarmKit 权限(NSAlarmKitUsageDescription)
用于提供一条比普通通知更明确、持续性更强的系统级警报(体验更接近「闹钟」)。App 内向你展示的权限说明原文为:
「用于在你设定的时间发出持续提醒,提醒你抬头看远处。」
AlarmKit 依赖 iOS 26.0 及以上系统版本。系统版本低于 iOS 26、或你拒绝了 AlarmKit 授权时,App 会自动回退为普通系统通知,不会因为拿不到 AlarmKit 权限就完全失去提醒能力。
本 App 不申请定位、通讯录、相册、麦克风、相机、健康数据或任何形式的追踪权限。
六、Apple Watch 与 iPhone 之间的数据同步
如果你安装并配对了 Apple Watch 版「眺一下」,两台设备之间会通过苹果官方的 WatchConnectivity 框架同步:
- 当前周期状态的一份只读投影:现在是工作阶段还是远眺阶段、本轮的绝对结束时间、周期标识与版本号;
- 少量控制指令:例如在手表上按「开始远眺」「延后」「结束本次」,以及手表 App 的一条启动记录(启动时刻、累计启动次数、手表端 App 的版本号与构建号)。这条启动记录保存在 Apple Watch 本机,只是随消息捎给 iPhone 用来在诊断页上显示「手表上这个 App 到底跑起来没有」;iPhone 拿到后只放在内存里,不写进 iPhone 的存储。
关于这条通道:
- 它是设备与设备之间的本地直连(走苹果系统层的 iPhone-Watch 配对通道),既不经过我们的服务器(我们没有),也不经过 Apple 的服务器——这条通道就是两台设备之间的事。
- 同步内容仅限上述周期状态与控制指令,不包含任何身份信息。
- 警报最终呈现在 iPhone 还是 Apple Watch 上由 iOS 决定,本 App 不控制、也不做承诺。
七、本 App 在你设备上存储了哪些数据
以下清单于 2026-09-05 逐项对照代码的实际读写点核实(不是只搜键名)。全部保存在设备本地的 UserDefaults(iOS/watchOS 提供的应用本地设置存储区),开发者不接收这些数据,本 App 也不主动上传到任何服务器、不主动同步到 iCloud 或任何云端账户。
关于系统备份:上面这些持久化设置可能会按你自己的系统设置、随 Apple 的设备备份 / iCloud 备份机制进入系统备份。那是 iOS / watchOS 平台层面的行为,由你在系统「设置」里自己开关,本 App 既不控制它、也读不到那份备份,更不会因此收到任何数据。这一条和第二章那张表不冲突:本 App 自己主动发起的网络通信仍然只有 StoreKit 那一项会与 Apple 的 App Store 服务器通信——「App 自己主动上传数据」(没有这回事)和「系统按你的设置替整台设备做备份」是完全不同的两件事。
「存在哪台设备上」是一个会被误读的地方,所以单列一栏:iPhone 上的数据和 Apple Watch 上的数据是两份,各自存在各自那台设备里,不存在一个跨设备的共享池。
| 存储内容 | 用途 | 存在哪台设备 | 具体位置 |
|---|---|---|---|
| 当前工作/远眺周期状态(周期阶段、绝对结束时间、周期标识与版本号等) | App 重启、锁屏、后台切换后恢复正确的周期状态,避免重复提醒或错误倒计时 | iPhone | 主 App 自己的 UserDefaults |
| Pro 个性化设置(自定义工作时长、远眺时长、铃声、延后时长) | 记住你购买 Pro 后设置的参数 | iPhone | 主 App 自己的 UserDefaults |
| 铃声选择(提醒音效类型标识),以及一次性的铃声设置迁移完成标记 | 记住你选择的提醒音效;标记确保旧版本升级时只迁移一次 | iPhone | 主 App 自己的 UserDefaults |
| 已排程警报的标识台账 | 记录当前排了哪些 AlarmKit 警报,取消或重排时按标识精确清扫,避免漏掉或重复 | iPhone | 主 App 自己的 UserDefaults |
| 首次体验的两个标记(引导是否看过、权限是否已经请求过一次) | 引导只在第一次显示;权限只问一次,不反复打扰 | iPhone | 主 App 自己的 UserDefaults |
| 今日完成次数(权威副本) | 主 App 显示「今天眺了几次」 | iPhone | 主 App 自己的 UserDefaults,不在共享容器里 |
| 给「今日进度」小组件看的那份投影(当前阶段、本轮结束时间、今日完成次数的一份拷贝) | 今日进度小组件读它来显示(可以放在主屏或 StandBy 的小组件位;不支持锁屏小组件位)。锁屏上那张会走倒计时的实时活动卡片和灵动岛不读它,见下 | iPhone | App Group 共享容器 group.com.adrain.tiaoyixia(见下) |
| Watch 指令去重表(近期从 Apple Watch 收到的指令标识的短字符串记录) | 避免同一条来自手表的操作被重复执行 | iPhone | 主 App 自己的 UserDefaults |
| Watch 启动记录(启动时刻、累计启动次数、手表端版本号/构建号) | 判断手表上这个 App 是否真的启动过 | Apple Watch(不是 iPhone) | 手表端 App 自己的 UserDefaults。它会随每条发往 iPhone 的消息捎过去,但 iPhone 只把它放在内存里显示在诊断页上,不落盘 |
| 最近一份周期状态投影的缓存 | 手表离线或 iPhone 暂不可达时仍能显示上次已知状态 | Apple Watch | 手表端 App 自己的 UserDefaults |
关于「权威副本」和「投影」的区别(上表里今日完成次数占了两行,不是写重了):真正被当作事实的那一份「今天眺了几次」存在主 App 自己的 UserDefaults 里;共享容器里那一份是派生出来的只读投影,专门写给小组件读。分开的原因很实际——App Group 在某些签名配置下可能拿不到,那时不该连你自己 App 里的次数也一起丢掉,丢掉的只应该是「小组件上还能不能看到它」这一件事。
关于 App Group 共享容器:主 App 与「今日进度」小组件同属本 App 的同一个 App Group(group.com.adrain.tiaoyixia),主 App 把上面那份投影写进去,小组件读它。这个容器只在你这台 iPhone 上、只在本 App 自己的这几个部件之间共享,其他 App 读不到,也不会写给任何组外的东西看。Apple Watch 不参与这个共享容器——手表在另一台设备上,两端之间靠 WatchConnectivity 传消息,不是共享同一块存储。这一条已在提交给 Apple 的隐私清单里按 Apple 要求声明为 UserDefaults 的两条使用理由(CA92.1 与 1C8F.1)。
锁屏实时活动与灵动岛走的是另一条路,不经过这个共享容器(这两条别混成一件事):
| 你在屏幕上看到的东西 | 数据从哪来 |
|---|---|
| 今日进度小组件(主屏 / StandBy 小组件位上那个不走秒的小方块;不支持锁屏小组件位) | 读上面那份 App Group 共享投影 |
| 锁屏上那张会走倒计时的卡片、以及灵动岛(StandBy 全屏显示的也是它) | 读的是系统 ActivityKit 自己保管的那份实时活动状态——主 App 通过系统接口把「当前阶段 + 本轮的绝对结束时间」推给系统,之后由系统负责在锁屏与灵动岛上呈现。它不读、也不写 App Group 那个共享容器,因此也不在上面那张存储表的任何一行里 |
两条路都只发生在你这台设备上,都不涉及任何服务器;分开写只是为了让上面那张表的「读的是谁」准确,不是说存在第二处数据留存。
关于开发调试功能:开发者选项、模拟购买面板、短周期测试模式等仅供内部开发使用的功能,不参与正式版本的编译,不会出现在你从 App Store 安装的 App 里。这一点已用签名后的正式构建产物逐项核验过(二进制符号与四种语言的文案资源中相关条目计数均为 0),不是「运行时隐藏」。
八、没有账号,如何清除本地数据
因为本 App 不要求注册账号,所以不存在「申请删除账号」这类流程。
本 App 目前没有提供 App 内的「清除本地数据」按钮;清除的办法是卸载。因为 iPhone 与 Apple Watch 上的数据是两份(见上表),这里分三件事说清楚:
- 卸载 iPhone 上的「眺一下」 —— iOS 会清除该 App 在这台 iPhone 上的本地存储,包括上表中标着「iPhone」的全部内容,以及那个 App Group 共享容器。
- Apple Watch 上那份要跟着手表端的 App 走 —— 上表中标着「Apple Watch」的两项(启动记录、周期状态投影缓存)存在手表本机。它们随手表端 App 一起被移除;iPhone 端卸载时,系统通常会一并移除配对手表上的伴侣 App,但如果你此前在 Watch App 里单独保留了它,就需要在手表上再删一次。请以你设备上的实际情况为准,不要假设删一端就一定删干净了两端。
- 已购买的 Pro 不受影响,也删不掉 —— 购买记录由 Apple 管理、存在你的 Apple 账户下,不在我们能触及的范围内。重新安装后在购买页点「恢复购买」即可重新获得权益;反过来说,卸载 App 也不会撤销或退掉这笔购买。
另外:因为我们从未收集过你的任何数据、也没有自建服务器,所以不存在需要我们代为删除的远端副本。(Apple 侧与你购买记录相关的数据由 Apple 按其隐私政策处理,不由我们经手。)
九、儿童隐私
本 App 不收集任何用户的个人信息,无论年龄。它没有账号、没有社交功能、没有用户生成内容、没有广告,也不进行任何形式的追踪,因此不存在针对儿童的数据采集行为。
十、政策的变更
本政策如有更新,我们会在本页更新「最后更新」日期,并在 App 版本更新说明中提示。因为本 App 没有账号体系,无法逐一通知用户,请以本页当前内容为准。
十一、联系方式
如你对本政策有任何问题,可通过以下方式联系我们:
电子邮件:safferuk@gmail.com
十二、与 App Store 隐私标签(Privacy Nutrition Label)的对应关系
App Store Connect 在提交审核前要求填写「App 隐私」问卷。基于上文已核实的事实,本 App 对应的正确填法是:
- 数据收集:不收集任何数据(Data Not Collected)——无账号、无第三方 SDK、我们自己不接收也不存储任何用户数据。 注意理由要写对:这一条不能用「App 完全不联网」来论证,因为内购要经过 Apple 的 App Store 服务器(见第二、四节)。正确的理由是:那条通道由 Apple 经手,开发者一侧既不接收也不存储任何可关联到你的数据;Apple 的隐私问卷本身也不要求把 Apple 自己的内购处理算作开发者的数据采集。
- 用于追踪:否——与随包提交的
PrivacyInfo.xcprivacy中NSPrivacyTracking = false一致。
这份问卷需要项目负责人在 App Store Connect 上实际操作填写,本页不代替那一步;提交前应按 Apple 当时的问卷选项,对最终提交的那一份构建再核实一次。参考:Apple App Store Connect:管理 App 隐私