Skip to main content
Интегрируйте Mellowtel в ваше кроссплатформенное приложение на Electron, чтобы пользователи могли делиться неиспользованной пропускной способностью интернета в обмен на вознаграждения или премиум-функции. Electron SDK работает везде, где работает Electron (macOS, Windows и Linux).
Согласие пользователя обязательно. SDK работает только тогда, когда пользователь явно дал согласие. init() возвращается без запуска, если согласие не получено, поэтому, если вы видите, что SDK запускается без ошибок, но никогда не обрабатывает запросы, наиболее вероятная причина в том, что пользователь еще не дал согласие.

Предварительные требования

  • Учетная запись 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. Пропустите помощника, если ваш продукт полагается на нативные запросы аутентификации или интерфейс менеджера паролей. Вызовите его в начале вашего основного файла процесса, перед app.whenReady(), и импортируйте его вместе с экспортом по умолчанию из mellowtel-electron. См. основное README для канонического использования.

Согласие пользователя

Отображение диалога согласия обязательно. Вы должны позволить пользователям явно дать согласие перед вызовом init(), и вы должны предоставить способ управлять их состоянием согласия в любое время.
У вас есть два пути для обработки согласия:
  1. Используйте встроенный нативный диалог через requestConsent(window, incentive). Это самый быстрый путь, и именно его показывает приведенный выше фрагмент. Он отображает нативный dialog.showMessageBox Electron с вашим текстом стимула в качестве заголовка и автоматически сохраняет решение пользователя.
  2. Создайте собственный интерфейс согласия и управляйте SDK через optIn(), optOut() и getOptInStatus(). Используйте это, если вы хотите кастомный брендинг, более богатые объяснения или локализацию, выходящую за рамки того, что предлагает нативный диалог.

Что должен включать ваш диалог согласия

1

Объясните, что делает Mellowtel

Используйте простой язык. Пример: “Это приложение использует Mellowtel для обмена вашей неиспользованной пропускной способностью интернета. Взамен вы получаете [выгода/функция]. Вы можете отказаться в любое время в настройках.”
2

Дайте пользователям четкий выбор

Включите четкие опции Принять и Отклонить.
3

Ссылка на политики

Позвольте пользователям изменить свое согласие позже

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> отмечает пользователя как давшего согласие без показа диалога. Используйте это только после получения согласия через ваш собственный интерфейс.
  • optOut(): Promise<void> отмечает пользователя как отказавшегося и выполняет полную очистку (те же ресурсы, что и shutdown(), плюс очистка сохраненного предпочтения согласия). Нет необходимости вызывать shutdown() после этого.
  • getOptInStatus(): boolean | undefined возвращает текущее состояние согласия, или undefined, если пользователь никогда не делал выбора.
  • getNodeId(): string возвращает идентификатор узла Mellowtel для этой установки. Полезно при подаче заявок в службу поддержки.
Счетчики запросов Счетчики запросов сохраняются локально через electron-store и сохраняются при перезапуске приложения. Отображайте их в вашем собственном интерфейсе, если хотите показать пользователям влияние их согласия.
  • 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() против optOut(): shutdown() выполняется, когда приложение закрывается — предпочтение пользователя сохраняется. optOut() используется, когда пользователь меняет свое мнение — согласие отзывается, и SDK останавливается.

Приложения с одним окном

Вызовите shutdown(), когда основное окно приложения закрывается:
Не полагайтесь только на событие Electron window-all-closed. Фоновые рабочие процессы могут предотвратить его срабатывание, поэтому рассматривайте явный выход (или обработчик closed основного окна выше) как сигнал для вызова shutdown().

Приложения в трее

Не вызывайте shutdown(), когда окно только свернуто в системный трей. Вызовите его из явного действия Quit:

Приложения для 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 сохраняет самостоятельно.

Устранение неполадок

  1. Убедитесь, что вы устанавливаете mellowtel-electron (а не имя пакета GitHub Packages).
  2. Очистите кэш npm и повторите попытку, выполнив npm cache clean --force, а затем npm install mellowtel-electron.
  1. Убедитесь, что вы вызываете requestConsent после того, как app.whenReady() разрешился, и с действительным BrowserWindow, который все еще открыт.
  2. Если вы используете setupMellowtelApp(), убедитесь, что он вызывается перед app.whenReady(), а не после.
Это по дизайну. init() возвращается без запуска, когда пользователь не дал согласие. Проверьте getOptInStatus(), чтобы подтвердить. Если он возвращает undefined или false, сначала выполните requestConsent. Сообщение “Пользователь не дал согласие” не выводится, когда disableLogs оставлено по умолчанию (см. “Нет логов в терминале” ниже), поэтому терминал не дает вам сигнала ни в ту, ни в другую сторону, пока вы не измените этот флаг.
Опция конструктора disableLogs по умолчанию true. Передайте { disableLogs: false } в качестве второго аргумента конструктору во время интеграции, чтобы увидеть состояние соединения и активность запросов в вашем терминале. Это также самый быстрый способ отличить “не дал согласие” от реальной ошибки соединения.

Оценочное время завершения: 10-15 минут. Если вам нужна помощь или у вас есть отзывы, свяжитесь с нами по адресу info@mellowtel.com или присоединяйтесь к нашему сообществу в Discord.