Skip to content

Кастомизация Android SDK

В вашей activity, которая будет обрабатывать deep link, добавьте тег <data> с параметрами scheme, host и pathPrefix.

<activity
android:name=".PromoActivity"
android:label="PromoActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.wavesend"
android:host="promotion"
android:pathPrefix="" />
</intent-filter>
</activity>

В приведенном выше примере deep link откроет PromoActivity. Для простоты базовая реализация ниже показывает оповещение со значением promo id. В вашем приложении это, безусловно, может быть что-то более полезное!

public class PromoActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.deep_link);
setTitle("Deep link activity");
Intent intent = getIntent();
String action = intent.getAction();
Uri data = intent.getData();
if (TextUtils.equals(action, Intent.ACTION_VIEW))
{
openUrl(data);
}
}
private void openUrl(Uri uri)
{
String promoId = uri.getQueryParameter("id");
Toast.makeText(getApplicationContext(), promoId, Toast.LENGTH_LONG).show();
}
}

Отслеживание покупок в приложении

Section titled “Отслеживание покупок в приложении”

Если вы хотите отслеживать покупки в приложении в Customer Journeys, настройте отправку информации о покупках в Wavesend, вызвав этот метод:

Wavesend.getInstance().sendInappPurchase(@NonNull String sku, @NonNull BigDecimal price, @NonNull String currency);

Push-уведомления для геозон

Section titled “Push-уведомления для геозон”

Чтобы использовать push-уведомления для геозон, добавьте библиотеку com.wavesend:wavesend-location и вызовите:

PushwooshLocation.startLocationTracking();

В вашем AndroidManifest.xml добавьте необходимые разрешения:

<manifest ... >
<!-- Required for geolocation-based push notifications -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Required for precise location tracking -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Required for background location access on Android 10 (API level 29) and higher -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

Использование локальных уведомлений с Wavesend

Section titled “Использование локальных уведомлений с Wavesend”

Если вы используете API локальных уведомлений Wavesend, добавьте разрешение RECEIVE_BOOT_COMPLETED в ваш AndroidManifest.xml:

AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>x

Использование числа на значке в Android

Section titled “Использование числа на значке в Android”

Wavesend поддерживает установку числа на значке приложения для следующих лаунчеров Android: Sony, Samsung, LG, HTC, ASUS, ADW, APEX, NOVA, HUAWEI, ZUK, OPPO. Чтобы использовать эту функциональность, просто добавьте библиотеку com.wavesend:wavesend-badge в ваше приложение.

Открытие кастомной activity

Section titled “Открытие кастомной activity”

Если вы хотите запускать определенную activity в ответ на push-уведомления, добавьте следующий intent-filter в эту activity:

AndroidManifest.xml
<activity android:name="YourActivity">
<intent-filter>
<action android:name="${applicationId}.MESSAGE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

Управление уровнем логирования

Section titled “Управление уровнем логирования”

Для помощи в отладке и интеграции SDK по умолчанию выводит все запросы в консоль. Когда вы будете готовы к релизной сборке, добавьте метаданные com.wavesend.log_level со значением “ERROR” в AndroidManifest.xml. Таким образом, в консоль будет выводиться только информация об ошибках. Другие возможные опции:

NONE - Нет логов от SDK ERROR - Отображать только ошибки в консоли WARN - Отображать также предупреждения INFO - Отображать информационные сообщения DEBUG - Отображается даже отладочная информация NOISE - Все, что SDK может вывести, и даже больше

AndroidManifest.xml
<meta-data android:name="com.wavesend.log_level" android:value="ERROR" />

При использовании Proguard добавьте следующие опции:

proguard-rules.pro
-keep class com.wavesend.** { *; }
-dontwarn com.wavesend.**

Ознакомьтесь с требованиями библиотеки Google Play Services в отношении Proguard здесь: https://developers.google.com/android/guides/setup

Кастомизация поведения при открытии уведомления

Section titled “Кастомизация поведения при открытии уведомления”

Если вам необходимо программно выбирать, какую activity отображать в результате push-уведомления, вы можете создать кастомный NotificationServiceExtension и включить полное имя класса вашего NotificationServiceExtension в метаданные под значением com.wavesend.notification_service_extension.

