在一般的使用者眼里,在线服务与本地工具的界线已经越来越模糊。

过去我们很容易区别它们。在线服务,一般都有网页,客户端看起来像网页,设计得比较扁平1 。使用它们的时候需要连网,打开后往往还需要加载一下。收费制度也一般是订阅制的,每个月都要掏些钱,不是一次性买断。而本地工具,看起来总是很拟物,不联网也能正常使用,交一次钱用一辈子2 

然而现在,视觉上,大量在线服务的本地应用做得无比精致,模糊了视觉上的区别。很多人可能从来没觉得(关心过) Instagram、Netflix、Spotify、Evernote……这些在手机上看起来如此丰富、有表现力的应用本质上都是(基于)在线服务。

对网络的需求方面,我们已经进入多设备时代,多设备之间的数据同步变得愈发重要,越来越多类型的本地工具因此需要网络连接。即便是本地工具我们也要「刷新/同步」一下才能获取最新的数据,而这也模糊了「在线」与否这个区别。

付费方式方面,订阅制也不再是在线服务的特权,在 TextExpander 打响知名工具转为订阅制的第一枪后,本地工具,特别是独立开发者、小公司都在跃跃欲试,只是都在构思不同的付费规则,以便从前的消费者更容易接受。Bear、Moneywiz 、Drafts 等典型的本地工具都纷纷上船,Ulysses 在观望后也走出了这一步,如今连坚守底线3 的 OmniFocus 也变相地走上了订阅制4 

尽管从设计、对网络的需求以及收费方式这些「表面」差异,我们已经很难区分在线服务和本地工具了。但两者仍然有本质上的不同。只有搞明白了这些不同点,才能真正地理解这些工具,在解决需求时做出妥善的选择。

区别一:跳转与否

如果你了解和尝试过 iOS 自动化,特别是 URL Schemes,那么你可能对「跳转」这个现象有特别深刻的印象。

从 Launch Center Pro 跳转到支付宝的扫码界面

如果你还没有接触过 URL Schemes,可以先试试复制下面这段字符:

alipayqr://platformapi/startapp?saId=10000007

把它粘贴到 Safari 的地址栏,选择「粘贴并前往」,就可以看到像上方视频一样的跳转。而这个「跳转」,就是 iOS 上本地工具的独有特征,也是我们窥探在线服务与本地工具区别的第一道裂隙。

我们来顺着这道裂隙,再把视野挖宽一些。

用跳转与否来划分界限

在捷径里搜索「OmniFocus」和「Todoist」这两款任务管理应用,就能看到捷径中内置了直接添加任务到这两个工具的操作:

  • 添加 OmniFocus 项目
  • 添加 Todoist 项目

我们尝试着分别利用这两个操作来做两个捷径,批量地把任务添加到这两个工具中。

批量添加任务到 OmniFocus 的捷径如下:

批量添加任务到 OmniFocus 的捷径

批量添加任务到 Todoist 的捷径如下:

批量添加任务到 Todoist 的捷径

制作完成后,我们来分别运行这两个捷径,再查看结果:

运行批量添加任务到 OmniFocus 的捷径:

运行批量添加任务到 OmniFocus 的捷径

运行运行批量添加任务到 Todoist 的捷径:

运行运行批量添加任务到 Todoist 的捷径

看完视频后我们就会发现,在用捷径批量添加任务到 OmniFocus 时,每次都需要跳转,而 Todoist 做同样的事却不需要。这就是因为 Todoist 本质上是一个在线服务,哪怕我们设备上没有 Todoist 的应用,捷径照样会把任务发送到 Todoist。

简单总结一下,传统情况下,在自动化方面,iOS 上的本地应用和在线服务,有以下区别:

  • 本地工具
    • 要本地有应用
    • 要跳转
  • 在线服务
    • 不需要本地有应用
    • 不用跳转

这就是比较典型的本地工具与在线服务在跳转与否上的区别。这个特性在 iOS 上尤为明显,因为 iOS 对不同应用之间的数据传输是主流的这些操作系统中最严格的,所以哪怕是传输几个字符,也要经过跳转。

在 Mac 上的 DEVONthink 和 OmniFocus 为什么没关系。

虽然本地但无需跳转的新形式

