1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xuexiangjys-XPush

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Один из возможных вариантов перевода текста на русский язык:

XPush

api I Star

Лёгкий и встраиваемый фреймворк для отправки сообщений Android. Интеграция в один клик (отправка через WeChat, Tencent, MailGun, Huawei, Xiaomi и т. д.), эффективная система сохранения активности, поддержка расширения функций отправки, полное разделение отправки и бизнес-логики, освобождение ваших рук!

Перед тем как создать задачу, пожалуйста, прочитайте мудрость создания вопросов, а также строго следуйте шаблону задачи (создать новую задачу), чтобы сэкономить время всех участников.

Прежде чем использовать, обязательно внимательно прочтите руководство по использованию, важные вещи повторяются трижды!

Прежде чем использовать, обязательно внимательно прочтите руководство по использованию, важные вещи повторяются трижды!

Прежде чем использовать, обязательно внимательно прочтите руководство по использованию, важные вещи повторяются трижды!

О себе

Публичный аккаунт Juejin Zhihu CSDN Jianshu Segmentfault Bilibili RuTeng
Путешествие в мир открытого исходного кода Android кликните сюда кликните сюда кликните сюда кликните сюда кликните сюда кликните сюда кликните сюда

Особенности

  • Простота интеграции. Всего несколько строк кода позволяют интегрировать отправку, в настоящее время уже поддерживаются WeChat, QQ, MailGun и другие каналы отправки, кроме того, можно расширить в соответствии с вашими потребностями.

  • Сильная совместимость. В настоящее время полностью поддерживает Android 9.0.

  • Мощные функции. Поддерживает регистрацию, отмену регистрации, добавление, удаление и получение тегов, привязку и открепление псевдонимов, получение, подключение к статусу отправки и другие операции, связанные с отправкой, а также может возвращать результаты ответов; поддерживает получение уведомлений о доставке, события кликов уведомлений, настраиваемые типы сообщений и т.д.

  • Унифицированная подписка на сообщения. Фреймворк предоставляет унифицированный канал подписки на сообщения, независимо от того, какой метод отправки вы используете, вы можете подписаться и отказаться от подписки на сообщения в любом месте, что удобно для получения и обработки сообщений.

  • Поддержка добавления фильтров сообщений. Подобно перехватчикам OkHttp, он может глобально фильтровать полученные сообщения и выбирать те сообщения, которые нам действительно нужны.

  • Предоставляет эффективную систему сохранения активности. Гарантирует, что приложения, подключённые к XPush, имеют высокий уровень доставки и стабильности сообщений, чего не могут достичь многие другие фреймворки для отправки.

График популярности звёзд

Stargazers over time

Структура компонентов

Этот фреймворк заимствует некоторые идеи из OnePush (в настоящее время не поддерживается), а также мой трёхлетний опыт отправки сообщений, образуя следующие компоненты:

  • Клиент отправки сообщений IPushClient: в основном предоставляет основные API платформы отправки сообщений.

  • Диспетчер событий отправки IPushDispatcher: в основном используется для пересылки сторонних событий отправки в распознаваемые события XPush.

  • Получатель сообщений IPushReceiver: централизованно получает события отправки, переданные IPushDispatcher, и является центром приёма событий.

  • Наблюдаемый за сообщениями IMessageObservable: в основном отвечает за управление подпиской и пересылкой сообщений отправки.

  • Стратегия фильтрации сообщений IMessageFilterStrategy: в основном отвечает за обработку и управление фильтрацией сообщений отправки.

Эти пять компонентов можно настроить в соответствии с требованиями вашего бизнеса.

Процесс отправки сообщений

После отправки сообщения из бэкенда:

Сторонняя платформа отправки --- (сообщение) ---> внутренняя система приёма сообщений сторонней платформы ----> (переопределение метода приёма)---> IPushDispatcher ----> (преобразование содержимого сообщения в XPushMsg/XPushCommand)---> IPushReceiver ----> (если не используется XPushManager для управления сообщениями, здесь завершается)

    [Использование XPushManager для управления сообщениями]:---IPushReceiver---> XPushManager -----> IMessageFilterStrategy ---> (фильтрация сообщений)---> IMessageObservable ---> (сообщения пересылаются в места подписки)

Зачем создавать этот проект

Все, кто работал с Android, знают, насколько серьёзной является фрагментация устройств, и то же самое относится к платформам отправки. Ещё в 2017 году Министерство промышленности и информатизации призвало все компании разработать единую платформу отправки для Android, но до сих пор ничего не было сделано (по сути, это связано с тем, что интересы слишком велики, и никто не хочет идти на компромисс).