AndroidManifest.xml
<meta-data
android:name="com.wavesend.notification_service_extension"
android:value="com.your.package.YourNotificationServiceExtension" />
YourNotificationServiceExtension.java
public class YourNotificationServiceExtension extends NotificationServiceExtension {
@Override
protected void startActivityForPushMessage(PushMessage message) {
// super.startActivityForPushMessage() запускает activity лаунчера по умолчанию
// или activity, помеченную действием ${applicationId}.MESSAGE.
// Просто не вызывайте его, чтобы переопределить это поведение.
// super.startActivityForPushMessage(message);
// вместо этого запустите свою activity:
Intent launchIntent = new Intent(getApplicationContext(), YourActivity.class);
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
// (Опционально) передать данные уведомления в Activity
launchIntent.putExtra(Wavesend.PUSH_RECEIVE_EVENT, message.toJson().toString());
context.startActivity(launchIntent);
}
}

Кастомизация push-уведомлений

Section titled “Кастомизация push-уведомлений”

Чтобы кастомизировать вид push-уведомлений, вам нужно создать кастомную Factory. Вы можете создать кастомную NotificationFactory и включить полное имя класса вашей NotificationFactory в метаданные под значением com.wavesend.notification_factory.

AndroidManifest.xml
<meta-data
android:name="com.wavesend.notification_factory"
android:value="com.your.package.YourNotificationFactory" />
YourNotificationFactory
public class YourNotificationFactory extends WavesendNotificationFactory {
@Override
public Notification onGenerateNotification(@NonNull PushMessage pushMessage) {
if (customNotification) {
// TODO: сгенерировать и вернуть кастомное уведомление
}
// вернуть стандартное уведомление Wavesend
return super.onGenerateNotification(pushMessage);
}
}

Кастомизация группового саммари

Section titled “Кастомизация группового саммари”

Чтобы кастомизировать внешний вид группового саммари, создайте кастомную Factory. Вы можете создать кастомную SummaryNotificationFactory и включить полное имя класса вашей SummaryNotificationFactory в метаданные под значением com.wavesend.summary_notification_factory.

AndroidManifest.xml
<meta-data
android:name="com.wavesend.summary_notification_factory"
android:value="com.your.package.YourSummaryNotificationFactory" />
YourSummaryNotificationFactory
public class YourSummaryNotificationFactory extends PushwooshSummaryNotificationFactory {
@Override
public String summaryNotificationMessage(int notificationsAmount) {
// верните сообщение, которое вы хотите
return super.summaryNotificationMessage(notificationsAmount);
}
@Override
public int summaryNotificationIconResId() {
// верните id ресурса иконки, которую вы хотите
return super.summaryNotificationIconResId();
}
}

Wavesend предоставляет частные эндпоинты для клиентов с подписками по тарифу Custom Plan. Чтобы настроить частный эндпоинт для Android SDK, вам необходимо добавить следующее в ваш файл AndroidManifest.xml:

AndroidManifest.xml
<meta-data android:name="com.wavesend.base_url" android:value="PUSHWOOSH_PRIVATE_ENDPOINT_URL_PROVIDED" />

Создание очереди Rich Media

Section titled “Создание очереди Rich Media”

В случае, когда необходимо одновременно отобразить несколько Rich Media страниц (например, триггерные события для двух или более In-App-сообщений происходят в один момент, или Rich Media страница уже отображается в момент возникновения другого триггерного события), вы можете настроить очередь для отображения Rich Media страниц. Чтобы создать очередь, добавьте следующий код в ваш проект:

