前提条件
- 一个 Mellowtel 账户和配置密钥(从仪表板获取)。
- 一个可以访问主进程的 Electron 应用。
安装
1. 安装包
从你的项目根目录安装 Electron SDK:2. 添加到你的代码中
在你的 Electron 主进程文件中(通常是main.ts 或 main.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,以便开始处理请求。该调用对渲染器 UI 是非阻塞的,因此在建立连接时窗口保持响应。
可选:减少意外的操作系统提示
SDK 附带一个可选的助手setupMellowtelApp(),可以在后台请求工作期间减少意外的操作系统提示(自动填充弹出窗口、翻译栏、媒体覆盖、首次运行对话框)。
这些标志适用于整个 Electron 进程,而不仅仅是 Mellowtel。如果你的产品依赖于原生身份验证提示或密码管理器 UI,请跳过该助手。
在你的主进程文件顶部调用它,在 app.whenReady() 之前,并将其与 mellowtel-electron 的默认导出一起导入。有关规范用法,请参阅上游 README。
用户同意
你有两种处理同意的路径:- 通过
requestConsent(window, incentive)使用内置的原生对话框。这是最快的路径,也是上面的代码片段所展示的路径。它使用你的激励文案作为标题渲染一个原生 Electrondialog.showMessageBox,并自动保存用户的决定。 - 构建你自己的同意 UI 并通过
optIn()、optOut()和getOptInStatus()驱动 SDK。如果你想要自定义品牌、更丰富的解释或超出原生对话框提供的本地化,请使用此选项。
你的同意对话框必须包含的内容
1
解释 Mellowtel 的作用
使用简单的语言。示例:“此应用使用 Mellowtel 分享你的未使用互联网带宽。作为回报,你将获得 [好处/功能]。你可以随时在设置中选择退出。”
2
给用户一个明确的选择
包含明确的接受和拒绝选项。
允许用户稍后更改他们的同意
Mellowtel 提供了一个内置的设置对话框,通过showConsentSettings(window) 渲染。它渲染一个原生对话框,带有与用户当前状态匹配的选择加入/选择退出按钮,并在用户切换时内部调用 optIn() 或 optOut()(以及在选择加入时重新连接到 Mellowtel)。将其连接到应用中的菜单项或设置按钮,以便用户可以重新选择。
如果你更愿意构建自己的设置屏幕,请调用 getOptInStatus() 读取当前状态,并调用 optIn() / optOut() 进行更改。
方法参考
Mellowtel 类公开了以下公共方法。所有方法都可以在你使用 new Mellowtel(configurationKey, options?) 创建的实例上使用。
生命周期
init(): Promise<void>如果用户已选择加入,则启动服务;如果未选择加入,则返回而不启动。仅在配置密钥为空时抛出错误。shutdown(): Promise<void>在应用关闭时清理 SDK 资源。关闭与 Mellowtel 的连接,释放隔离的请求窗口,并清除后台计时器。保留用户的选择加入偏好。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 } }一次调用返回所有三个计数器。
生命周期和应用关闭
在第一个请求之后,SDK 可能会保留隔离的、屏幕外的 BrowserWindows 以进行后台工作。这些窗口无法访问用户的会话或应用的数据。主机应用必须在应用实际关闭时调用shutdown(),以便释放这些工作者。
shutdown():
- 关闭与 Mellowtel 的连接。
- 释放隔离的请求窗口。
- 清除后台计时器。
- 保留用户的选择加入偏好。
单窗口应用
在主应用窗口关闭时调用shutdown():
window-all-closed 事件。后台工作者可能会阻止其触发,因此将显式退出(或上面的主窗口 closed 处理程序)视为调用 shutdown() 的信号。
托盘应用
当窗口仅最小化到系统托盘时,不要调用shutdown()。从显式退出操作中调用它:
macOS 应用
如果应用在窗口关闭后仍然活跃,仅在用户实际退出应用时调用shutdown()。
选择退出
optOut() 已经执行了完整清理:
shutdown()。与 shutdown() 不同,optOut() 还会更改已保存的同意偏好。
再次启动
在shutdown() 或 optOut() 之后,可以再次启动 Mellowtel:
同意持久性
选择加入存储在你的应用的正常 Electron 配置中(与其他应用设置相同的electron-store 位置):
- macOS:
~/Library/Application Support/<YourAppName>/config.json - Windows:
%APPDATA%\<YourAppName>\config.json - Linux:
~/.config/<YourAppName>/config.json
故障排除
安装时出现“找不到包”错误
安装时出现“找不到包”错误
- 确认你正在安装
mellowtel-electron(而不是一个范围的 GitHub Packages 名称)。 - 清除 npm 缓存并重试,运行
npm cache clean --force然后npm install mellowtel-electron。
同意对话框从未出现
同意对话框从未出现
- 确保你在
app.whenReady()解析后调用requestConsent,并且使用仍然打开的有效BrowserWindow。 - 如果你使用
setupMellowtelApp(),请验证它是在app.whenReady()之前调用的,而不是之后。
“init() 运行没有错误但没有任何反应”
“init() 运行没有错误但没有任何反应”
这是设计使然。当用户尚未选择加入时,
init() 返回而不启动。检查 getOptInStatus() 以确认。如果返回 undefined 或 false,请先运行 requestConsent。当 disableLogs 保持默认值时(参见下面的“终端中没有日志”),不会打印“用户未选择加入”消息,因此在你翻转该标志之前,终端不会给你任何信号。终端中没有日志
终端中没有日志
disableLogs 构造函数选项默认为 true。在集成时将 { disableLogs: false } 作为第二个参数传递给构造函数,以便在终端中显示连接状态和请求活动。这也是区分“未选择加入”无操作(见上文)与真实连接失败的最快方法。预计完成时间:10-15 分钟。 如果你需要帮助或有反馈,请通过 info@mellowtel.com 联系我们或加入我们的 Discord 社区。