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 应用最优雅的桥梁。


🔗 相关链接

相关推荐
云水一下6 小时前
TypeScript 从零基础到精通(五):高级类型与泛型
前端·javascript·typescript
counterxing6 小时前
vibe coding 之后,我更不想打字了
前端·agent·ai编程
云水一下6 小时前
TypeScript 从零基础到精通(六):类型声明与模块化
javascript·typescript
copyer_xyf6 小时前
Python 模块与包的导入导出
前端·后端·python
研☆香6 小时前
es6新特性功能介绍(四)
前端·ecmascript·es6
微扬嘴角7 小时前
React篇1--JSX语法规则、组件、组件实例的3大特性
前端·react.js·前端框架
copyer_xyf7 小时前
Python venv 虚拟环境
前端·后端·python
无聊的老谢7 小时前
Vue 3 + TypeScript 构建大型电信运维平台的前端架构设计
前端·vue.js·typescript
xiaofeichaichai7 小时前
Map / Set / WeakMap / WeakSet
前端·javascript
李可以量化7 小时前
成交量的终极量化策略:价量共振指标完整实现(下篇)
前端·数据库·人工智能