Application.java
package com.pushwoosh.testingapp;
import com.wavesend.RichMediaManager;
import com.wavesend.exception.PushwooshException;
import com.wavesend.richmedia.RichMediaPresentingDelegate;
import com.wavesend.richmedia.RichMedia;
import com.wavesend.internal.utils.PWLog;
import java.util.ArrayDeque;
import java.util.concurrent.locks.ReentrantLock;
public class DefaultRichMediaPresentingDelegate implements RichMediaPresentingDelegate {
private final String TAG = DefaultRichMediaPresentingDelegate.class.getSimpleName();
private ArrayDeque<RichMedia> richMediaQueue = new ArrayDeque<>();
private RichMedia currentRichMedia = null;
private ReentrantLock reentrantLock;
public DefaultRichMediaPresentingDelegate() {
PWLog.noise(TAG, "new DefaultRichMediaPresentingDelegate:" + this);
reentrantLock = new ReentrantLock();
}
@Override
public boolean shouldPresent(RichMedia richMedia) {
PWLog.noise(TAG, "shouldPresent:" + richMedia);
if (currentRichMedia == null) {
PWLog.noise(TAG, "currentRichMedia is null");
}
if (richMedia.isLockScreen()) {
PWLog.noise(TAG, "isLockScreen is true");
return true;
}
try {
reentrantLock.lock();
if (currentRichMedia == null) {
PWLog.noise(TAG, "show:" + richMedia);
currentRichMedia = richMedia;
return true;
} else {
PWLog.noise(TAG, "add to queue:" + richMedia);
richMediaQueue.add(richMedia);
return false;
}
} finally {
reentrantLock.unlock();
}
}
@Override
public void onPresent(RichMedia richMedia) {
PWLog.noise(TAG, "onPresent" + richMedia);
}
@Override
public void onError(RichMedia richMedia, PushwooshException pushwooshException) {
PWLog.error(TAG, pushwooshException + " richMedia:"+richMedia.toString());
tryShowNextRichMediaThreadSafety();
}
@Override
public void onClose(RichMedia richMedia) {
PWLog.noise(TAG, "onClose:" + richMedia);
tryShowNextRichMediaThreadSafety();
}
private void tryShowNextRichMediaThreadSafety() {
try {
reentrantLock.lock();
tryShowNextRichMedia();
} finally {
reentrantLock.unlock();
}
}
private void tryShowNextRichMedia() {
if (!richMediaQueue.isEmpty()) {
currentRichMedia = richMediaQueue.poll();
PWLog.noise(TAG, "try manual show:" + currentRichMedia);
RichMediaManager.present(currentRichMedia);
} else {
PWLog.noise(TAG, "richMediaQueue is empty");
currentRichMedia = null;
}
}
}

Кастомный звук push-уведомления

Section titled “Кастомный звук push-уведомления”
  1. Поместите ваш аудиофайл в соответствующую папку. Для нативной Android-платформы ваши файлы должны находиться в папке /app/src/main/res/raw.
  1. Создайте Канал уведомлений (Notification Channel)

  2. Выберите звук при настройке push-уведомления.

  1. Установите Канал уведомлений, к которому будет принадлежать сообщение. Для этого укажите следующее в поле “Android root params”: {"pw_channel": "ИМЯ КАНАЛА PUSH-УВЕДОМЛЕНИЙ"} // _здесь вам нужно указать имя для вашего канала с кастомным звуком_

В случае использования удаленного API, установите параметры следующим образом в вашем запросе /createMessage API:

"android_root_params": {"pw_channel": "push"} // здесь вам нужно указать имя для вашего канала с кастомным звуком, например, "push" для уведомлений со звуком push.wav.
"android_sound": "push" // здесь вы должны указать имя файла без расширения

Как только вы отправите push-уведомление с указанными параметрами, Канал уведомлений с выбранным звуком будет создан для всех устройств с Android 8+.

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

Правила Proguard для кастомных звуков уведомлений

Section titled “Правила Proguard для кастомных звуков уведомлений”

Если ваше приложение использует proguard для сокращения кода и ресурсов, важно сохранить ваши звуковые файлы нетронутыми и доступными для внешних библиотек. Если вы используете свойство minifyEnabled = true в вашем build.gradle, добавьте следующие правила в ваш proguard-rules.pro:

-keep public class your.package.name.R$raw {
*;
}

