Skip to main content
将 Mellowtel 集成到你的跨平台 Electron 应用中,让用户可以通过分享未使用的互联网带宽来获得奖励或高级功能。Electron SDK 可以在任何 Electron 运行的地方运行(macOS、Windows 和 Linux)。
用户同意是必须的。 SDK 仅在用户明确同意后才会运行。如果没有记录同意,init() 会静默地提前返回,因此如果你看到 SDK 启动没有错误但从未发送流量,最可能的原因是用户尚未同意。

前提条件

  • 一个 Mellowtel 账户和配置密钥(从仪表板获取)。
  • 一个可以访问主进程的 Electron 应用。

安装

1. 安装包

从项目根目录安装 Electron SDK:

2. 添加到你的代码中

在你的 Electron 主进程文件中(通常是 main.tsmain.js),导入 SDK,选择性地在应用准备好之前调用 setupMellowtelApp(),用你的配置密钥实例化 Mellowtel,向用户请求同意,然后调用 init() 启动服务。
YOUR_CONFIGURATION_KEY 替换为你从 Mellowtel 仪表板获取的密钥。
每个调用的作用:
  • new Mellowtel(configurationKey, options?) 实例化 SDK。目前唯一可用的选项是 disableLogs,默认值为 true。在集成时将其设置为 false,以便在终端中查看连接状态和请求活动。
  • requestConsent(window, incentive) 渲染一个 原生 Electron 消息框,锚定到你传入的 BrowserWindow。第二个参数是对话框的显著标题(例如,“免费获取 3 个月”),显示在 Mellowtel 的固定说明上方。如果用户接受则解析为 true,如果用户拒绝或关闭对话框则为 false,如果已经记录了同意则为 undefined。SDK 会自动持久化选择,因此你不需要在之后调用 optIn()
  • init() 仅在 configurationKey 为空时抛出异常。如果用户尚未同意,它会记录并静默返回。否则,它会打开一个到 Mellowtel 后端的 WebSocket。该调用对渲染器 UI 是非阻塞的,因此在建立连接时窗口仍然保持响应。

防止系统对话框中断(推荐)

SDK 附带一个可选的助手 setupMellowtelApp(),它配置 Electron 命令行标志以抑制系统对话框(自动填充弹出窗口、翻译栏、NTLM / Kerberos 认证提示、密码管理器集成、媒体覆盖、首次运行对话框),这些对话框可能会在 Mellowtel 的隐藏窗口在后台处理请求时中断用户。 在你的主进程文件顶部调用它, app.whenReady() 之前,并将其与 mellowtel-electron 的默认导出一起导入。请参阅上游 README以获取规范用法。

用户同意

显示同意对话框是必须的。在调用 init() 之前,你必须让用户明确同意,并且你必须提供一种方式让他们随时管理他们的同意状态。
你有两种处理同意的路径:
  1. 通过 requestConsent(window, incentive) 使用内置的原生对话框。 这是最快的路径,也是上面的代码片段所展示的。它渲染一个原生 Electron dialog.showMessageBox,并将你的激励文案作为标题,并自动持久化用户的决定。
  2. 构建你自己的同意 UI 并通过 optIn()optOut()getOptInStatus() 驱动 SDK。如果你想要自定义品牌、更丰富的解释或超出原生对话框提供的本地化,请使用此选项。

你的同意对话框必须包含的内容

1

解释 Mellowtel 的作用

使用简单的语言。示例:“此应用使用 Mellowtel 分享你的未使用互联网带宽。作为回报,你将获得[福利/功能]。你可以随时在设置中选择退出。”
2

给用户一个明确的选择

包含明确的接受和拒绝选项。
3

链接到政策

包含指向服务条款隐私政策的链接。

让用户以后更改他们的同意

Mellowtel 提供了一个内置的设置对话框,通过 showConsentSettings(window) 调用。它渲染一个原生对话框,带有与用户当前状态匹配的选择加入/选择退出按钮,并在用户切换时内部调用 optIn()optOut()(以及在选择加入时重新连接 WebSocket)。将其连接到应用中的菜单项或设置按钮,以便用户可以重新访问他们的选择。 如果你更愿意构建自己的设置屏幕,请调用 getOptInStatus() 读取当前状态,并使用 optIn() / optOut() 进行更改。

方法参考

