做了一款「飞行护照」式专注 App,砍掉 80% 游戏化功能后体验反而对了

3 阅读5分钟

起因

去年年底我给自己定了个目标:做一个自己真的会用的专注工具。

说实话市面上番茄钟太多了,我手机里装过 Forest、潮汐、专注清单,没有一个用超过两周。Forest 种树种了三天就腻了——树长完我也没什么感觉,就是个绿色图标多了一棵。潮汐的白噪音不错,但计时结束后啥也没留下,就弹个通知告诉你"恭喜完成"。

问题出在「计时结束后什么都没留下」。我想做的东西是:让每次专注结束后,你能拿到一个看得见、能分享、有积累感的成果物。

核心想法:专注数据变成旅行叙事

最后我选了「护照 + 飞行里程」这个隐喻。每次专注是一段航程,累积时长换算成里程,里程升级解锁等级称号。

为什么用旅行而不是游戏打怪?因为旅行是线性的、没有失败的。你飞了 30 分钟就是 30 分钟的里程,不存在「没打过 Boss」的挫败感。这对专注工具来说挺重要——用户中断了一次不该被惩罚。

App 叫「声境护照」,iOS 上架大概两个月了。

技术上做了什么

几个我觉得值得聊的点:

声景混音

App 内置了多套环境音(城市雨夜、咖啡馆、图书馆那类),用户开始专注时选一个声景作为「目的地」。这块我用 AVAudioEngine 做的多轨混音,支持层间交叉淡入淡出:

// 声景交叉淡入淡出 — 实际用 GCD 定时器异步调度,避免阻塞音频线程
func crossfade(from fromIndex: Int, to toIndex: Int, duration: TimeInterval) {
    let steps = Int(duration * 60)
    let interval = duration / Double(steps)
    for step in 0..<steps {
        DispatchQueue.main.asyncAfter(deadline: .now() + interval * Double(step)) {
            let progress = Float(step) / Float(steps)
            self.playerNodes[fromIndex].volume = 1.0 - progress
            self.playerNodes[toIndex].volume = progress
        }
    }
}

实际还有根据专注时段自动调整声音层的逻辑——比如"东京雨夜"在后半段会把雷声音量压下来,避免分心。但核心思路就是多轨播放加异步定时器控制音量曲线。

战报卡片渲染

每次专注结束生成一张数据卡片,要能直接分享到朋友圈。我没用 WebView 截图方案(太慢),直接 Core Graphics 手动绘制:

func renderSessionCard(session: FocusSession) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: CGSize(width: 1080, height: 1920))
    return renderer.image { context in
        let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(),
                                   colors: [session.theme.startColor.cgColor,
                                            session.theme.endColor.cgColor] as CFArray,
                                   locations: [0, 1])!
        context.cgContext.drawLinearGradient(gradient, start: .zero,
                                             end: CGPoint(x: 0, y: 1920), options: [])
        drawMileageRing(in: context, miles: session.earnedMiles)
        drawLevelBadge(at: CGPoint(x: 540, y: 400), level: session.currentLevel)
    }
}

手动排版确实麻烦,但渲染速度快,专注结束后卡片基本秒出。卡片上我重点突出声景名称和一句旅行风格文案(比如"刚从东京雨夜降落,飞行 45 分钟"),让没用过 App 的人看了也能 get 到。

成长数值设计

这块纠结了很久。规则是 1 分钟专注 = 1 海里,等级用指数曲线:前 5 级各需要 100、250、500、1000、2000 海里。

试过线性增长,发现用户第三天就觉得"升级太慢没意思"。指数曲线前期节奏快,等习惯养成后升级变慢也不影响,因为这时候靠惯性在用了。

砍功能的过程

这个可能是我做这个项目最大的教训。

一开始我设计了:成就系统(30+ 个徽章)、每日任务、连续打卡奖励、好友排行榜、自定义声景上传……全塞进去以后 App 变得很重,自己用都觉得「打开好累」。

后来一个一个砍:

  • 排行榜删了。用户会为了刷时长假装专注——手机开着计时人去干别的。跟工具本身的目的矛盾。
  • 每日任务删了。任务没完成会产生负罪感,一个专注工具不该给人压力。
  • 成就系统从 30 个砍到 8 个。只保留里程碑式的(累计 10 小时、连续 7 天这种),去掉所有需要刻意去完成的。
  • UGC 声景删了。白噪音录制质量差一点就扎耳朵,循环接缝也需要专业编辑,质量没法控。

砍完只留里程 + 等级 + 战报三样核心。说实话删的时候挺心疼的,毕竟每个功能都写了代码。但留下来的体验确实清爽很多。

数据和问题

老实说,数据不好看。上架两个月总下载不到 400,付费转化接近零。

我想了一下几个原因:

  1. ASO 完全没做好。"声境护照"这个名字搜索量为零,用户搜"专注""番茄钟"的时候找不到我。最近把副标题改成带"专注计时"了,还在观察效果。
  2. 品类认知模糊。截图里又有声波又有护照又有数据图表,用户分不清这是白噪音 App、番茄钟还是游戏。
  3. 冷启动没钱投放。一个人开发,推广预算为零,纯靠自然流量基本就是靠天吃饭。

这几个问题目前还没好的解法。

几个可能通用的经验

游戏化不要贪心,功能多≠体验好。砍到只剩核心循环(专注→获得里程→升级→分享战报→下次专注),反而让用户知道"我打开这个 App 该干嘛"。

分享卡片的优先级应该从第一天就拉到最高。工具 App 自然传播几乎只有一条路:用户生成内容 → 分享到社交平台 → 别人好奇下载。没有分享入口的工具 App 基本只能靠 ASO 和付费投放活着。

对了,卡片设计要考虑「被分享者的感受」。如果上面全是数字,没用过的人看了一头雾水。加一句人话描述("在雨声里写完了一篇报告")比纯数据有效得多。


目前 1.4 版本刚加了周统计报告和智能推荐下次专注时间。还在摸索怎么把冷启动跑起来。

想问问各位做工具 App 的,增长冷启动是怎么破的?纯靠内容营销?还是有什么低成本的渠道值得试?