Skip to content

FAQ по Wavesend Android SDK

Как выглядят Android push-токен и HWID?

Section titled “Как выглядят Android push-токен и HWID?”

Push-токены Android-устройств различаются по длине (менее 255 символов) и начинаются с APA91b, например:
APA91bFoi3lMMre9G3XzR1LrF4ZT82_15MsMdEICogXSLB8-MrdkRuRQFwNI5u8Dh0cI90ABD3BOKnxkEla8cGdisbDHl5cVIkZah5QUhSAxzx4Roa7b4xy9tvx9iNSYw-eXBYYd8k1XKf8Q_Qq1X9-x-U-Y79vdPq

Обратите внимание, что токены часто содержат префикс, отделенный двоеточием, перед APA91b, например, eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...

Wavesend использует UUID в качестве HWID, то есть случайно сгенерированные строки из 32 буквенно-цифровых символов: 123e4567-e89b-12d3-a456-426655440000

Как получить push-токен моего Android-устройства?

Section titled “Как получить push-токен моего Android-устройства?”

Вы можете получить push-токен вашего Android-устройства в логе консоли. Используйте инструмент logcat в Android Studio.

Откройте monitor.bat в %USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat, подключите ваше устройство к ПК и разрешите USB-отладку в настройках Android. Запустите ваше приложение на устройстве. Найдите /registerDevice, скопируйте push-токен вашего устройства, чтобы использовать его в разделе Test Devices.

Какие разрешения являются обязательными, а какие — опциональными?

Section titled “Какие разрешения являются обязательными, а какие — опциональными?”

При установке на Android-устройство приложение запросит следующие разрешения в связи с Wavesend SDK:

<!-- FCM подключается к Firebase Services. -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Предотвращает переход процессора в спящий режим при получении сообщения. -->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- Это разрешение используется для определения, имеет ли устройство доступ к сети. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- Это приложение имеет разрешение на регистрацию и получение сообщений с данными. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

Наш SDK не запрашивает разрешения на доступ к изображениям, контактам устройства и т.д.

Вы можете установить идентификатор пользователя (UserID), который может быть Facebook ID, именем пользователя, адресом электронной почты или любым другим уникальным идентификатором пользователя. Это позволит вам сопоставлять данные и события на нескольких устройствах, связанных с одним и тем же пользователем. Чтобы установить UserID, вызовите метод setUserId.

Пример

Wavesend.getInstance().setUserId("testUser");

Насколько точно общее количество подписчиков на Android?

Section titled “Насколько точно общее количество подписчиков на Android?”

Wavesend удаляет отписавшиеся Android-устройства из базы данных после получения ответа “NotRegistered” от FCM, который может быть возвращен после второй попытки связаться с конкретным устройством. Это означает, что вы должны отправить 2 push-уведомления на отписавшееся устройство, чтобы оно было удалено из нашей базы данных.
Вот наиболее распространенный сценарий, описанный в документации FCM:

  1. Ваш подписчик удаляет приложение.
  2. Wavesend отправляет сообщение на сервер FCM.
  3. Сервер FCM отправляет сообщение на устройство вашего пользователя.
  4. Клиент FCM на устройстве получает сообщение и обнаруживает, что ваше приложение было удалено; детали обнаружения зависят от платформы, на которой работает приложение.
  5. Клиент FCM на устройстве сообщает серверу FCM, что приложение было удалено.
  6. Сервер FCM помечает регистрационный ID для удаления.
  7. Wavesend отправляет еще одно сообщение в FCM.
  8. FCM возвращает сообщение NotRegistered.
  9. Wavesend удаляет push-токен из вашей базы пользователей.

Может потребоваться некоторое время, чтобы регистрационный ID был полностью удален из FCM. Таким образом, возможно, что сообщение, отправленное на шаге 7, получит в ответ действительный ID сообщения, даже если сообщение не будет доставлено в клиентское приложение.

Можно ли использовать HTML-теги в push-уведомлениях для Android?

Section titled “Можно ли использовать HTML-теги в push-уведомлениях для Android?”

Да, в Android вы можете использовать следующие HTML-теги для изменения внешнего вида push-уведомления:

<span style="color: green;"><b><i><span style="text-decoration: underline;">Hello world!
Hello hi hey</span></i></b></span>

Поместите эти HTML-теги в поле ввода Message и используйте их также в API-запросе. Обратите внимание, что некоторые устройства Android могут не обработать эти HTML-теги должным образом, но большинство устройств, которые мы использовали для тестов, отображали форматирование правильно.

Как установить иконку уведомления в Android Lollipop (и более поздних версиях)?

Section titled “Как установить иконку уведомления в Android Lollipop (и более поздних версиях)?”