Mellowtel 类公开了以下公共方法。所有方法都可以在你用 new Mellowtel(configurationKey, options?) 创建的实例上使用。 生命周期
  • init(): Promise<void> 如果用户已选择加入,则启动服务;如果没有,则静默提前返回。仅在配置密钥为空时抛出异常。
  • shutdown(): Promise<void> 在应用关闭时清理 SDK 资源。关闭 WebSocket,销毁隐藏的工作窗口,并清除后台计时器。保留用户的选择加入偏好。
  • requestConsent(window: BrowserWindow, incentive: string): Promise<boolean | undefined> 显示内置的原生同意对话框并持久化结果。接受时返回 true,拒绝或关闭时返回 false,如果已经给出同意则返回 undefined
  • showConsentSettings(window: BrowserWindow): Promise<void> 显示内置的管理同意对话框。当用户切换选择时,SDK 内部处理选择加入/选择退出的过渡。
手动选择加入控制
  • optIn(): Promise<void> 将用户标记为选择加入而不显示对话框。仅在通过你自己的 UI 收集同意后使用。
  • optOut(): Promise<void> 将用户标记为选择退出并执行完全清理(与 shutdown() 相同的资源,加上清除保存的同意偏好)。之后无需调用 shutdown()
  • getOptInStatus(): boolean | undefined 返回当前的选择加入状态,如果用户从未做出选择,则返回 undefined
  • getNodeId(): string 返回此安装的 Mellowtel 节点标识符。在提交支持票证时很有用。
请求计数器 请求计数通过 electron-store 本地持久化,并在应用重启后继续存在。如果你想向用户展示他们选择加入的影响,可以在你的 UI 中展示它们。
  • getTotalRequestCount(): number 返回自安装以来处理的总请求数。
  • getDailyRequestCount(): number 返回今天处理的请求数。
  • getRequestCountForDate(date: string): number 返回特定 YYYY-MM-DD 日期的计数。
  • getDailyRequestsHistory(): { [date: string]: number } 返回每个每日计数作为映射。
  • getRequestCountsInRange(startDate: string, endDate: string): { [date: string]: number } 返回日期范围内的计数。
  • getRequestCounts(): { total: number; daily: number; dailyHistory: { [date: string]: number } } 一次调用返回所有三个计数器。

生命周期和应用关闭

在处理其第一个请求后,Mellowtel 可能会创建隐藏的 Electron 工作窗口。主机应用必须在应用实际关闭时调用 shutdown() shutdown()
  • 关闭 WebSocket 连接。
  • 销毁隐藏的工作窗口。
  • 清除后台计时器和网络资源。
  • 保留用户的选择加入偏好。
shutdown() vs optOut(): shutdown() 是应用生命周期清理 — 同意被保留。optOut() 撤销用户同意并清理所有资源。不要混淆两者。

单窗口应用

在主应用窗口关闭时调用 shutdown()
不要仅依赖于 Electron 的 window-all-closed 事件,因为 Mellowtel 的隐藏工作窗口可能会阻止它触发。

托盘应用

不要在仅将窗口隐藏到系统托盘时调用 shutdown()。从显式退出操作中调用它:

macOS 应用

如果应用在窗口关闭后仍然活跃,仅在用户实际退出应用时调用 shutdown()

选择退出

optOut() 已经执行了完全清理:
之后无需调用 shutdown()。与 shutdown() 不同,optOut() 还会更改保存的同意偏好。

再次启动

shutdown()optOut() 之后,Mellowtel 可以再次启动:

同意持久化

选择加入状态存储在平台默认的 electron-store 配置路径中:
  • macOS: ~/Library/Application Support/<YourAppName>/config.json
  • Windows: %APPDATA%\<YourAppName>\config.json
  • Linux: ~/.config/<YourAppName>/config.json
状态在应用更新后仍然存在。卸载你的应用不会自动清除它,除非你的卸载程序明确删除应用的配置目录。

故障排除

  1. 确认你正在安装 mellowtel-electron(而不是一个范围的 GitHub Packages 名称)。
  2. 清除 npm 缓存并重试,运行 npm cache clean --force 然后 npm install mellowtel-electron
  1. 确保你在 app.whenReady() 解析后并使用有效的、未销毁的 BrowserWindow 引用调用 requestConsent
  2. 如果你使用 setupMellowtelApp(),请验证它是在 app.whenReady() 之前调用的,而不是之后。
这是设计使然。当用户尚未选择加入时,init() 会静默提前返回。检查 getOptInStatus() 以确认。如果返回 undefinedfalse,请先运行 requestConsent。请注意,当 disableLogs 保持默认值时(见下文“日志静默”),内部的“用户未选择加入”日志会被吞掉,因此终端在你翻转该标志之前不会给你任何信号。
disableLogs 构造函数选项默认为 true。在集成时将 { disableLogs: false } 作为第二个参数传递给构造函数,以便在终端中显示连接状态和请求活动。这也是区分“未选择加入”静默无操作(见上文)与真实连接失败的最快方法。

预计完成时间:10-15 分钟。 如果你需要帮助或有反馈,请通过 info@mellowtel.com 联系我们或加入我们的 Discord 社区