QuakeSense 震感,一款简洁原生的 iOS 地震通知 App

3460 字 · 296 阅读 · 2024 年 08 月 28 日

2015 年,还在上大学的我买了一部 iPhone 5c。对,就是那款非常漂亮的聚碳酸酯外壳手机。

同年,我在网上看到了少数派,并向其投递了一篇关于 VSCO App 的 体验文章。正是那篇如今看来非常青涩的短文,让我开始不断地体验各式各样的 iOS 应用,并且写下了一篇又一篇的 App 体验文章。

我不曾想过,十年后的今天,我会自己编写一款 iOS App,并且发布到 App Store 上。

这是我的第 187 篇 App 体验文章,也可能是我最特别的一篇文章,将这款由我自己业余时间开发的 App 分享给你。

即兴之作

我日常会关注地震消息,作为 2008 年大地震的亲历者,我对地震有着特殊的敏感度。虽然不是每一次地震都会影响到我,但我还是会习惯性看看最近哪里发生了地震。

我之前一直在用某款「地震预警」App,直到有一天我发现它的更新包已经超过 500 MB。我实在无法理解一款查看地震信息的 App 为什么会有如此庞大的体积,于是就开玩笑地在社交媒体上说,我打算自己写一个地震信息 App。

但是我完全不懂 iOS 开发,没有学过 Objective-C,也没有学过 Swift。我只是学过一点点 Python,了解一些基本的开发概念。

然而,自从 ChatGPT 问世之后,AI 的能力让大家印象深刻。尤其是前段时间推出的 Claude 3.5 Sonnet 模型,得到了很多人的好评。

虽然 AI 没办法从零写出一个完整的 iOS App,但我认为它能帮我解决很多问题。于是,我真的开始了这个项目。

编码之前

开始行动,不意味着我就可以开始编写代码。我需要先解决一些基本问题:

  1. iOS 应用的技术选型,选择什么编程语言,用什么框架?
  2. iOS 应用的开发工具,我需要什么软件?
  3. 地震 App 的架构设计,数据从哪里来,如何储存,查询,展示?如何实现地震通知推送?
  4. App 的界面设计,我需要哪些页面,如何设计?
  5. App 的发布,如何提交到 App Store?
  6. 预计的时间成本,我需要多久才能完成?

当然,除了这些问题,我还需要解决很多其他问题。但是,这些关键问题是我真正开始开发之前必须要了解或想清楚的。

于是,我通过询问 AI + 查询资料的方式,大致得出了一些结论:

  1. 使用 Apple 推荐的 SwiftUI 来开发一款纯原生的 iOS App,不使用第三方框架,尽量减少依赖。
  2. 参考 Apple 提供的 人机界面指南,尽量使用原生控件,省去界面设计。
  3. 使用 Cloudflare 提供的各种无服务器产品来搭建后端架构,存储数据,提供后端接口,消息队列推送等。避免需要自己搭建和维护云服务器。
  4. 我可能需要数个周末来完成这个项目,同时我需要学习一些基本的 Swift 语法和 SwiftUI 的使用方法,以便我能很好地和 AI 合作。
  5. 我需要每年交 688 元来开通 Apple Developer 账号,以便我能提交 App 到 App Store。

One Month Later...

我的 App 终于完成了,我将它命名为 QuakeSense(震感)。这是一款简单的 iOS App,它可以帮助你查看全球的地震信息,包括多个数据源,同时支持地震通知推送。

地震感知

QuakeSense 的界面非常简洁,它包含 4 个页面:主界面,地震详情页面,数据洞察页面和设置页面。iOS 端的安装包体积也做到了 1 MB 以下,非常轻量。

主界面

主页面使用了类似 Apple Maps 的抽屉样式,呈现地震信息列表。你可以在这里看到最新的地震信息,包括地震的分级,位置,震级,时间等关键信息。

主界面
主界面

你可以通过切换选项进行排序,按时间最近或者距离你位置最近来查看。

同时,上方使用了 iOS 原生地图来展示地震的位置,以及列表中所有地震的分布。

除了直接展示里氏震级之外,更醒目的标题留给了地震分级。这里采用了中国地质科学院地质研究所的 地震分级标准,将地震分为:

  1. 弱震:震级小于 3 级。如果震源不是很浅,这种地震人们一般不易觉察。
  2. 有感地震:震级等于或大于 3 级、小于或等于 4.5 级。这种地震人们能够感觉到,但一般不会造成破坏。
  3. 中强震:震级大于 4.5 级、小于 6 级。属于可造成破坏的地震,但破坏轻重还与震源深度、震中距等多种因素有关。
  4. 强震:震级等于或大于 6 级。其中震级大于等于 8 级的又称为巨大地震。

相比于里氏地震的数字,这种分级更加直观,更容易让用户理解和第一时间了解地震的危险程度。

地震详情

你可以通过点击地图上的标记,列表中的地震条目来打开地震详情页面。

地震详情页面
地震详情页面

详情页面同样采用了抽屉样式,这里会展示更加详细的地震信息,包括地震的深度,震中经纬度坐标,震级,烈度,距离,测定机构等详细信息。

数据洞察

数据洞察页面展示了地震数据的统计信息,包括全球最近 24 小时和 7 天的地震数量,最大震级,平均震级等信息。

数据洞察页面
数据洞察页面

同时,这里还会展示距离你所在位置的震距分布图,震级分布图等。

你可以通过右上角的筛选项,来切换不同测定机构的数据,单独查看某个机构的数据洞察结果。

设置