Но мы не можем возлагать все свои надежды на событие, которое может произойти или не произойти, код должен быть написан, функции должны быть реализованы, и лучше сделать это самим, чем зависеть от других людей. Создание собственной системы отправки, которая будет контролироваться нами, кажется более надёжным решением, чем полагаться на сторонние платформы.

Возможно, кто-то спросит, почему вы решили создать свою собственную систему отправки вместо использования существующих систем, таких как WeChat и MailGun? Если вам не важны своевременность и уровень доставки, то это не имеет значения (на практике WeChat не очень удобен в использовании). Здесь я хочу подчеркнуть, что вы не можете доверить свою судьбу другим людям, отправка отличается от других бизнес-процессов, она относительно сложна, требует обработки большого количества событийных сообщений, предъявляет высокие требования к серверу, и вы готовы доверить свои сообщения отправки третьей стороне? Кроме того, можете ли вы заставить своих коллег использовать определённую платформу отправки? Если нет, то лучше взять контроль над своей судьбой в свои руки, так что создание собственной системы отправки будет более безопасным выбором.

Ранее в группе обмена сообщениями QQ всегда были люди, которые хотели, чтобы я открыл исходный код фреймворка для отправки, на самом деле я уже написал такой фреймворк во время работы в предыдущей компании, но он был слишком тесно связан с бизнесом, плюс избегал риска утечки информации, поэтому не было необходимости открывать исходный код. Эта новая система отправки полностью переписана, с новым дизайном, который делает её более универсальной и гибкой.

Демонстрация (пожалуйста, поддержите звёздами)

Демонстрация программы

xpush_demo.gif

Скачать демо

Демо для полной платформы XPush

XPushDemo

download_xpush.png

Демонстрационное приложение для интеграции с MailGun

MailGun demo

download_xgdemo.png 2. Добавление XPush основных зависимостей:

dependencies {
  ...
  // Библиотека для отправки уведомлений
  implementation 'com.github.xuexiangjys.XPush:xpush-core:1.0.1'
  // Библиотека для поддержания активности приложения
  implementation 'com.github.xuexiangjys.XPush:keeplive:1.0.1'
}

3. Добавление сторонних библиотек для отправки уведомлений (в зависимости от ваших потребностей):

dependencies {
  ...
  // Выберите библиотеку для интеграции
  implementation 'com.github.xuexiangjys.XPush:xpush-jpush:1.0.1'
  implementation 'com.github.xuexiangjys.XPush:xpush-umeng:1.0.1'
  implementation 'com.github.xuexiangjys.XPush:xpush-huawei:1.0.1'
  implementation 'com.github.xuexiangjys.XPush:xpush-xiaomi:1.0.1'
  implementation 'com.github.xuexiangjys.XPush:xpush-xg:1.0.1'
}

Инициализация конфигурации XPush

  1. Регистрация приёмника сообщений. Есть два способа регистрации:
  • Если вы хотите использовать управление сообщениями, предоставляемое XPushManager, зарегистрируйте в AndroidManifest.xml стандартный приёмник XPushReceiver. Вы также можете создать свой собственный приёмник, унаследовав от XPushReceiver и переопределив методы.

  • Для реализации собственного управления сообщениями наследуйте от AbstractPushReceiver, переопределите методы и зарегистрируйте приёмник в AndroidManifest.xml.

    <!-- Пользовательский приёмник сообщений -->
    <receiver android:name=".push.CustomPushReceiver">
        <intent-filter>
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_CONNECT_STATUS_CHANGED" />
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_NOTIFICATION" />
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_NOTIFICATION_CLICK" />
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_MESSAGE" />
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_COMMAND_RESULT" />

            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>

    <!-- Стандартный приёмник сообщений -->
    <receiver android:name="com.xuexiang.xpush.core.receiver.impl.XPushReceiver">
        <intent-filter>
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_CONNECT_STATUS_CHANGED" />
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_NOTIFICATION" />
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_NOTIFICATION_CLICK" />
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_MESSAGE" />
            <action android:name="com.xuexiang.xpush.core.action.RECEIVE_COMMAND_RESULT" />

            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>

