Protocol Launcher 系列:Tally 快速计数器的深度集成

在介绍了 WaterMinder 的联动后,今天我们将介绍如何通过 Protocol LauncherTally 联动,让计数、记分和习惯追踪变得更加自动化。

作为开发者或效率工具爱好者,你可能经常遇到这些场景:

  • 在效率看板中提供一个"增加计数"的按钮,快速记录某个习惯的完成情况。
  • 在游戏记分场景中,通过网页按钮直接更新 Tally 中的分数。
  • 在自动化工具中集成 Tally,实现定时重置或获取计数值。

现在,通过 Protocol Launcher,你可以以类型安全的方式生成 Tally 深度链接,实现计数器的自动化管理。


Tally 与深度链接

Tally 是一款适用于 iPhone、iPad 和 Apple Watch 的快速计数、记分和习惯追踪应用。它提供了强大的深度链接支持,允许从网页或第三方应用直接触发增加、减少、重置和获取计数值等操作。

然而,手动拼接这些链接需要处理参数编码和计数集(Tally Set)的关联逻辑,且缺乏类型提示,极易出错。


核心能力:自动化计数与精准控制

Protocol Launcher 为 Tally 专门提供了 protocol-launcher/tally 模块,支持以下核心功能:

  1. 打开 Tally 应用:快速唤起 Tally 应用。
  2. 增加计数:为指定计数器增加值。
  3. 减少计数:为指定计数器减少值。
  4. 重置计数:将计数器重置为初始值。
  5. 获取计数值:获取当前计数值并通过回调 URL 返回。

快速上手

首先,确保你的项目中已安装:

bash 复制代码
npm install protocol-launcher

在代码中你可以根据场景选择两种导入方式:

  • 按需加载(通过子路径导入),支持 Tree Shaking,体积更小;
  • 全量导入(从根包导入),写法更简单,但会引入所有应用模块。
typescript 复制代码
// ✅ 推荐:按需加载 Tally 模块
import { open, increment, decrement, reset, get } from 'protocol-launcher/tally'

// 也可以从根包导入,但会包含所有应用模块
// import { tally } from 'protocol-launcher'

场景一:打开 Tally 应用 (open)

最简单的用法,直接唤起 Tally 应用:

typescript 复制代码
import { open } from 'protocol-launcher/tally'

const url = open()

场景二:增加计数 (increment)

这是最常用的功能。你可以为指定的计数集(Tally Set)和计数器(Tally)增加值:

typescript 复制代码
import { increment } from 'protocol-launcher/tally'

const url = increment({
  tallySet: 'Game Score', // 计数集名称
  tally: 'Player 1',      // 计数器名称
})

你也可以使用 UUID 来精确指定:

typescript 复制代码
const url = increment({
  tallySetID: 'abc-123',
  tallyID: 'xyz-789',
})

场景三:减少计数 (decrement)

与增加计数类似,减少计数用于减少指定计数器的值:

typescript 复制代码
import { decrement } from 'protocol-launcher/tally'

const url = decrement({
  tallySet: 'Game Score',
  tally: 'Player 1',
})

场景四:重置计数 (reset)

将指定计数器重置为初始值,适用于日常习惯追踪的场景:

typescript 复制代码
import { reset } from 'protocol-launcher/tally'

const url = reset({
  tallySet: 'Daily Habits',
  tally: 'Exercise',
})

场景五:获取计数值 (get)

获取指定计数器的当前值,需要提供回调 URL 来接收返回值:

typescript 复制代码
import { get } from 'protocol-launcher/tally'

const url = get({
  tallySet: 'Daily Habits',
  tally: 'Exercise',
  'x-success': 'myapp://callback', // 回调 URL
})

你还可以自定义返回值参数名:

typescript 复制代码
const url = get({
  tallySetID: 'abc-123',
  tallyID: 'xyz-789',
  'x-success': 'myapp://callback',
  retParam: 'count', // 自定义参数名
})

为什么选择 Protocol Launcher?

  1. 自动编码与参数处理 :Tally 的协议对参数编码有严格要求。库内部会自动处理所有的转义逻辑,确保生成的 URL 在唤起应用时绝不乱码
  2. 类型安全与参数提示:TypeScript 的智能补全会确保你提供了正确的参数,并提醒你可选的计数集和计数器名称。
  3. 一致的用户体验:通过封装复杂的协议逻辑,你可以专注于业务功能的实现,而不用担心不同操作系统下协议触发的细微差异。
  4. 极致的按需加载 (Tree Shaking) :采用了模块化设计,支持按需加载以最小化包体积:
    • 推荐方式 :使用子路径导入(如 import { increment } from 'protocol-launcher/tally'),这样构建工具只会打包相关的代码。
    • 全量方式 :也可以从根包导入(如 import { tally } from 'protocol-launcher'),建议生产环境始终使用按需加载。
  5. 灵活的标识方式 :支持通过名称(tallySet / tally)或 UUID(tallySetID / tallyID)来指定计数器,适应不同场景需求。

结语

通过 Protocol Launcher,你可以将 Tally 的计数功能无缝集成到你的效率工具、游戏记分系统或自动化工作流中。无论是在个人习惯追踪场景中,还是在团队协作的记分板中,它都是连接 Web 与本地 Tally 应用最优雅的桥梁。


🔗 相关链接

相关推荐
东风破_39 分钟前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
东风破_1 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
怕浪猫1 小时前
FDE 最大的浪费不是写出有 bug 的代码,而是漂亮地解决了一个错误的问题
面试·架构·github
东风破_2 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
蒲公英eric2 小时前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
单线程_012 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
小磊哥er3 小时前
深入解构Claude Code - 第 10 篇 · 高级能力
typescript·ai编程
顶点多余3 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
Setsuna_F_Seiei3 小时前
前端转型 Agent 开发 03 之 Agent Tools - 给 Agent 装上手脚
前端·agent·ai编程
jay神3 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计