大概苹果也知道总是要跳转是很恼人的,所以 iOS 在自动化跳转这个方面,也在慢慢进化。苹果不会在安全方面退让,所以只有想个办法,在保证第三方应用仍然不能随便获取到其它应用里的内容的前提下,可以局部地,不必打开应用地添加或者展示一些信息出来。这个办法就是 SiriKit:

苹果官网对 SiriKit 的简介

引用苹果的原文:「App 通过创建能与 Siri 通信的扩展来使用 SiriKit,使用时 app 无需处于运行中。」这也说明 SiriKit 不是让应用与应用沟通——苹果无法保证所有第三方应用的操守——而是改让大家和自己(SIri)沟通,你们(第三方应用)把东西给 Siri,用户们通过 Siri 就可以添加或者调用一些来自第三方应用的数据,这样就不用再忍受跳转。

SiriKit 现在已经支持了收发信息、创建提醒事项、约车、通话等领域。而且在 iOS 12 后的捷径中,我们可以自主地组织一些应用的部分功能,使其按照我们的需求,展示给我们需要的东西:

示例捷径

这是我使用捷径中内置的 Fantastical 和 Todoist 的 Siri 建议操作制作的一个简单示例。我们可以通过 Siri 口令来运行这个捷径,这样就可以做到既看到 Fantastical 里的日程,也能看到 Todoist 中的任务,掌握一天的事务安排。

这种方式的出现意味着,如今在 iOS 上,除了必须跳转的本地工具方式和无需跳转的在线服务方式以外,还有另一种处于状态形式——Siri 建议,它的特点是:

  • 不用跳转
    • 但需要本地应用

可以看出它本质上仍然是本地的,不过在跳转这个方面的体验好过纯粹的 URL Schemes 手段。然而这种手段的优点也仅限于此。借用 Siri 可以做的事几乎不能称得上是自动化,它能够完成的事都过于基础与简单:步骤少到不值一提,自定义程度几乎没有,对应用依赖性极强……它和捷径的结合目前也有不能传入数据、不能朗读其中内容等诸多毛病。

换句话说,它只是在跳转与否这一点上看似模糊了在线服务与本地工具的区别,但由于目前限制还是太大,不能承受比较复杂的需求,所以目前还很难划到自动化的范围里来考量。

共享表单:另一种避免跳转的手段

在 iOS 上,其实还有另一种晚于 URL Schemes 出现的,形似解决跳转问题的方法——共享表单:

共享表单

通过共享表单分享内容是不需要跳转的,不管是把一个网页添加到任务管理应用,还是把一句话放到 Evernote。

但是在这里,如果你仔细观察的话,仍然能发现本地工具和在线服务的区别。这个区别的重点,在于「同步」。

对于本地工具来说,通过分享表单,「放」的时候的确是不需要跳转,但它想要「同步」的时候,就必须需要跳转。比如说我们看到一个不错的采访视频,没时间或者网速跟不上,想回家看,会很顺手地通过共享表单,把这个视频分享到任务管理应用(比如说 Todoist)。这一步,我们没有做跳转。

但是,如果你分享这个视频之前没打开 Todoist,到家之后还没打开 Todoist 就直接开电脑,打开电脑上的 Todoist 去查看这个任务,你会发现,电脑上的 Todoist 里没有这个任务。这时候你再打开手机,发现「哎?我手机里有这个任务啊?」然后再扭头看一眼电脑,发现电脑上的 Todoist 也有了。而这是因为,在你打开手机上的 Todoist 后触发了同步,电脑随着同步更新了任务列表。

而在线服务没有这个问题。比如说 Pocket,当我们用 Safari 看到一篇好文章,想保存到 Pocket 时,我们只要通过共享表单把它发送到 Pocket 即可。哪怕之前之后都不运行 Pocket,我们在其它设备上打开它也同样会有这篇文章。

这就是在线服务和本地工具在使用分享表单时的区别,虽然本地工具通过分享表单「放」东西都时候不需要跳转,但它仍然脱离不了必须打开应用才能「工作」(在这里是同步)的命运。然而在线服务不同,在线服务通过共享表单储存的数据,不需要打开应用,同样能够实现同步。

它们的区别简单总结下来就是:

  • 本地工具的共享表单
    • 要本地有应用
    • 要打开应用才能同步
  • 在线服务的共享表单
    • 要本地有应用
    • 不用打开应用也能同步

但是细心的话你肯定会意识到哪里不对。刚才 Todoist 和 OmniFocus 对比时明明是在线服务的代表,怎么现在又改成本地工具的典型了?

