老谭笔记

Widget在Dashboard之外的延续

Widget是OSX操作系统中比较古老的一个元素,虽然在目前最新版本的OSX仍然得以保留,但不难发现Apple已经渐渐将它遗忘在一个角落,似乎给它判死刑只是一个迟早的问题。即便如此,在Dashboard中提供的那几个Widget仍然给我们使用Mac提供了很多便利。

正是在这样的背景下,作为Widget的铁杆粉丝便萌发了一个想法:将Widget从Dashboard之中解放出来,让它更像是Native APP。其实通过打开Dashboard的开发模式也能让Widget显示在普通的桌面上,但这样的体验与Native App还是有太大的差别,这不是我所希望的。

最先经过简单分析,发现widget都是打包成wdget格式的bundle,而主要的展示和处理任务都是由HTML+JS完成的,所以我天真的认为直接提供一个WebView进行展示就能解决问题了,但当动手来实现的时候,才发现其实我需要做的就是把Dashboard的主要功能再实现一遍,而这些核心的功能包含以下这些:

  • 加载&&卸载wdgt文件包;
  • 提供WebView显示主要的界面;
  • 提供一个JS-OC的Bridge,完成基本类型转换,OC对象、Block在JS中的描述;
  • 加载wdgt中包含的plug-in,并映射到Widget运行的JS环境;
  • 解析wdget中的多语言包,提供给JS解释接口;
  • 提供CoreAnimation动画调用,完成特定的动画任务;
  • 提供原生UI元素如Memu等展示,提供如窗口Frame改变事件;
  • 本地配置的存储,类似NSUserDefaults的功能;
  • 提供完整的命令行执行环境,接受来自JS中的参数,并将结果传递回JS环境;

耗费了自己很长一段周末休息的时间,把以上功能都实现了出来,似乎一款很NB的软件将要诞生了,但经过与”准用户”们沟通发现,其实它们并没有那么大的痛点,至少不够痛,所以这算是一个”然并卵”的结果吧。

不过还好,本来这就是一次为了开发而开发的一个项目,结果至少印证 “I Can And I Done !”

在开发的过程中,其实收获还是挺多的,通过开发者的角度对Widget的实现机制算是有非常深刻的认识,能感受到这套规则的严谨,或许它本来可以发展得更好,但现实便是如此。就好像我自认为这个项目也有很高的含金量,但结果也只能如此罢了。

将源码放在了Github上,也算是善始善终,或者它还是有一些价值的:
https://github.com/tanhaogg/Widget