Обратите внимание, что статическая регистрация широковещательных сообщений не будет работать на устройствах с Android 8.0 и выше. Решить эту проблему можно двумя способами:

  • Динамически регистрировать приёмники сообщений.

  • Изменить отправителя сообщений.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Решение проблемы с регистрацией на Android 8.0: динамическая регистрация
    XPush.registerPushReceiver(new CustomPushReceiver());

    // Другое решение проблемы с регистрацией на Android 8.0: изменение отправителя
    XPush.setIPushDispatcher(new Android26PushDispatcherImpl(CustomPushReceiver.class));
}
  1. Добавьте класс реализации стороннего клиента в тег application в файле AndroidManifest.xml. Обратите внимание, что значения PlatformName и PlatformCode должны соответствовать классу реализации клиента.
<!--name формата: XPush_[PlatformName]_[PlatformCode]-->
<!--value формата: путь к полному имени класса сущности клиента-->

<!-- Если используется библиотека xpush-jpush -->
<meta-data
    android:name="XPush_JPush_1000"
    android:value="com.xuexiang.xpush.jpush.JPushClient" />

<!-- Если используется библиотека xpush-umeng -->
<meta-data
    android:name="XPush_UMengPush_1001"
    android:value="com.xuexiang.xpush.umeng.UMengPushClient" />
    
<!-- Если используется библиотека xpush-huawei -->
<meta-data
    android:name="XPush_HuaweiPush_1002"
    android:value="com.xuexiang.xpush.huawei.HuaweiPushClient" />

<!-- Если используется библиотека xpush-xiaomi -->
<meta-data
    android:name="XPush_MIPush_1003"
    android:value="com.xuexiang.xpush.xiaomi.XiaoMiPushClient" />
    
<!-- Если используется библиотека xpush-xg -->
<meta-data
    android:name="XPush_XGPush_1004"
    android:value="@string/xpush_xg_client_name" />
  1. Добавьте AppKey и AppSecret сторонних платформ. Эти данные необходимо получить после регистрации приложения на соответствующих платформах. Обратите внимание, если используется xpush-xiaomi, то в AndroidManifest.xml необходимо добавить AppKey и AppSecret Xiaomi (обратите внимание на «\», который должен быть добавлен, иначе будет получено значение float вместо String, что приведёт к неправильному получению id и key).
<!-- Статическая регистрация GCM -->
<meta-data
    android:name="JPUSH_CHANNEL"
    android:value="default_developer" />
<meta-data
    android:name="JPUSH_APPKEY"
    android:value="a32109db64ebe04e2430bb01" />

<!-- Статическая регистрация UMENG -->
<meta-data
    android:name="UMENG_APPKEY"
    android:value="5d5a42ce570df37e850002e9" />
<meta-data
    android:name="UMENG_MESSAGE_SECRET"
``` ```
return false;
    }
};

@Override
public void onDestroyView() {
    XPushManager.get().removeFilter(mMessageFilter);
    super.onDestroyView();
}

6. Обработка кликов в уведомлениях о push-уведомлениях

Для уведомлений о push-уведомлениях можно обрабатывать клики более элегантно, настраивая действия, которые должны выполняться после нажатия на уведомление.

В глобальном приёмнике сообщений IPushReceiver можно добавить действие для открытия нужной страницы в методе onNotificationClick.

@Override
public void onNotificationClick(Context context, XPushMsg msg) {
    super.onNotificationClick(context, msg);
    // Открытие нужной Activity
    Intent intent = IntentUtils.getIntent(context, TestActivity.class, null, true);
    intent.putExtra(KEY_PARAM_STRING, msg.getContent());
    intent.putExtra(KEY_PARAM_INT, msg.getId());
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    ActivityUtils.startActivity(intent);
}

Обратите внимание, что для этого необходимо использовать тип уведомления «настроить действие» или «открыть нужную страницу» и передавать содержимое уведомления в формате:

  • title: заголовок уведомления;

  • content: содержание уведомления;

  • extraMsg: дополнительное сообщение, которое может содержать json или другое содержимое;

  • keyValue: пары ключ-значение, связанные с уведомлением.

xpush://com.xuexiang.xpush/notification?title=Это уведомление&content=Это содержание&extraMsg=xxxxxxxxx&keyValue={"param1": "1111", "param2": "2222"}

Вы также можете настроить формат передаваемого содержимого уведомления. Для получения дополнительной информации обратитесь к проекту XPush, а именно к классам XPushNotificationClickActivity и AndroidManifest.xml.


Поддерживаемые платформы

