Gerenciando notificações push em primeiro plano

Prev Next

Controle o que acontece quando uma notificação push móvel é recebida em primeiro plano

É importante definir o comportamento correto para a situação quando uma notificação push é recebida em primeiro plano. Você não quer interromper o fluxo de trabalho do usuário, mas ainda assim entregar informações importantes ao usuário.

Normalmente, você tem 3 opções para lidar com uma notificação push recebida em primeiro plano:

  • Mostrar a notificação no estilo do sistema operacional

  • Mostrar um diálogo personalizado

  • Ignore a notificação

O comportamento padrão no iOS é ignorar as notificações. O comportamento padrão no Android é mostrar a notificação no estilo do sistema operacional. Você pode encontrar informações sobre como mudar isso abaixo.

iOS

O comportamento padrão no iOS é não mostrar notificações em primeiro plano com alerta, som e distintivo. Se quiser mostrar notificações em primeiro plano, pode fazer o seguinte:

XPush.registerForegroundNotificationOptions { (message: XPMessageResponse) in
        return [.alert, .badge, .sound]
}
[XPush registerForegroundNotificationOptions:^XPNotificationType(XPMessage *message) {
    return XPNotificationType_Alert | XPNotificationType_Sound | XPNotificationType_Badge;
}];

Se você tem diferentes tipos de mensagens no seu app, talvez queira implementar um comportamento diferente para cada uma. Isso pode ser alcançado usando a seguinte lógica dentro da função:

XPush.registerForegroundNotificationOptions { (message: XPMessageResponse) in
    if x.message.data?["showMessage"] != nil {
        return [.alert, .sound, .badge]
    }
    return []
}
[XPush registerForegroundNotificationOptions:^XPNotificationType(XPMessage *message) {
    If (message.data[@"type"] == @"article") {
        return XPNotificationType_Alert | XPNotificationType_Sound | XPNotificationType_Badge;
    }
    return XPNotificationType_None;
}];

O método descrito acima (registerForegroundNotificationOptions) foi projetado para definir o comportamento das notificações padrão do iOS. Para implementar o comportamento personalizado (como diálogos personalizados), você deve usar outro método chamado message response handler:

XPush.registerMessageResponseHandler { (response: XPMessageResponse) in
    if response.action.type == .present {
        // Logic when message received in foreground
    }
}
[XPush registerMessageResponseHandler:^(XPMessageResponse *response) {
    if (response.action.type == XPActionType_Present) {
        // Logic when message received in foreground
    }
}];

Após mostrar um diálogo personalizado, você pode prosseguir programaticamente com a ação de clique da mensagem (por exemplo, abrir URL) quando o usuário clica em um botão:

XPush.click(response.message)
[XPush clickMessage:response.message actionIdentifier:nil]];

Você também pode rastrear a mensagem como clicada sem executar nenhuma ação (por exemplo, abrir URL):

XPush.reportMessageClicked(response.message)
[XPush reportMessageClick:response.message actionIdentifier:nil]];

Encontre um exemplo completo abaixo:

// Show OS notifications in foreground
XPush.registerForegroundNotificationOptions { (message :XPMessageResponse) in
    return [.alert, .sound, .badge]
}
// Register custom message handler
XPush.registerMessageResponseHandler { (response: XPMessageResponse) in
        if response.action.type == .present {
            // Show an article dialog with "View" button
            self.showArticleDialog(response.message, clickCallback: {
               XPush.clickMessage(response.message)
            })
        }
}
// Show OS notifications in foreground
[XPush registerForegroundNotificationOptions: ^XPNotificationType(XPMessageResponse *response) {
        return XPNotificationType_Alert | XPNotificationType_Sound | XPNotificationType_Badge;
}];
// Register custom message handler
[XPush registerMessageResponseHandler: ^(XPMessageResponse * _Nonnull response) {        
        if (response.action.type == XPActionType_Present) {
            // Show an article dialog with "View" button
            [self showArticleDialog: response.message viewButtonCallback: ^{
                // Process message click
                [XPush clickMessage:response.message actionIdentifier:nil];
            }];
        }
    }];

Android

No Android, ao inicializar PushConnector, você pode definir o comportamento para notificações em primeiro plano definindo .setShowForegroundNotifications() para ou true false (o valor padrão é true). Se configurado para false, as notificações não aparecerão enquanto seu app estiver em primeiro plano, a menos que você chame mPushConnector.showNotification()especificamente .

new PushConnector.Builder(XPUSH_APP_KEY, GOOGLE_PROJECT_NUMBER)
        .setShowForegroundNotifications(false)
        .create(this);

Agora, quando uma mensagem é recebida, você pode escolher como quer lidar com ela. Para isso, você usará o messageResponseReceived callback ( veja aqui para mais detalhes).

@Override
public void messageResponseReceived(Message messagePayload,
                                    HashMap<String, String> responsePayload,
                                    WeakReference<Context> uiReference) {

    if (responsePayload.get("responseType").equals("present")) {
        
    }
}

Algumas das funções úteis que você pode usar são:

  1. showNotification(). Para mostrar a notificação push:

    mPushConnector.showNotification(messagePayload);
  2. clickMessage(). Os parâmetros são a mensagem e a ação dessa mensagem para clicar. Se configurado como nulo, a ação padrão da notificação será usada. Então, se a mensagem tiver a ação de clique Abrir URL, *a URL será aberta no navegador do telefone.

    mPushConnector.clickMessage(messagePayload, null);
  3. reportMessageClicked. Os parâmetros são a mensagem a reportar como clicado e a ação a reportar como clicada (deve ser nula se não estiver usando notificações interativas).

    mPushConnector.reportMessageClicked(messagePayload, null);
  4. reportMessageDismissed. Os parâmetros são a mensagem a reportar como fechada e a ação a reportar como fechada (deve ser nula se não estiver usando notificações interativas)

    mPushConnector.reportMessageDismissed(messagePayload, null);