这就牵出了下一个话题:在线服务的本地应用。

在线服务也可以有本地应用

虽然我们是在对比在线服务和本地工具的区别,但是它俩并不是对立的关系。大量的在线服务都有它们的本地应用(客户端),Evernote、Todoist、Spotify、Instagram、Netflix……包括前面提到的 Pocket,都是典型的例子。

本地应用可以让它们更灵活地面对在线与离线的情况。当没有网络的时候,这些在线服务可以让我们访问它们的本地应用,去添加内容、查看内容、删除内容,等网络恢复之后再把数据发送出去,完成同步。

当一个在线服务在 iOS 上有了本地应用,那么它处理数据的方式就有了多种选择:它可以是在线的也可以是本地的,也可以是部分本地的。比如 Todoist,它既可以通过 API 传输数据,也可以通过 URL Schemes 传输数据。而 Todoist 应用的共享表单,它其实做成了本地的方式,不打开应用就不会添加数据到本地应用里。这也许是因为 Todoist 希望用户即便在没有网络的时候,也能够把任务通过共享表单把任务存到 Todoist 里。

而 Pocket 在共享表单这里采取了在线服务的方式,这也许是因为当我们把一个文章存到 Pocket 里,它的本质是——我们上传了一个链接到 Pocket 的服务器中。随后服务器对这个链接进行了处理,将它排版、去广告。而我们在本地的 Pocket 想要查看这篇文章,其实还是要下载一次这篇文章。所以从一开始,Pocket 就需要联网才能使它在共享表单里的功能有意义,否则体验就会很差。

跳转部分的小结

到此为止,我们已经基本探讨了 iOS 上在线服务和本地工具在跳转与否这个角度上的各种情况。简单来说我们可以做出以下总结:

  1. 本地工具的自动化需要本地应用
  2. 本地工具的自动化需要跳转
  3. 本地工具借助 SiriKit 虽不需要跳转单能力有限
  4. 本地工具借助共享表单存数据时不用跳转,同步数据时需要
  5. 在线服务的自动化不需要本地应用
  6. 在线服务的自动化不需要跳转
  7. 在线服务在共享表单的应用上要分具体情况对待,它可以选择是否使用本地的方式

在 iOS 上,从是否需要跳转这个角度来看,在线服务在自动化方面确实很有优势。

区别二:能否在线自动化

从跳转与否能够引申出来的另一个在线服务和本地工具之间的区别,是在线自动化。

只有在线服务才能够轻松地实现在线自动化,要么可以把服务和服务直接对接,比如把 Todoist 接入 Slack;要么可以把各种服务都接入 IFTTT、Zapier 这样的在线自动化平台。

因此像是 IFTTT 支持 OmniFocus,做到 Trello 与 OmniFocus 之间的双向同步——当自己在 Trello 的特定列表加一个任务,就会在 OmniFocus 的特定项目里添加同样的任务,反之亦然——是很难的。但如果把 OmniFocus 换成 Todoist 事情就会简单许多。它和 Trello 都是在线服务,并且都开放了 API,都允许 IFTTT 接入,随后就可以通过 IFTTT 来同步。

区别三:同步与访问数据的方式

区分一个工具是本地的还是在线服务,还可以通过它的同步方式来判断。有一个特别典型的特征是:在线服务的同步不产生一个单独的备份文件。这是什么意思?我们可以从一些完全不能自主同步内容,需要通过 Dropbox 这样的服务来同步内容的工具来理解。

Taskpaper 是个纯文本式的任务管理工具,它本身没有同步功能。如果你想在多个设备同步 Taskpaper,那么就需要借助 Dropbox 这样的网盘。具体做法是:

  1. 在 A Mac 保存 Taskpaper 文件(比如说是 购物清单.taskpaper)到 Dropbox
  2. 在 B Mac 打开这个 购物清单.taskpaper Taskpaper 文件

本质上,这个更像是 U 盘的工作方式。我们把在 A Mac 上写好的 购物清单.taskpaper 存在 U 盘里,再把这个 U 盘插在 B Mac 上。

这个同步方式的弊端很明显——当备份文件变大,同步必然变慢。