Платформа Название Код Модуль Класс клиента
Jiguang JPush 1000 xpush-jpush com.xuexiang.xpush.jpush.JPushClient
UMeng UMengPush 1001 xpush-umeng com.xuexiang.xpush.umeng.UMengPushClient
Huawei HuaweiPush 1002 xpush-huawei com.xuexiang.xpush.huawei.HuaweiPushClient
Xiaomi MIPush 1003 xpush-xiaomi com.xuexiang.xpush.xiaomi.XiaoMiPushClient
XGPush XGPush 1004 xpush-xg com.xuexiang.xpush.xg.XGPushClient

Также существует пример использования MQTT для отправки сообщений — XPush-MQTT.

Особенности платформ

  • Jiguang: все функции поддерживаются.

  • UMeng: при инициализации XPush необходимо зарегистрироваться в основном процессе и в канале. Не поддерживает получение тегов и псевдонимов. Не отслеживает состояние соединения при отправке уведомлений.

  • XGPush: не поддерживает получение тегов и псевдонимов. Не отслеживает состояние соединения при отправке уведомлений.

  • Huawei: перед регистрацией необходимо установить последнюю версию службы push-уведомлений. Не поддерживает получение всех тегов и псевдонимов. Не получает уведомления о получении уведомлений.

  • Xiaomi: за один раз можно работать только с одним тегом. Отмена регистрации не возвращает результат. Не отслеживает состояние соединения при отправке уведомлений.

Расширение сторонних платформ

Поскольку существует множество платформ для Android, невозможно и не нужно предоставлять библиотеки для интеграции со всеми из них. Если вы хотите использовать платформу, которой нет в списке, вам придётся создать свою собственную библиотеку.

Создание библиотеки для новой платформы не так сложно. Необходимо выполнить следующие шаги:

  1. Создать новый модуль Android Library и импортировать зависимости для платформы, которую вы хотите интегрировать. Это включает в себя импорт библиотек или SDK для push-платформы и настройку файла AndroidManifest.xml.

  2. Создать клиент для этой платформы (например, XXXClient), который реализует интерфейс IPushClient и переопределяет соответствующие методы. Методы init, register, unRegister, getPlatformCode и getPlatformName являются обязательными для переопределения.

  3. Создать и переопределить методы для обработки сообщений и уведомлений от третьей стороны. В основном это означает вызов методов transmitXXX из XPush для пересылки уведомлений, сообщений и других событий на платформу XPush.

Основные методы, которые необходимо вызвать:

(1) XPush.transmitMessage(): пересылка пользовательских (прозрачных) сообщений.

(2) XPush.transmitNotification(): пересылка уведомлений о доставке.

(3) XPush.transmitNotificationClick(): пересылка событий нажатия на уведомления. (4) XPush.transmitCommandResult(): передаёт результат выполнения команды IPushClient.

(5) XPush.transmitConnectStatusChanged(): передаёт событие, связанное с изменением состояния соединения для отправки.

    1. Добавить конфигурацию обфускации для соответствующей платформы push-уведомлений.

После этого интеграция платформы push-уведомлений завершена. Осталось только выбрать платформу при инициализации XPush. Если вы всё ещё не понимаете, вы можете обратиться к примерам xpush-xiaomi и xpush-huawei.

Механизм сохранения активности приложения

Предоставленный здесь механизм сохранения активности приложения представляет собой смесь различных решений, разработанных ранее другими людьми. В настоящее время он обеспечивает хороший эффект сохранения активности в версиях 9.0 и ниже (если вы не убиваете программу активно), и вы можете попробовать его, если ваше приложение должно работать в фоновом режиме (например, служба push-уведомлений), чтобы система не завершала его автоматически. Следует отметить, что сохранение активности программы не означает, что программа становится неубиваемой. Программа будет оставаться активной, но это не защитит её от завершения системой, если только вы не сделаете своё приложение системным или не добавите его в белый список системы. Это просто повышает приоритет программы и снижает вероятность того, что система завершит её работу.

Для получения дополнительной информации о механизме сохранения активности см. Использование механизма сохранения активности.


Описание сущностей

XPushMsg

Сущность, которая преобразует push-сообщение и содержит исходные данные сообщения. | Поле | Тип | Примечание | | --- | --- | --- | | mId | int | Идентификатор сообщения / статус | | mTitle | String | Заголовок уведомления | | mContent | String | Содержание уведомления | | mMsg | String | Настраиваемое (прозрачное) сообщение | | mExtraMsg | String | Расширенное поле сообщения | | mKeyValue | String | Ключ-значение сообщения |

Notification