В Android Lollipop иконки были изменены и стали только белыми. Поэтому, если вы выберете targetSdkVersion >= 21 в вашем файле AndroidManifest.xml, Android будет использовать только альфа-канал иконки.
Подробнее о поведении см. в документации Android.

Система игнорирует все каналы, кроме альфа-канала, в иконках действий и в основной иконке уведомления. Предполагается, что эти иконки будут только с альфа-каналом. Система отрисовывает иконки уведомлений белым цветом, а иконки действий — темно-серым. Это находится вне контроля Wavesend SDK.

1. Создайте иконку уведомления в соответствии с рекомендациями Android. Согласно документации, система проигнорирует все цвета.
1.1. Назовите иконку pw_notification.png и поместите ее в папку res/drawable. Wavesend SDK будет использовать эту иконку по умолчанию для уведомлений.
1.2. В качестве альтернативы вы можете использовать Remote API и установить значение параметра "android_icon" на изображение иконки (без расширения файла).

Использование Wavesend SDK с другими FCM-сервисами

Section titled “Использование Wavesend SDK с другими FCM-сервисами”

Вы можете использовать Wavesend вместе с другими SDK, которые используют FCM для push-сообщений. Для этого вам следует создать сервис-маршрутизатор для распределения событий между сервисами. Сначала добавьте зависимость wavesend-firebase вместе с основным модулем Wavesend:

build.gradle
implementation 'com.wavesend:wavesend-firebase:6.0.3'

Создайте класс маршрутизации:

import com.wavesend.firebase.WavesendFcmHelper;
class FirebaseMessagingRouterService : FirebaseMessagingService() {
override fun onNewToken(token: String?) {
super.onNewToken(token)
WavesendFcmHelper.onTokenRefresh(token)
sendTokenToAnotherService(token)
}
override fun onMessageReceived(remoteMessage: RemoteMessage) {
if (WavesendFcmHelper.isPushwooshMessage(remoteMessage)) {
// это push-уведомление от Wavesend, SDK обработает его автоматически
WavesendFcmHelper.onMessageReceived(this, remoteMessage)
} else {
// это не push-уведомление от Wavesend, вы должны обработать его самостоятельно
dispatchNonWavesendMessage(remoteMessage);
}
}
private fun dispatchNonWavesendMessage(remoteMessage: RemoteMessage) {
// Реализуйте здесь свою логику обработки push-уведомлений
}
}

Зарегистрируйте маршрутизаторы в вашем AndroidManifest.xml:

AndroidManifest.xml
<service
android:name=".FirebaseMessagingRouterService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>

Использование Wavesend с библиотеками LeakCanary или AppMetrica

Section titled “Использование Wavesend с библиотеками LeakCanary или AppMetrica”

Когда вы интегрируете аналитические инструменты, такие как LeakCanary, AppMetrica или другие, эти библиотеки запускают новый процесс, создавая новый экземпляр приложения. Поскольку вы не можете прослушивать push-уведомления в другом процессе, это приводит к возникновению java.lang.NullPointerException.

Если вы вызываете registerForPushNotifications внутри Application.onCreate(), вам следует проверить, находитесь ли вы в основном процессе приложения. Используйте следующий код для выполнения этой проверки:

List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
if (runningAppProcesses != null && runningAppProcesses.size() != 0) {
for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {
boolean isCurrentProcess = runningAppProcessInfo.pid == android.os.Process.myPid();
boolean isMainProcessName = getPackageName().equals(runningAppProcessInfo.processName);
if (isCurrentProcess && isMainProcessName) {
Wavesend.getInstance().registerForPushNotifications(...);
break;
}
}
}

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

Section titled “Удаление определенных полученных уведомлений с устройства локально”

Если вы хотите удалить неактуальное push-уведомление при выполнении определенного действия в вашем приложении, вы можете использовать следующий подход:

MainActivity.java
public class MainActivity extends AppCompatActivity {
List<NotificationCreatedEvent> savedPushes = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Wavesend.getInstance().registerForPushNotifications();
WavesendNotificationSettings.setMultiNotificationMode(true);
findViewById(R.id.clear_button).setOnClickListener( v -> {
cancelPushes();
});
EventBus.subscribe(NotificationCreatedEvent.class, event -> {
try {
if (event.getMessage().getCustomData() == null)
return;
// отменять push-уведомления только с определенным флагом
if (new JSONObject(event.getMessage().getCustomData()).getBoolean("cancel")) {
savedPushes.add(event);
}
} catch (JSONException e) {
}
});
}
private void cancelPushes() {
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
if (manager == null) {
return;
}
for (NotificationCreatedEvent event : savedPushes) {
manager.cancel(event.getMessageTag(), event.getMessageId());
}
}
}

Поделитесь с нами своим мнением

Section titled “Поделитесь с нами своим мнением”

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