我希望做一款普通人易用的 App,无论是主界面还是设置页面,我都尽量保持简洁,减少用户不必要的操作,关注真正值得关注的信息。

在设置页面,你可以选择默认的排序方式,默认的数据源,以及默认关注的最小震级。

设置页面
设置页面

目前,QuakeSense 支持美国地质调查局(USGS)、欧洲地中海地震中心(EMSC)、中国地震台网中心(CEIC)、日本气象厅(JMA)、台湾中央气象局(CWB)等多个数据源,你可以根据自己所在地区,选择合适的数据源。

理论上,你所在地区的测定机构往往可以更加及时和准确地提供地震信息,因为他们安装的测定站密度更大且距离更近。如果你所在地区有更准确的地震数据源,欢迎反馈给我,我会尽量支持添加。

同时,你可以在设置里面开启地震通知推送。当你所在位置,500 Km 以内发生有感地震,或者全球发生 7 级以上的大地震时,你会收到来自 QuakeSense 的推送通知。

推送通知基于服务端消息队列,确保你可以在不打开 App 的情况下,第一时间了解到地震信息。

地震预警

在测试期间,有用户问我为什么不做地震预警功能,因为很多 App 都有所谓「预警」的功能。我愿意分享一下我自己对地震预警和地震通知的理解。

首先,这里提到一个基本常识:地震是无法被有效预测的。 也就是说,没有人能够准确预测地震是否会发生,更不要说地震发生的时间、地点和震级。

目前最为可行的地震预警方案,是利用电波比地震波快的原理。即当地震发生后,因为震中距离用户有一定距离,地震波传播速度比电波(光速)慢,可以利用这个时间差,提前到通知用户。

所以,你可能在之前看过一些新闻,电视或者小区广播会进行倒计时播报,说「地震波预计 XX 秒后到达」。

那么,QuakeSense 为什么没有地震预警功能呢?

先说结论:我无法做到足够低的延迟,提供有效的、能够真正起到预警作用的地震预警通知。

准确有效的地震预警,需要各环节的延迟都足够低,才能在地震波到达用户之前,提供有效的预警通知。但是很多环节都存在延迟:

  1. 地震测定基站不太可能刚好位于震源上方,所以收到地震波信号,存在延迟;
  2. 测定基站收到信号后,需要计算震源位置,传输到数据中心,存在延迟;
  3. 测定数据源发布数据,存在延迟;
  4. App 获取数据,根据用户位置信息,计算与震源的距离,存在延迟;
  5. 不同地区的地质构造,导致地震波在地层中的传播速度不同,需要独立计算,存在延迟;
  6. 处理消息队列,通过 APNs 推送服务向大规模用户推送消息,存在延迟。

所有这些延迟加起来,可能已经远超地震波传播的时间,导致有效的地震预警几乎不可能在 app 端实现。而电视或者专门的预警广播,由于其专用的传输网络,可以更快地传递信息。

小震不用跑,大震跑不了。这是四川人民经常调侃的一句话,但也是地震预警面对的现实。

所以,QuakeSense 不能帮助你提前预知地震,或者逃离地震。但它可以帮助你了解地震信息,及时获取最新的地震通知,关心你的家人和朋友,保持警惕,做好应对准备。

隐私保护

我为 QuakeSense 上线了一个 网站,包含常见问题和 隐私政策。我个人非常重视隐私保护,虽然现实往往非常残酷,但我仍然希望自己的应用能够尽可能保护用户的隐私。

QuakeSense 官网
QuakeSense 官网

QuakeSense 只会收集你的两项信息:你的大致位置信息和设备 ID。

  1. 大致地理位置,上报坐标只会到所在城市区域,用于计算你和震中的距离,以便于推送地震通知和实现 App 中的距离功能;
  2. 匿名设备 ID,用于 Apple 推送服务,以便于向你的设备推送地震通知。

这些数据被加密存放在 Cloudflare 的 D1 数据库中,当用户关闭通知功能或者删除 App 导致通知不可达时,这些数据会被自动触发删除。

macOS 和 iPadOS

得益于 SwiftUI 的跨平台特性,QuakeSense 也可以在 macOS 和 iPadOS 上运行。我为大屏设备重新设计了界面布局,使得用户在大屏设备上也能够更好地使用 QuakeSense。

适配大屏幕设备
适配大屏幕设备

目前,QuakeSense 以及适配了中文简体、中文繁体、英文和日文,为不同数据源的主要用户提供了更好的体验。

定价和结语

QuakeSense 是我开发的第一款 iOS App,是否收费的确思考了很久。最终,我决定将它设置为一次性收费应用,不包含任何内购和订阅。

QuakeSense 的中国区定价为免费下载 + 2.99 美元/年 Pro。

Pro 版本拥有消息通知、更完整的历史数据和数据洞察功能。

以下是我设为付费应用的原因:

  1. 我付出了时间,特别是牺牲了陪伴我的家人和朋友周末时间,长期维护和更新 App 需要付出更多的时间和精力;
  2. QuakeSense 需要支付一定的服务器费用,以及 Apple Developer 账号费用;
  3. 免费会带来更多用户,但是消息队列服务的延迟会增加,排在队列后面的用户可能会更晚收到地震通知;

QuakeSense 诞生于一念之间,我没有想到我会写一款 iOS App,也没有想到我会在少数派上分享这篇文章。我只是想做一款自己用得上的 App,也许你也会用得上。

你可以前往 App Store 免费下载 QuakeSense,或者访问 QuakeSense 网页 了解更多信息。