Personalizar o SDK do Android
Deep linking
Anchor link toNa sua atividade que irá lidar com o deep link, adicione a tag <data> com os parâmetros scheme, host e 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>No exemplo acima, o deep link abrirá a PromoActivity. A implementação básica abaixo exibe um alerta com o valor do id da promoção para fins de simplicidade. Na sua aplicação, ele poderia definitivamente fazer algo útil!
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(); }}Rastreamento de compras no aplicativo
Anchor link toSe você deseja rastrear compras no aplicativo em Jornadas do Cliente, configure o envio de informações de compra para a Pushwoosh chamando este método:
Pushwoosh.getInstance().sendInappPurchase(@NonNull String sku, @NonNull BigDecimal price, @NonNull String currency);Notificação push de Geozones
Anchor link toPara usar pushes de Geozone, adicione a biblioteca com.pushwoosh:pushwoosh-location e chame:
PushwooshLocation.startLocationTracking();No seu AndroidManifest.xml, inclua as permissões necessárias:
<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>Usando notificações locais com a Pushwoosh
Anchor link toSe você usa a API de Notificações Locais da Pushwoosh, adicione a permissão RECEIVE_BOOT_COMPLETED ao seu AndroidManifest.xml:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>xUsando o número de emblema no Android
Anchor link toA Pushwoosh suporta a configuração do número de emblema no atalho do ícone do aplicativo para os seguintes launchers do Android:
Sony, Samsung, LG, HTC, ASUS, ADW, APEX, NOVA, HUAWEI, ZUK, OPPO.
Para usar esta funcionalidade, basta adicionar a biblioteca com.pushwoosh:pushwoosh-badge à sua aplicação.
Abrindo atividade personalizada
Anchor link toSe você deseja iniciar uma atividade específica em resposta a notificações push, adicione o seguinte intent-filter a essa atividade:
<activity android:name="YourActivity"> <intent-filter> <action android:name="${applicationId}.MESSAGE"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter></activity>Controlando o Nível de Log
Anchor link toPara auxiliar na depuração e integração, o SDK imprimirá todas as solicitações no console por padrão. Quando estiver pronto para a compilação de produção, adicione os metadados com.pushwoosh.log_level com o valor “ERROR” ao AndroidManifest.xml. Desta forma, apenas informações sobre erros irão para o console. Outra opção pode ser uma das seguintes:
NONE - Nenhum log do SDK
ERROR - Exibir apenas erros no console
WARN - Exibir também avisos
INFO - Exibir mensagens informativas
DEBUG - Até mesmo informações de depuração são exibidas agora
NOISE - Tudo que o SDK pode imprimir e mais
<meta-data android:name="com.pushwoosh.log_level" android:value="ERROR" />Usando o Proguard
Anchor link toAo usar o Proguard, adicione as seguintes opções:
-keep class com.pushwoosh.** { *; }-dontwarn com.pushwoosh.**Veja os requisitos da biblioteca Google Play Services em relação ao Proguard aqui:
https://developers.google.com/android/guides/setup
Personalizando o comportamento de abertura de notificação
Anchor link toSe você precisar selecionar programaticamente qual atividade exibir como resultado de uma notificação push, você pode criar um NotificationServiceExtension personalizado e incluir o nome de classe totalmente qualificado do seu NotificationServiceExtension nos metadados sob o valor 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() starts default launcher activity // or activity marked with ${applicationId}.MESSAGE action. // Simply do not call it to override this behaviour. // super.startActivityForPushMessage(message);
// start your activity instead: Intent launchIntent = new Intent(getApplicationContext(), YourActivity.class); launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
// (Optional) pass notification data to Activity launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());
context.startActivity(launchIntent); }}Personalizando notificações push
Anchor link toPara personalizar a visualização das notificações push, você precisa criar uma Factory personalizada. Você pode criar uma NotificationFactory personalizada e incluir o nome de classe totalmente qualificado da sua NotificationFactory nos metadados sob o valor 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: generate and return custom notification }
// return default Pushwoosh notification return super.onGenerateNotification(pushMessage); }}Personalizando o resumo do grupo
Anchor link toPara personalizar a aparência de um resumo de grupo, crie uma Factory personalizada. Você pode criar uma SummaryNotificationFactory personalizada e incluir o nome de classe totalmente qualificado da sua SummaryNotificationFactory nos metadados sob o valor 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 the message you want return super.summaryNotificationMessage(notificationsAmount); } @Override public int summaryNotificationIconResId() { // return the icon resource id you want return super.summaryNotificationIconResId(); }}URL de endpoint privado
Anchor link toA Pushwoosh fornece endpoints privados para clientes com assinaturas do Plano Personalizado. Para configurar um endpoint privado para o SDK do Android, você precisa adicionar o seguinte ao seu arquivo AndroidManifest.xml:
<meta-data android:name="com.pushwoosh.base_url" android:value="PUSHWOOSH_PRIVATE_ENDPOINT_URL_PROVIDED" />Criando uma fila de Rich Media
Anchor link toCaso haja várias páginas de Rich Media para exibir simultaneamente (por exemplo, eventos de gatilho para dois ou mais In-Apps ocorrem em um momento, ou uma página de Rich Media já está sendo exibida no momento em que um evento de gatilho diferente ocorre), você pode configurar uma fila para a exibição de páginas de Rich Media. Para criar uma fila, adicione o seguinte código ao seu projeto:
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 com som personalizado
Anchor link to- Coloque seu arquivo de áudio na pasta apropriada. Para o framework nativo do Android, seus arquivos devem ser colocados na pasta
/app/src/main/res/raw.
2. Crie um Canal de Notificação.
3. Selecione um som ao configurar uma mensagem push.

4. Defina o Canal de Notificação ao qual a mensagem pertencerá. Para fazer isso, especifique o seguinte no campo “Parâmetros raiz do Android”:{"pw_channel": "NOME DO CANAL DE NOTIFICAÇÃO PUSH"} //`` aqui você precisa especificar o nome do seu canal com som personalizado
No caso de usar a API remota, defina os parâmetros da seguinte forma em sua solicitação da API /createMessage:
"android_root_params": {"pw_channel": "push"} // aqui você precisa especificar o nome do seu canal com som personalizado, por exemplo, "push" para as notificações com som push.wav."android_sound": "push" // aqui você deve especificar o nome do arquivo sem extensãoDepois de enviar o push com esses parâmetros especificados, o Canal de Notificação com o som selecionado é criado para todos os dispositivos com Android 8+.
Agora, para enviar o push com um som personalizado, você precisa especificar apenas o canal associado a esse som.
Regras do Proguard para sons de notificação personalizados
Anchor link toSe seu aplicativo usa o proguard para encolhimento de código e recursos, é importante manter seus arquivos de som intactos e disponíveis para bibliotecas externas. Se você usar a propriedade minifyEnabled = true no seu build.gradle, adicione as seguintes regras ao seu proguard-rules.pro:
-keep public class your.package.name.R$raw { *;}Se você encolher os recursos do seu aplicativo além do encolhimento de código usando a propriedade shrinkResources=true, você deve especificar adicionalmente quais recursos deseja manter. Para fazer isso, crie um novo arquivo XML com qualquer nome, salve-o em algum lugar do seu projeto (por exemplo, em res/xml) e especifique os nomes dos recursos sob o parâmetro tools:keep na tag resources:
<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@raw/*"/>Lista completa de flags de metadados do SDK do Android
Anchor link toPara configurar uma flag, você precisa adicionar o bloco de metadados ao seu arquivo AndroidManifest.xml dentro da tag application. Por exemplo, se você quiser definir o ID da aplicação Pushwoosh, adicione o seguinte código ao seu arquivo AndroidManifest.xml:
<meta-data android:name="com.pushwoosh.appid" android:value="XXXXX-XXXXX" />| Flag | Descrição | Valores possíveis |
|---|---|---|
| com.pushwoosh.appid | Define o ID da aplicação Pushwoosh. | XXXXX-XXXXX |
| com.pushwoosh.senderid | Define o ID do remetente do projeto Firebase. | 123456789000 |
| com.pushwoosh.log_level | Define o nível de log. Para detalhes, consulte Controlando o Nível de Log. | NONE / ERROR / WARN / INFO / DEBUG (padrão) / NOISE |
| com.pushwoosh.base_url | Substitui a URL base do servidor Pushwoosh. | https://cp.pushwoosh.com/json/1.3/ (padrão) |
| com.pushwoosh.notification_service_extension | NotificationServiceExtension personalizado. Para detalhes, consulte Personalizando o comportamento de abertura de notificação. | com.myapp.MyNotificationServiceExtension |
| com.pushwoosh.notification_factory | NotificationFactory personalizado. Para detalhes, consulte Personalizando notificações push. | com.myapp.MyNotificationFactory |
| com.pushwoosh.summary_notification_factory | SummaryNotificationFactory personalizado. | com.myapp.MySummaryNotificationFactory |
| com.pushwoosh.multi_notification_mode | Se verdadeiro, as notificações serão agrupadas. Se falso, apenas a última notificação recebida será exibida. | true / false (padrão) |
| com.pushwoosh.allow_server_communication | Se verdadeiro, o SDK tem permissão para enviar solicitações de rede para os servidores da Pushwoosh. | true (padrão) / false |
| com.pushwoosh.handle_notifications_using_workmanager | Se verdadeiro, o WorkManager é configurado para lidar com notificações. | true / false (padrão) |
| com.pushwoosh.notification_icon | Nome do recurso do ícone de notificação personalizado (pequeno). Se nulo, o ícone padrão da aplicação será usado. | res/drawable-xxhdpi-v11/notification_small_icon.png / null |
| com.pushwoosh.notification_icon_color | Cor de fundo do ícone de notificação (pequeno). | #FFFFFF |
| com.pushwoosh.allow_collecting_device_data | Se verdadeiro, o SDK tem permissão para coletar e enviar dados do dispositivo para a Pushwoosh. | true (padrão) / false |
| com.pushwoosh.allow_collecting_device_os_version | Se verdadeiro, o SDK tem permissão para coletar e enviar a versão do SO do dispositivo para a Pushwoosh. | true (padrão) / false |
| com.pushwoosh.allow_collecting_device_locale | Se verdadeiro, o SDK tem permissão para coletar e enviar a localidade do dispositivo para a Pushwoosh. | true (padrão) / false |
| com.pushwoosh.allow_collecting_device_model | Se verdadeiro, o SDK tem permissão para coletar e enviar o modelo do dispositivo para a Pushwoosh. | true (padrão) / false |
| com.pushwoosh.in_app_business_solutions_capping | Limita o número de vezes que o In-App push-unregister pode ser exibido em um dia. | 1 (padrão), 2, …, n |
| com.pushwoosh.start_foreground_service | Se verdadeiro, o Serviço em Primeiro Plano é iniciado junto com a chamada PushwooshLocation.startLocationTracking() | true / false (padrão) |
| com.pushwoosh.foreground_service_notification_text | Define o texto de uma notificação criada quando o Serviço em Primeiro Plano é iniciado para a chave “com.pushwoosh.start_foreground_service”. | Trabalho em andamento (padrão) |
| com.pushwoosh.foreground_service_notification_channel_name | Define o nome do canal para a notificação criada quando o Serviço em Primeiro Plano é iniciado para a chave “com.pushwoosh.start_foreground_service”. | Serviço em primeiro plano (padrão) |
| com.pushwoosh.trusted_package_names | Permite compartilhar o HWID da Pushwoosh com o pacote especificado | ”com.mycompany.myapp1, com.mycompany.myapp2” |
Excluindo Notificações Push via TTL (Time-To-Live)
Anchor link toPara excluir automaticamente notificações push após um período de tempo especificado usando TTL (Time-to-Live), siga estes passos:
-
Crie uma NotificationFactory personalizada. Saiba mais
-
No método
onGenerateNotification(), crie uma notificação usando a classeNotification.BuilderouNotificationCompat.Buildere chame o métodosetTimeoutAfter:
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) // rest of your notification creation code .setTimeoutAfter(timeout) // tempo em milissegundos antes que a notificação seja cancelada .build(); }}Compartilhe Seu Feedback Conosco
Anchor link toSeu feedback nos ajuda a criar uma experiência melhor, então adoraríamos ouvir de você se tiver algum problema durante o processo de integração do SDK. Se você enfrentar alguma dificuldade, não hesite em compartilhar suas ideias conosco através deste formulário.