Настройка Android SDK
Глубокие ссылки (Deep linking)
Anchor link toВ activity, которая будет обрабатывать глубокую ссылку, добавьте тег <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.pushwoosh" android:host="promotion" android:pathPrefix="" /> </intent-filter></activity>
В приведенном выше примере глубокая ссылка откроет 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(); }}
Отслеживание покупок в приложении
Anchor link toЕсли вы хотите отслеживать покупки в приложении в сценариях Customer Journey, настройте отправку информации о покупках в Pushwoosh, вызвав этот метод:
Pushwoosh.getInstance().sendInappPurchase(@NonNull String sku, @NonNull BigDecimal price, @NonNull String currency);
Push-уведомления на основе геозон
Anchor link toЧтобы использовать push-уведомления на основе геозон, добавьте библиотеку com.pushwoosh:pushwoosh-location
и вызовите:
PushwooshLocation.startLocationTracking();
В ваш AndroidManifest.xml добавьте необходимые разрешения:
<manifest ... > <!-- Требуется для push-уведомлений на основе геолокации --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Требуется для точного отслеживания местоположения --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Требуется для фонового доступа к местоположению на Android 10 (API уровень 29) и выше --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /></manifest>
Использование локальных уведомлений с Pushwoosh
Anchor link toЕсли вы используете Pushwoosh Local Notifications API, добавьте разрешение RECEIVE_BOOT_COMPLETED
в ваш AndroidManifest.xml:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>x
Использование счетчика на иконке приложения в Android
Anchor link toPushwoosh поддерживает установку счетчика на иконке приложения для следующих лаунчеров Android:
Sony, Samsung, LG, HTC, ASUS, ADW, APEX, NOVA, HUAWEI, ZUK, OPPO.
Чтобы использовать эту функцию, просто добавьте библиотеку com.pushwoosh:pushwoosh-badge
в ваше приложение.
Открытие кастомной activity
Anchor link toЕсли вы хотите запускать определенную activity в ответ на push-уведомления, добавьте к этой activity следующий intent-filter:
<activity android:name="YourActivity"> <intent-filter> <action android:name="${applicationId}.MESSAGE"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter></activity>
Управление уровнем логирования
Anchor link toДля помощи в отладке и интеграции SDK по умолчанию выводит все запросы в консоль. Когда вы будете готовы к релизной сборке, добавьте метаданные com.pushwoosh.log_level
со значением “ERROR” в AndroidManifest.xml. Таким образом, в консоль будет выводиться только информация об ошибках. Другие возможные опции:
NONE - Нет логов от SDK
ERROR - Отображать только ошибки в консоли
WARN - Отображать также предупреждения
INFO - Отображать информационные сообщения
DEBUG - Отображать даже отладочную информацию
NOISE - Все, что может вывести SDK, и даже больше
<meta-data android:name="com.pushwoosh.log_level" android:value="ERROR" />
Использование Proguard
Anchor link toПри использовании Proguard добавьте следующие опции:
-keep class com.pushwoosh.** { *; }-dontwarn com.pushwoosh.**
Смотрите требования библиотеки Google Play Services относительно Proguard здесь:
https://developers.google.com/android/guides/setup
Настройка поведения при открытии уведомления
Anchor link toЕсли вам нужно программно выбирать, какую activity отображать в результате push-уведомления, вы можете создать кастомный NotificationServiceExtension и включить полное имя класса вашего NotificationServiceExtension в метаданные под значением com.pushwoosh.notification_service_extension
.
<meta-data android:name="com.pushwoosh.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(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());
context.startActivity(launchIntent); }}
Кастомизация push-уведомлений
Anchor link toЧтобы настроить внешний вид push-уведомлений, вам необходимо создать кастомную фабрику. Вы можете создать кастомный NotificationFactory и включить полное имя класса вашего NotificationFactory в метаданные под значением com.pushwoosh.notification_factory
.
<meta-data android:name="com.pushwoosh.notification_factory" android:value="com.your.package.YourNotificationFactory" />
public class YourNotificationFactory extends PushwooshNotificationFactory { @Override public Notification onGenerateNotification(@NonNull PushMessage pushMessage) { if (customNotification) { // TODO: сгенерируйте и верните кастомное уведомление }
// вернуть стандартное уведомление Pushwoosh return super.onGenerateNotification(pushMessage); }}
Кастомизация сводки группы
Anchor link toЧтобы настроить внешний вид сводки группы, создайте кастомную фабрику. Вы можете создать кастомный SummaryNotificationFactory и включить полное имя класса вашего SummaryNotificationFactory в метаданные под значением com.pushwoosh.summary_notification_factory
.
<meta-data android:name="com.pushwoosh.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() { // верните желаемый идентификатор ресурса иконки return super.summaryNotificationIconResId(); }}
URL приватной конечной точки
Anchor link toPushwoosh предоставляет приватные конечные точки для клиентов с подпиской по тарифу Custom Plan. Чтобы настроить приватную конечную точку для Android SDK, вам нужно добавить следующее в ваш файл AndroidManifest.xml:
<meta-data android:name="com.pushwoosh.base_url" android:value="PUSHWOOSH_PRIVATE_ENDPOINT_URL_PROVIDED" />
Создание очереди Rich Media
Anchor link toЕсли необходимо одновременно отобразить несколько Rich Media страниц (например, триггерные события для двух или более In-App сообщений происходят в один момент, или Rich Media страница уже отображается в момент возникновения другого триггерного события), вы можете настроить очередь для отображения Rich Media страниц. Чтобы создать очередь, добавьте следующий код в ваш проект:
package com.pushwoosh.testingapp;
import com.pushwoosh.RichMediaManager;import com.pushwoosh.exception.PushwooshException;import com.pushwoosh.richmedia.RichMediaPresentingDelegate;import com.pushwoosh.richmedia.RichMedia;import com.pushwoosh.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-уведомление с кастомным звуком
Anchor link to- Поместите ваш аудиофайл в соответствующую папку. Для нативного фреймворка Android ваши файлы должны быть размещены в папке
/app/src/main/res/raw
.
2. Создайте Канал уведомлений.
3. Выберите звук при настройке push-сообщения.

4. Установите Канал уведомлений, к которому будет принадлежать сообщение. Для этого укажите следующее в поле «Android root params»:{"pw_channel": "НАЗВАНИЕ КАНАЛА PUSH-УВЕДОМЛЕНИЙ"} //``
здесь вам нужно указать имя для вашего канала с кастомным звуком
В случае использования remote API, установите параметры следующим образом в вашем /createMessage API-запросе:
"android_root_params": {"pw_channel": "push"} // здесь вам нужно указать имя для вашего канала с кастомным звуком, например, "push" для уведомлений со звуком push.wav."android_sound": "push" // здесь вы должны указать имя файла без расширения
Как только вы отправите push с указанными параметрами, Канал уведомлений с выбранным звуком будет создан для всех устройств с Android 8+.
Теперь, чтобы отправить push с кастомным звуком, вам нужно указать только канал, связанный с этим звуком.
Правила Proguard для кастомных звуков уведомлений
Anchor link toЕсли ваше приложение использует 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
Anchor link toЧтобы установить флаг, вам нужно добавить блок метаданных в ваш файл AndroidManifest.xml внутри тега application. Например, если вы хотите установить ID приложения Pushwoosh, добавьте следующий код в ваш файл AndroidManifest.xml:
<meta-data android:name="com.pushwoosh.appid" android:value="XXXXX-XXXXX" />
Флаг | Описание | Возможные значения |
---|---|---|
com.pushwoosh.appid | Устанавливает ID приложения Pushwoosh. | XXXXX-XXXXX |
com.pushwoosh.senderid | Устанавливает ID отправителя проекта Firebase. | 123456789000 |
com.pushwoosh.log_level | Устанавливает уровень логирования. Подробнее см. в разделе Управление уровнем логирования. | NONE / ERROR / WARN / INFO / DEBUG (по умолчанию) / NOISE |
com.pushwoosh.base_url | Переопределяет базовый URL сервера Pushwoosh. | https://cp.pushwoosh.com/json/1.3/ (по умолчанию) |
com.pushwoosh.notification_service_extension | Кастомный NotificationServiceExtension. Подробнее см. в разделе Настройка поведения при открытии уведомления. | com.myapp.MyNotificationServiceExtension |
com.pushwoosh.notification_factory | Кастомный NotificationFactory. Подробнее см. в разделе Кастомизация push-уведомлений. | com.myapp.MyNotificationFactory |
com.pushwoosh.summary_notification_factory | Кастомный SummaryNotificationFactory. | com.myapp.MySummaryNotificationFactory |
com.pushwoosh.multi_notification_mode | Если true, уведомления будут сгруппированы. Если false, будет отображаться только последнее полученное уведомление. | true / false (по умолчанию) |
com.pushwoosh.allow_server_communication | Если true, SDK разрешено отправлять сетевые запросы на серверы Pushwoosh. | true (по умолчанию) / false |
com.pushwoosh.handle_notifications_using_workmanager | Если true, для обработки уведомлений устанавливается WorkManager. | true / false (по умолчанию) |
com.pushwoosh.notification_icon | Имя ресурса для кастомной (маленькой) иконки уведомления. Если null, будет использоваться иконка приложения по умолчанию. | res/drawable-xxhdpi-v11/notification_small_icon.png / null |
com.pushwoosh.notification_icon_color | Цвет фона (маленькой) иконки уведомления. | #FFFFFF |
com.pushwoosh.allow_collecting_device_data | Если true, SDK разрешено собирать и отправлять данные устройства в Pushwoosh. | true (по умолчанию) / false |
com.pushwoosh.allow_collecting_device_os_version | Если true, SDK разрешено собирать и отправлять версию ОС устройства в Pushwoosh. | true (по умолчанию) / false |
com.pushwoosh.allow_collecting_device_locale | Если true, SDK разрешено собирать и отправлять локаль устройства в Pushwoosh. | true (по умолчанию) / false |
com.pushwoosh.allow_collecting_device_model | Если true, SDK разрешено собирать и отправлять модель устройства в Pushwoosh. | true (по умолчанию) / false |
com.pushwoosh.in_app_business_solutions_capping | Ограничивает количество показов In-App сообщения push-unregister в день. | 1 (по умолчанию), 2, …, n |
com.pushwoosh.start_foreground_service | Если true, Foreground Service запускается вместе с вызовом PushwooshLocation.startLocationTracking() | true / false (по умолчанию) |
com.pushwoosh.foreground_service_notification_text | Устанавливает текст уведомления, создаваемого при запуске Foreground Service для ключа “com.pushwoosh.start_foreground_service”. | Work in progress (по умолчанию) |
com.pushwoosh.foreground_service_notification_channel_name | Устанавливает имя канала для уведомления, создаваемого при запуске Foreground Service для ключа “com.pushwoosh.start_foreground_service”. | Foreground service (по умолчанию) |
com.pushwoosh.trusted_package_names | Разрешает совместное использование Pushwoosh HWID с указанным пакетом | ”com.mycompany.myapp1, com.mycompany.myapp2” |
Удаление push-уведомлений через TTL (Time-To-Live)
Anchor link toЧтобы автоматически удалять push-уведомления по истечении заданного периода времени с помощью TTL (Time-to-Live), выполните следующие шаги:
Создайте кастомный NotificationFactory. Узнать больше
В методе
onGenerateNotification()
, создайте уведомление, используя классNotification.Builder
илиNotificationCompat.Builder
, и вызовите методsetTimeoutAfter
:
public class YourNotificationFactory extends PushwooshNotificationFactory {
@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(); }}
Поделитесь с нами своим мнением
Anchor link toВаши отзывы помогают нам делать наш продукт лучше, поэтому мы будем рады, если вы поделитесь с нами своим мнением в случае возникновения проблем в процессе интеграции SDK. Если вы столкнетесь с какими-либо трудностями, пожалуйста, не стесняйтесь поделиться своими мыслями с нами через эту форму.