Если вы сокращаете ресурсы вашего приложения вдобавок к сокращению кода с помощью свойства shrinkResources=true, вы должны дополнительно указать, какие ресурсы вы хотите сохранить. Для этого создайте новый XML-файл с любым именем, сохраните его где-нибудь в вашем проекте (например, в res/xml) и укажите имена ресурсов под параметром tools:keep в теге resources:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@raw/*"
/>

Полный список флагов метаданных Android SDK

Section titled “Полный список флагов метаданных Android SDK”

Чтобы установить флаг, вам нужно добавить блок метаданных в файл AndroidManifest.xml внутри тега application. Например, если вы хотите установить ID приложения Wavesend, добавьте следующий код в ваш файл AndroidManifest.xml:

AndroidManifest.xml
<meta-data
android:name="com.wavesend.appid"
android:value="XXXXX-XXXXX" />
ФлагОписаниеВозможные значения
com.wavesend.appidУстанавливает ID приложения Wavesend.XXXXX-XXXXX
com.wavesend.senderidУстанавливает ID отправителя проекта Firebase.123456789000
com.wavesend.log_levelУстанавливает уровень логирования. Для получения дополнительной информации см. раздел Управление уровнем логирования.NONE / ERROR / WARN / INFO / DEBUG (по умолчанию) / NOISE
com.wavesend.base_urlПереопределяет базовый URL сервера Wavesend.https://cp.wavesend.ru/json/1.3/ (по умолчанию)
com.wavesend.notification_service_extensionКастомный NotificationServiceExtension. Для получения дополнительной информации см. раздел Кастомизация поведения при открытии уведомления.com.myapp.MyNotificationServiceExtension
com.wavesend.notification_factory

Кастомная NotificationFactory.

Для получения дополнительной информации см. раздел Кастомизация push-уведомлений.

com.myapp.MyNotificationFactory
com.wavesend.summary_notification_factoryКастомная SummaryNotificationFactory.com.myapp.MySummaryNotificationFactory
com.wavesend.multi_notification_modeЕсли true, уведомления будут сгруппированы. Если false, будет отображаться только последнее полученное уведомление.true / false (по умолчанию)
com.wavesend.allow_server_communicationЕсли true, SDK разрешено отправлять сетевые запросы на серверы Wavesend.true (по умолчанию) / false
com.wavesend.handle_notifications_using_workmanagerЕсли true, WorkManager настроен на обработку уведомлений.true / false (по умолчанию)
com.wavesend.notification_iconИмя ресурса кастомной (маленькой) иконки уведомления. Если null, будет использована иконка приложения по умолчанию.res/drawable-xxhdpi-v11/notification_small_icon.png / null
com.wavesend.notification_icon_colorЦвет фона (маленькой) иконки уведомления.#FFFFFF
com.wavesend.allow_collecting_device_dataЕсли true, SDK разрешено собирать и отправлять данные устройства в Wavesend.true (по умолчанию) / false
com.wavesend.allow_collecting_device_os_versionЕсли true, SDK разрешено собирать и отправлять версию ОС устройства в Wavesend.true (по умолчанию) / false
com.wavesend.allow_collecting_device_localeЕсли true, SDK разрешено собирать и отправлять локаль устройства в Wavesend.true (по умолчанию) / false
com.wavesend.allow_collecting_device_modelЕсли true, SDK разрешено собирать и отправлять модель устройства в Wavesend.true (по умолчанию) / false
com.wavesend.in_app_business_solutions_cappingОграничивает количество показов In-App-сообщения push-unregister в день.1 (по умолчанию), 2, …, n
com.wavesend.start_foreground_serviceЕсли true, Foreground Service запускается вместе с вызовом PushwooshLocation.startLocationTracking()true / false (по умолчанию)
com.wavesend.foreground_service_notification_textУстанавливает текст уведомления, создаваемого при запуске Foreground Service для ключа “com.wavesend.start_foreground_service”.Work in progress (по умолчанию)
com.wavesend.foreground_service_notification_channel_nameУстанавливает имя канала для уведомления, создаваемого при запуске Foreground Service для ключа “com.wavesend.start_foreground_service”.Foreground service (по умолчанию)
com.wavesend.trusted_package_namesПозволяет делиться HWID Wavesend с указанным пакетом”com.mycompany.myapp1, com.mycompany.myapp2”

Удаление Push-уведомлений с помощью TTL (Time-To-Live)

Section titled “Удаление Push-уведомлений с помощью TTL (Time-To-Live)”

Чтобы автоматически удалять push-уведомления по истечении заданного периода времени с помощью TTL (Time-to-Live), выполните следующие шаги:

  1. Создайте кастомную NotificationFactory. Подробнее

  2. В методе onGenerateNotification() создайте уведомление с помощью класса Notification.Builder или NotificationCompat.Builder и вызовите метод setTimeoutAfter:

public class YourNotificationFactory extends WavesendNotificationFactory {
@Override
public Notification onGenerateNotification(@NonNull PushMessage pushMessage) {
Notification.Builder builder = new Notification.Builder(getApplicationContext(), addChannel(pushData));
Notification notification = builder.setContentText(pushData.getMessage())
.setContentTitle(title)
.setContentText(text)
// остальной код создания уведомления
.setTimeoutAfter(timeout) // время в миллисекундах, по истечении которого уведомление будет отменено
.build();
}
}

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

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

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