Уведомление, полученное из XPushMsg. | Поле | Тип | Примечание | | --- | --- | --- | | mId | int | Идентификатор сообщения / статус | | mTitle | String | Заголовок уведомления | | mContent | String | Содержание уведомления | | mExtraMsg | String | Расширенное поле сообщения | | mKeyValue | String | Ключ-значение сообщения |

CustomMessage

Настраиваемое (прозрачное) сообщение, полученное из XPushMsg. | Поле | Тип | Примечание | | --- | --- | --- | | mMsg | String | Настраиваемое (прозрачное) сообщение | | mExtraMsg | String | Расширенное поле сообщения | | mKeyValue | String | Ключ-значение сообщения |

XPushCommand

Информация о результате выполнения команд IPushClient. | Поле | Тип | Примечание | | --- | --- | --- | | mType | int | Тип команды | | mResultCode | int | Код результата | | mContent | String | Текст команды | | mExtraMsg | String | Дополнительное поле | | mError | String | Сообщение об ошибке |

Введение в константы

CommandType

Типы команд. | Команда | Код | Примечание | | --- | --- | --- | | TYPE_REGISTER | 2000 | Регистрация push-уведомления | | TYPE_UNREGISTER | 2001 | Отмена регистрации push-уведомления | | TYPE_ADD_TAG | 2002 | Добавление тега | | TYPE_DEL_TAG | 2003 | Удаление тега | | TYPE_GET_TAG | 2004 | Получение тега | | TYPE_BIND_ALIAS | 2005 | Привязка псевдонима | | TYPE_UNBIND_ALIAS | 2006 | Отвязка псевдонима | | TYPE_GET_ALIAS | 2007 | Получение псевдонима | | TYPE_AND_OR_DEL_TAG | 2008 | Добавление или удаление тега |

ResultCode

Коды результатов команд. | Результат | Код | Примечание | | --- | --- | --- | | RESULT_OK | 0 | Успех | | RESULT_ERROR | 1 | Ошибка |

ConnectStatus

Статус подключения. | Статус | Код | Примечание | | --- | --- | --- | | DISCONNECT | 10 | Соединение разорвано | | CONNECTING | 11 | Соединение устанавливается | | CONNECTED | 12 | Соединение установлено |


Конфигурация обфускации

# Обфускация для XPush
-keep class * extends com.xuexiang.xpush.core.IPushClient{*;}
-keep class * extends com.xuexiang.xpush.core.receiver.IPushReceiver{*;}

# Обфускация для Glimmer push
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }
-keep class * extends cn.jpush.android.service.JPushMessageReceiver{*;}

# Обфускация для Umeng push
-dontwarn com.umeng.**
-dontwarn com.taobao.**
-dontwarn anet.channel.**
-dontwarn anetwork.channel.**
-dontwarn org.android.**
-dontwarn org.apache.thrift.**
-dontwarn com.xiaomi.**
-dontwarn com.huawei.**
-dontwarn com.meizu.**
-keep class com.taobao.** {*;}
-keep class org.android.** {*;}
-keep class anet.channel.** {*;}
-keep class com.xiaomi.** {*;}
-keep class com.huawei.** {*;}
-keep class com.meizu.** {*;}
-keep class org.apache.thrift.** {*;}
-keep class com.alibaba.sdk.android.**{*;}
-keep class com.ut.**{*;}
-keep class com.ta.**{*;}

# Обфускация для QQ push
-keep class com.tencent.android.tpush.** {*;}
-keep class com.tencent.mid.** {*;}
-keep class com.qq.taf.jce.** {*;}
-keep class com.tencent.bigdata.** {*;}

# Обфускация для Huawei push
-keep class com.huawei.hms.**{*;}
-keep class com.huawei.android.hms.agent.**{*;}

# Обфускация для Xiaomi push
-keep class * extends com.xiaomi.mipush.sdk.PushMessageReceiver{*;}

Особая благодарность

Если вам нравится проект, пожалуйста, рассмотрите возможность поддержки

Ваша поддержка — это моя мотивация. Я буду вести список всех спонсоров в качестве доказательства, поэтому, пожалуйста, оставьте комментарий о поддержке перед тем, как сделать пожертвование!

pay.png

Контакты

Для получения дополнительной информации, пожалуйста, отсканируйте QR-код, чтобы подписаться на мой личный аккаунт WeChat: [Мой Android с открытым исходным кодом]

gzh_weixin.jpg

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/xuexiangjys-XPush.git
git@api.gitlife.ru:oschina-mirror/xuexiangjys-XPush.git
oschina-mirror
xuexiangjys-XPush
xuexiangjys-XPush
master