Кастомизация Android SDK
Deep linking
Section titled “Deep linking”В вашей 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:
<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:
<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 может вывести, и даже больше
<meta-data android:name="com.wavesend.log_level" android:value="ERROR" />Использование Proguard
Section titled “Использование Proguard”При использовании Proguard добавьте следующие опции:
-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.
<meta-data android:name="com.wavesend.notification_service_extension" android:value="com.your.package.YourNotificationServiceExtension" />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.
<meta-data android:name="com.wavesend.notification_factory" android:value="com.your.package.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.
<meta-data android:name="com.wavesend.summary_notification_factory" android:value="com.your.package.YourSummaryNotificationFactory" />public class YourSummaryNotificationFactory extends PushwooshSummaryNotificationFactory { @Override public String summaryNotificationMessage(int notificationsAmount) { // верните сообщение, которое вы хотите return super.summaryNotificationMessage(notificationsAmount); } @Override public int summaryNotificationIconResId() { // верните id ресурса иконки, которую вы хотите return super.summaryNotificationIconResId(); }}URL частного эндпоинта
Section titled “URL частного эндпоинта”Wavesend предоставляет частные эндпоинты для клиентов с подписками по тарифу Custom Plan. Чтобы настроить частный эндпоинт для Android SDK, вам необходимо добавить следующее в ваш файл 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 страниц. Чтобы создать очередь, добавьте следующий код в ваш проект:
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-уведомления”- Поместите ваш аудиофайл в соответствующую папку. Для нативной Android-платформы ваши файлы должны находиться в папке
/app/src/main/res/raw.
-
Выберите звук при настройке push-уведомления.

- Установите Канал уведомлений, к которому будет принадлежать сообщение. Для этого укажите следующее в поле “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:
<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), выполните следующие шаги:
-
Создайте кастомную NotificationFactory. Подробнее
-
В методе
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. Если вы столкнетесь с какими-либо трудностями, пожалуйста, не стесняйтесь поделиться своими мыслями с нами через эту форму.