OmniFocus 的同步方式也是类似的,所以「OmniFocus sync is getting slow. Why is it taking so long?(OmniFocus 同步变得慢了,为什么要花这么久?」是它的常被问到的问题之一。抛去服务器位置和网速问题,同步慢的原因就是我们本地的备份文件过大。这就像你拷贝一个很大的文件到 U 盘,再从另一个机器下载下来一样,当然要花更长的时间。

本地工具也有比较取巧的方式,比如 1Password,它并不是同步一个文件,而是把一整个文件夹伪装成了后缀名为 .agilekeychain 的文件。我们可以右键点击它选择「显示包内容(Show Package Contents)」,这时候就能获取到它内部的单项数据(虽然我们其实看不懂):

显示包内容

1Password 的同步方式聪明在它可以只同步发生变化的文件,而不是同步整个文件,做「增量更新」,因此它的同步速度一般都很快。

而在线服务的同步方式从根本上就不是这样的,它不是每次都去同步一个积累起来会变得很大的数据库(Database)文件,因此我们一般不会觉得同步它的数据时会很慢。它的主要数据库在云端(或者说在厂商的服务器那里),我们每次访问时只获取其中我们需要的数据。拿 Todoist 来说,所有我们之前完成过的任务,都不会被直接下载到本地,除非你专门去找(访问)这些任务,而这个过程将需要联网。

但是使用过 Evernote 的人可能会意识到事情并不是这么单纯。Evernote 的 Mac 版本在离线之后,都是可以访问到所有数据的,路径是 ~/Library/Application Support/com.evernote.Evernote/。而且我们也可以像 1Password 能够获取到每一条密码文件那样,获取到每一条 Evernote 的笔记文件。这是因为 Evernote 虽然是在线服务,但是它在本地端有一套全功能全数据的客户端,它把同步和数据访问给分离了。

本地工具和在线服务在同步方面的差异,总结下来就是:

  1. 本地工具一般是靠同步一个特殊格式的文件
  2. 本地工具也能实现增量更新
  3. 在线服务的数据一般在厂商的数据库那里,我们需要什么访问什么
  4. 但同样也有像 Evernote 这样全功能本地客户端的例外

区别四:有无多平台的状态同步

多平台的状态同步是在线服务和本地工具的另一个显著区别。

用过社交工具(社交工具一般都是在线服务)的我们都知道,它们都可以在多个平台同步消息的状态,比如消息记录、未读数量。有的工具甚至可以同步阅读位置以及对方的输入状态。

Amazon 可以让多个设备上的 Kindle 同步同一本书的阅读位置。

Spotify 是把这个特性发挥到极致的服务之一。有一天我在家用 Google Home 放着 Spotify 的音乐,要出门时我拿出手机打开 Sptofiy,插上耳机准备按播放键的时候,发现音乐自动通过耳机,从刚才 Google Home 里播放的位置传到了我耳朵里。我拿下耳机后发现 Google Home 已经停止播放了音乐。Spotify 通过插耳机的这个动作「识别」出了我接下来想用耳机听,并且直接把音乐从 Google Home 停下的位置开始续播。

多人协作是也是服务在这个点上的另一个体现。我们几乎没有接触到什么能够多人协作的本地工具。Quip、Google Docs、Numbers 等等,这些多人协作工具几乎无一例外都是服务。

虽然看起来本地工具没有什么实现这种状态同步的例子,但也不代表本地工具实际上无法实现。Books(苹果的图书应用) 就是一个例子,它虽然是本地工具,但是通过一个同步服务 iCloud,它也可以实现阅读位置的同步。

但是从成本上来说,在线服务实现状态同步要方便很多,也要相对更稳定。这大概就是为什么我们会很常见在线服务的状态同步,而比较少见本地工具也实现这种特性。

核心区别:中心服务器的完整程度

在构思这篇文章的时候,我本来是想为本地工具和在线服务划一道线的。但是在和前端程序员 @c4605 多次沟通之后,我们发现很难用一条线或一些区别去划分两者。前文提到的诸多区别和特点,也都多是概率上和倾向性上的问题。甚至本地工具也可以使用 API。但是当我们提到一些工具时,我们又可以直觉地去给出一个说法,去判断它是在线服务或是本地工具。

在和 @c4605 交流时,我问道:Pages 算不算服务?

他下意识地答道:不算。

我提醒说:它现在已经有了功能很全的 Web 端和同步协作了。

他又改口说:我要再看一下。

我又问:那 Office 365 算不算服务?

他很快地回答:也要看。

最后我又问:Google Docs 算不算服务?

这次的回复同样迅速:算。

这个对话说明,即便我们都承认本地服务和在线工具的线越来越难划,但它终究有区别,这个区别甚至大到我们会直觉地秒下判断,宣判一个我们印象里的东西是在线服务还是本地工具。

最后我们达成了一个妥协的答案。当一个本地工具完全不支持同步,也就是说它真的是完全本地的时候,我们可以说它百分百是个本地工具。但是一旦它支持了同步,它的本地性就不再那么纯粹。而在线服务和本地工具的差异最终是一个程度的差异。什么程度的差异?

中心服务器功能的完整程度。这是我们两个商讨下来的说法。

中心服务器就是指厂商用来储存数据的数据中心,各个客户端都要上传数据到这里,同时由它再下传数据到各个客户端。

中心服务器的功能越完整,比如它能够增量更新、能够通过 API 添加/访问/获取数据、能够同步文件状态、能够多人协作……它就越有服务的属性。如果一个工具,它的中心服务器的功能是最完整的,而客户端只是同样完整或者拥有中心服务器的部分功能,那我们就可以说它是个在线服务,哪怕它没有公开它的 API。大多数国内的服务其实都没有公布它们的 API。

而如果一个工具,它本地功能是最完善的,只是在逐步地向服务端迁移——比如 1Password、TextExpander、OmniFocus 这些——那要看它们迁移的程度。以这三者目前的状态,我更倾向于把它们理解为本地工具,只是有了一定的服务属性。大概到了它们能够支持 API 访问数据,比如 OmniFocus 能像 Todoist 那样不需要跳转就能批量加任务到时候,就能叫它们服务了。

为本地工具说两句话

这全篇文章,似乎都是在彰显在线服务的优越地位。那么在最后,就稍微本地工具说两句话。

第一句是「其它平台上的本地自动化手段也十分高效」。除了在 iOS 这样,对第三方应用之间传输数据限制得这么死的平台之外,在其它的平台上,本地工具都有着非常有效的自动化手段。比如 macOS 支持 AppleScript 等各类脚本语言、Keyboard Maestro 等各类自动化工具,它们其实可以完成复杂度和自定义程度都远高于在线服务能做到的自动化。只是因为这些手段的学习成本和制作成本都不低(都比捷径还高),以至于受众比较少。

第二句是「在线工具往往长得不行」。本地工具其实奠定了我们对软件应该长什么样的认识,很多工具的创作团队不惜花很大的精力去打磨每个细节。「大气」、「优雅」、「讨喜」等等这些形容词如果出现在软件测评里,一般主角都是本地应用,比如 Ulysses、Things、Bear 这样的应用。随便拿出你的一台设备,找出设计感占前 10 名,10 个里面可能没有 1 个是在线服务的客户端。

结语

以上就是我从一个使用者角度观察到的,不完全的,在线服务和本地工具的区别。

很遗憾的是没有一条清晰的线来划分什么是在线工具,什么是本地服务。当本地工具支持了同步,它就算是开启了在线服务的属性,只是程度大小的问题。而在线服务完全也可以开发出具备所有本地工具特性的客户端,典型的例子就是 Evernote,一旦初次同步完成,我们就可以完全离线的访问它的所有数据,使用它全部功能。

我们最终判断程度大小的关键要素在于这个工具/服务的中心服务器功能的完整程度,当它超过了某一个限度,那么它在一些人心中就能够完成身份转换。而根据中心服务器的功能以及平台的限制,我从使用者角度观察到的,比较典型的能够区分两者的特征有:

  1. 自动化是否需要跳转、是否需要本地应用。
  2. 能否实现线上自动化。
  3. 同步与访问数据的方式。
  4. 有无多平台的状态同步。

希望这些特征能在你选择工具时起到作用。

注:这并不是讨论 Native App 与 Web App 的文章。

  • 1因为在线服务的载体往往是网页,而网页一般不会使用过大的设计元素,这会影响加载速度。
  • 2「一辈子」的说法略有夸张,但也属实。对于某一个版本的本地工具属性的软件,如果我们不升级电脑、也不升级软件,那么我们理论上可以一直使用它。
  • 3OmniGroup 的 CEO 曾在 Twitter 上表示:…we want customers to be able to use our software as long as it runs on their devices, not as long as they pay us.
  • 4只是目前还提供买断版本,较为温和。