JSBox 脚本项目:app laucher

JSBox 脚本项目:app laucher

这是一个功能非常强大的 URL Scheme 启动器和管理工具,名为 "Launch Center"。它不仅仅是一个简单的快捷方式集合,而是一个集本地管理、云端共享、多平台小组件、自定义设置和测试工具于一体的综合性应用。我自己进行了部分修改以满足我的需求:增加测试页,增加本地启动项。

项目的作用

该项目的核心作用是管理和快速启动 URL Schemes。URL Scheme 是 iOS 系统中一种允许应用之间相互通信和跳转的机制。通过这个工具,用户可以:

  1. 快速启动应用与功能:一键直达某个应用的特定功能,例如“微信扫一扫”、“支付宝付款码”或“高德地图导航到[目的地]”。
  2. 管理个人收藏:用户可以创建、编辑、删除和排序自己的常用启动项,形成个性化的“本地”快捷方式库。
  3. 探索和分享:通过“云库”功能,用户可以浏览由社区或其他用户上传分享的启动项,并将它们一键收藏到本地使用。
  4. 在多处使用:项目完美适配了 JSBox 的多种运行环境,包括主应用、通知中心小组件(Today Widget)以及 iOS 14+ 的桌面小组件。
  5. 高级动态启动:支持带有“[占位符]”的动态 URL Scheme。在启动时,脚本会自动弹窗让用户输入参数(如搜索关键词、目的地等),然后拼接到 URL 中执行。
  6. 测试与调试:内置一个独立的“URL Scheme 测试工具”,方便开发者或高级用户调试和测试新的 Schemes。

实现方式

项目的代码结构清晰,通过模块化的方式将不同功能解耦,主要实现方式如下:

  1. 核心架构 (main.js, app.js)

    • main.js 是项目的入口文件。它通过 if ($app.env == ...) 判断当前的运行环境。
      • 如果是通知中心小组件 ($env.today),它会根据情况加载 today.jswidget.js
      • 如果是 iOS 14+ 桌面小组件 ($env.widget),它会加载 ios14widget.js
      • 如果是在主应用内运行 (else),它会加载核心的 app.js
    • app.js 是主应用的灵魂。它构建了一个包含“本地”、“云库”和“设置”三个标签页的底部导航界面。它负责调度各个视图的生成、事件处理、网络请求和数据同步。
  2. 数据管理与同步 (utils.js, sync.js, encrypt.js)

    • 本地数据:使用 $cache.get$cache.set(由 utils.js 中的 getCache 函数封装)来存取用户的本地启动项列表 (localItems) 和各种配置信息。
    • 云端同步sync.js 提供了基于 iCloud Drive 的数据同步功能。它会将用户的配置和本地启动项列表写入到 drive://launch-center/ 目录下。
    • 加密备份:为了增强安全性,sync.js 中的 uploaddownload 函数利用 encrypt.js(它引入了 crypto-js 库)对备份数据进行 AES 加密,然后再存入 iCloud Drive。这可以防止数据被轻易查看。
  3. 后端服务 (LeanCloud / AVOS Cloud)

    • 项目利用了第三方后端服务 LeanCloud(从代码中的 avoscloud.com URL 和 appId, appKey 可以看出)。
    • 云库功能app.js 中的 requireItems 函数会向 LeanCloud 的 Items 表请求数据,获取所有用户分享的启动项,并在“云库”界面展示。用户也可以通过 uploadItem 函数将自己的启动项上传分享。
    • 用户反馈与统计:项目还利用 LeanCloud 收集用户反馈 (sendFeedBack) 和统计应用安装量 (uploadInstall, requireInstallNumbers)。
    • 黑名单机制checkBlackList 函数会查询 LeanCloud 上的一个 list 表,用于禁用某些行为不当的用户设备。
  4. URL Scheme 处理 (testSchema.js, app.js)

    • 核心的动态 URL 处理逻辑在 testSchema.jshandleDynamicSchema 函数中。它使用正则表达式 /\[(.*?)\]|\{\{(.*?)\}\}|(=)(?=$)/ 来匹配需要用户输入的占位符。
    • 如果匹配成功,就使用 $ui.prompt 弹窗让用户输入内容,然后用 encodeURIComponent 对输入内容进行编码,并替换掉原文中的占位符,最后通过 $app.openURL 执行。
    • 在主应用 (app.js) 中,虽然没有直接使用 testSchema.js 的代码,但在 utils.jsspliceUrlPara 函数中也实现了对 [clipboard] 占位符的处理,即自动用剪贴板内容替换该占位符。
  5. UI 与视图 (ui.js, today.js, widget.js, ios14widget.js)

    • ui.js 提供了通用的 UI 组件生成函数,例如 genTemplate 用于生成 Matrix(网格)视图中每个单元格的模板,showToastView 用于显示提示信息。这使得主代码更整洁。
    • today.jswidget.js 分别为旧版的通知中心小组件构建 UI,它们使用 $ui.render 来渲染一个 matrix 视图。
    • ios14widget.js 则使用了 JSBox 针对 iOS 14+ 的新版小组件 API $widget.setTimeline,用声明式的语法来构建小组件界面,可以更好地与系统集成。
  6. 自动更新 (update.js)

    • update.js 实现了一套完整的脚本自更新逻辑。它会从 GitHub (raw.githubusercontent.com/.../app.json) 获取最新的版本信息。
    • 通过比较版本号 (needUpdate) 或构建号 (getLatestBuild),判断是否需要更新。
    • 如果需要更新,它会弹窗提示用户,并在用户同意后下载最新的 .box 脚本文件,然后使用 $addin.save$addin.restart 完成更新。

项目优点

  1. 功能全面且强大:集成了启动器、云端分享、多平台小组件、数据同步、更新系统于一身,覆盖了用户从使用、管理到分享的全链路需求,远超一个简单的启动器。

  2. 架构清晰,模块化程度高:代码被清晰地划分到 app, ui, utils, sync, update 等多个文件中,每个模块职责分明。这种设计使得代码易于维护、扩展和理解。

  3. 出色的用户体验

    • 动态占位符:自动弹窗让用户输入参数,极大增强了 URL Scheme 的灵活性。
    • 良好的视觉反馈:使用 Toast 提示、加载动画和点击反馈,让用户能清晰地了解操作结果。
    • 高度可定制:用户可以自定义显示列数、图标样式、小组件背景透明度等,满足个性化需求。
    • 暗黑模式适配:代码中大量使用了 $color("systemBackground"), $color({light: ..., dark: ...}) 等语义化颜色,确保在不同色彩模式下都有良好的显示效果。
  4. 数据安全与便捷:提供了基于 iCloud Drive 的自动同步和加密备份功能,解决了用户在多设备间同步数据以及意外删除脚本后恢复数据的痛点。

  5. 社区驱动的内容生态:“云库”功能让项目拥有了持续增长的内容源,用户不仅是使用者,也可以成为贡献者,这大大丰富了项目生态。

  6. 跨平台与环境兼容性:完美适配了应用本身、旧版通知中心小组件和新版桌面小组件三种环境,让用户可以在最方便的地方使用它。

总而言之,这个项目是一个设计精良、功能完备且极具实用价值的 JSBox 典范之作。它不仅展示了 JSBox 强大的能力,也体现了开发者在软件架构、用户体验和功能设计上的深厚功力。