--- title: "Tratamento personalizado de mensagens" slug: "mobile-message-custom-handling" updated: 2026-06-12T10:30:57Z published: 2026-06-12T10:30:57Z canonical: "docs.xtremepush.com/mobile-message-custom-handling" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.xtremepush.com/llms.txt > Use this file to discover all available pages before exploring further. # Tratamento personalizado de mensagens Com o Xtremepush SDK, você, como desenvolvedor, tem um retorno unificado para todas as interações do usuário com mensagens. Você pode usá-lo para implementar qualquer lógica de negócio se o mecanismo padrão de deep linking não for suficiente. ## iOS ### Objective-C A interação do usuário é descrita com o `XPMessageResponse` modelo. Ele contém: - XPMessage *mensagem - XPAction *ação XPMessage contém: - XPMessageType *tipo - tipo de mensagem, um dos: - XPMessageType_Push - XPMessageType_Inapp - XPMessageType_Inbox - NSString *identificador - ID da mensagem - NSString *campaignIdentifier - ID da campanha - NSString *título - título da mensagem - NSString *texto - texto de mensagem - NSDictionary *dados - cargas úteis personalizadas - NSDictionary *payload - carga útil de mensagem bruta XPAction contém: - XPActionType *tipo - tipo de resposta, um dos: - XPActionType_Click - XPActionType_Dismiss - XPActionType_Present - NSString *identificador - identificador de ação (como ID de botão, opcional) Veja como registrar o manipulador: ```objectivec [XPush registerMessageResponseHandler:^(XPMessageResponse *response) {    switch (response.action.type) {        case XPActionType_Click:            // Logic when message is clicked            break;        case XPActionType_Dismiss:            // Logic when message is dismissed            break;        case XPActionType_Present:            // Logic when message is received in foreground            break;    } }]; ``` > [!NOTE] > Se você usa notificações interativas e quer lidar com cliques de botão em segundo plano, precisa garantir que use um método com um handler de completação: ```objectivec [XPush registerMessageResponseHandlerWithCompletion:^(XPMessageResponse * _Nonnull x, XPMessageCompletionBlock  _Nonnull completionHandler) {    if (response.action.type == XPActionType_Click) {            if (response.action.identifier == @"like") {                   // Like article asynchronously and call completionHandler when finished                   [self likeArticle: response.message.data[@"articleId"] completionHandler: completionHandler];                   return;            }    }    // If nothing to be done    completionHandler(); }]; ``` Abaixo está um exemplo completo de tratamento personalizado de notificações. Ele faz várias coisas: - Mostra um diálogo personalizado quando uma mensagem push é recebida em primeiro plano - Abre uma página de artigo quando uma mensagem é clicada - Salva as informações quando um dos botões da mensagem é clicado ```objectivec [XPush registerMessageResponseHandlerWithCompletion: ^(XPMessageResponse * _Nonnull response, XPMessageCompletionBlock  _Nonnull completionHandler) {                switch (response.action.type) {            // When message is received in foreground            case XPActionType_Present:                // Show an article dialog with "View" button                [self showArticleDialog: response.message viewButtonCallback: ^{                    // Report message as clicked                    [XPush reportMessageClicked:response.message];                    // Navigate to article page                    [self openArticle: x.message.data[@"articleId"]];                }];                break;                            // When message is clicked            case XPActionType_Click:                // Default click action                if (response.action.identifier == nil) {                    // Navigate to the article page                    [self openArticle: response.message.data[@"articleId"]];                }                // Action for a certain button click                else {                    switch(response.action.identifier) {                        case "like":                              // Like article asynchronously and call completionHandler when finished                              [self likeArticle: response.message.data[@"articleId"] completionHandler: completionHandler];                              return;                    }                }                break;        }            completionHandler(); }]; ``` ### Marque uma mensagem como aberta Os`reportMessageOpened`e `reportMessageClickedfunction` são adições ao SDK que permitem aos desenvolvedores implementar o recurso de marcar uma mensagem como aberta ou clicada quando um usuário a abre ou clica nela dentro de sua aplicação. Essa função é especialmente útil para aumentar o engajamento do usuário e fornecer feedback em tempo real sobre interações de mensagens. Quando chamado, ele aciona um evento dentro do SDK que registra a mensagem como aberta ou clicada, dependendo da função utilizada, para fins de rastreamento e análise. Desenvolvedores podem facilmente integrar essa função ao fluxo de trabalho de gerenciamento de mensagens de seus aplicativos para melhorar a experiência do usuário e obter insights sobre padrões de engajamento do usuário. **Swift** ```swift reportMessageOpened(_ message: XPMessage!, actionIdentifier: String!) reportMessageOpened(_ message: XPMessage!, context: [AnyHashable : Any]!) ``` **Objective-C** ```objectivec + (void)reportMessageOpened:(XPMessage *)message context:(NSDictionary *)context + (void)reportMessageOpened:(XPMessage *)message actionIdentifier:(NSString*)actionIdentifier                                                           ``` **Swift** ```swift reportMessageClicked(_ message: XPMessage!, actionIdentifier: String!) reportMessageClicked(_ message: XPMessage!, context: [AnyHashable : Any]!) ``` **Objective-C** ```objectivec + (void)reportMessageClicked:(XPMessage *)message context:(NSDictionary*)context; + (void)reportMessageClicked:(XPMessage *)message actionIdentifier:(NSString*)actionIdentifier; ``` > [!TIP] > Mensagens clicadas serão consideradas abertas > > Marcar uma mensagem como clicada usando o método descrito automaticamente a marca como aberta, pois o usuário não pode clicar na mensagem sem abri-la primeiro. No entanto, marcar uma mensagem como aberta não atualiza automaticamente o valor de clique, pois um usuário pode abrir uma mensagem e não interagir com nenhum dos CTAs dentro dela. ### Swift A interação do usuário é descrita com o modelo XPMessageResponse. Ele contém: - mensagem: XPMessage - ação: XPAction XPMessage contém: - tipo: XPMessageTipo - tipo de mensagem, um dos: - XPMessageType_Push - XPMessageType_Inapp - XPMessageType_Inbox - identificador: String - ID da mensagem - campaignIdentifier: String - ID da campanha - título: String - título da mensagem - texto: String - texto da mensagem - data: [AnyHashable : Qualquer]? - cargas úteis personalizadas - payload: [AnyHashable : Any] - payload de mensagem bruta XPAction contém: - tipo: XPActionType - tipo de resposta, um dos: - XPActionType_Click - XPActionType_Dismiss - XPActionType_Present - identificador: String - identificador de ação (como ID de botão, opcional) Veja como registrar o manipulador: ```swift XPush.registerMessageResponseHandler({(_ response: XPMessageResponse) -> Void in    switch response.action.type {        case XPActionType_Click:            // Logic when message is clicked        case XPActionType_Dismiss:            // Logic when message is dismissed        case XPActionType_Present:            // Logic when message is received in foreground    } }) ``` > [!NOTE] > Se você usa notificações interativas e quer lidar com cliques de botão em segundo plano, precisa garantir que use um método com um handler de completamento: ```swift XPush.registerMessageResponseHandler(withCompletion: {(_ x: XPMessageResponse, _ completionHandler: XPMessageCompletionBlock) -> Void in    if response.action.type == XPActionType_Click {        if response.action.identifier == "like" {            // Like article asynchronously and call completionHandler when finished            self.likeArticle(response.message.data["articleId"], completionHandler: completionHandler)            return        }    }    // If nothing to be done    completionHandler() }) ``` Abaixo está um exemplo completo de tratamento personalizado de notificações. Ele faz várias coisas: - Mostra um diálogo personalizado quando uma mensagem push é recebida em primeiro plano - Abre uma página de artigo quando uma mensagem é clicada - Salva as informações quando um dos botões da mensagem é clicado ```swift XPush.registerMessageResponseHandler(withCompletion: {(_ x: XPMessageResponse, _ completionHandler: XPMessageCompletionBlock) -> Void in   if response.action.type == XPActionType_Present {                showArticleDialog(response.message, viewButtonCallback: {() -> Void in                    // Report message as clicked                    XPush.reportMessageClicked(response.message)                    // Navigate to article page                    self.openArticle(x.message.data["articleId"])                })            }            else if response.action.type == XPActionType_Click {                // Default click action                if response.action.identifier == nil {                    // Navigate to the article page                    openArticle(response.message.data["articleId"])                }                    // Action for a certain button click                else {                    if response.action.identifier == "like" {                        // Like article asynchronously and call completionHandler when finished                        self.likeArticle(response.message.data["articleId"], completionHandler: completionHandler)                    }                }            }                        // If nothing to be done            completionHandler() }) ``` ## Android A interação do usuário é descrita com os objetos - Mensagem mensagem Carga Útil - HashMap responsePayload A mensagem contém: - Tipo de string - tipo de mensagem, uma dessas: - "Empurre" - "inapp" - "caixa de entrada" - ID de string - ID de mensagem - String campaignId - ID de campanha - Título da string - título da mensagem - Texto em cadeia de texto e texto de mensagem - HashMap dados - payloads personalizados o HashMap do responsePayload contém: - Tipo de string - tipo de resposta, um dos: - "presente" - "click" - "Dispensar" - String action- identificador de ação (como ID de botão, opcional) Implemente o MessageResponseListener na sua Application.java classe ```java public class YOUR_APPLICATION_CLASS extends Application implements MessageResponseListener { ``` Depois, implemente o método ```plaintext @Override    public void messageResponseReceived(Message messagePayload,            HashMap responsePayload,            WeakReference uiReference) {            } ``` Depois, adicione a `setMessageResponseListener` opção à sua inicialização do `PushConnector`: ```java new PushConnector.Builder(XPUSH_APP_KEY, GOOGLE_PROJECT_NUMBER)            .setMessageResponseListener(this)            ...            .create(this); ``` Abaixo está um exemplo completo de tratamento personalizado de notificações. Ele faz várias coisas: - Mostra um diálogo personalizado quando uma mensagem push é recebida em primeiro plano - Abre uma página de artigo quando uma mensagem é clicada - Salva as informações quando um dos botões da mensagem é clicado ```java @Override    public void messageResponseReceived(final Message messagePayload,            HashMap responsePayload,            final WeakReference uiReference) {        switch (responsePayload.get("type")) {            // When app is received in the foreground show a custom notification            case "present":                if (uiReference != null && uiReference.get() != null) {                    ((Activity) uiReference.get()).runOnUiThread(new Runnable() {                        @Override                        public void run() {                            AlertDialog.Builder builder = new AlertDialog.Builder((Activity) uiReference.get());                            builder.setPositiveButton("View", new DialogInterface.OnClickListener() {                                public void onClick(DialogInterface dialog, int id) {                                    //go to article id                                    openArticle(messagePayload.data.get("articleId"));                                }                            });                            builder.setMessage(messagePayload.text);                            builder.setTitle(messagePayload.title);                            AlertDialog dialog = builder.create();                            dialog.show();                        }                    });                }                break;            //when message is clicked            case "click":                //default click action                if (!(responsePayload.containsKey("action"))) {                    //navigate to article                    openArticle(messagePayload.data.get("articleId"));                }                //action for a certain button click                else {                    switch (responsePayload.get("action")) {                        case "like":                            //like article                            likeArticle(messagePayload.data.get("articleId"));                            break;                    }                }                break;        }    } ``` ### Marque uma mensagem como aberta Assim como no iOS, os`reportMessageOpened`e `reportMessageClickedfunction` são adições ao SDK que permitem aos desenvolvedores implementar o recurso de marcar uma mensagem como aberta ou clicada quando um usuário abre ou clica nela dentro do aplicativo. Essa função é especialmente útil para aumentar o engajamento do usuário e fornecer feedback em tempo real sobre interações de mensagens. Quando chamado, ele aciona um evento dentro do SDK que registra a mensagem como aberta ou clicada, dependendo da função utilizada, para fins de rastreamento e análise. Os desenvolvedores podem facilmente integrar essa função ao fluxo de trabalho de tratamento de mensagens da aplicação para melhorar a experiência do usuário e obter insights sobre padrões de engajamento do usuário. ```java reportMessageOpened(message, action, null); reportMessageOpened(Message message, String action, JSONObject message_context) ``` ```java reportMessageClicked(message, action, null); reportMessageClicked(Message message, String action, JSONObject message_context) ``` > [!TIP] > Mensagens clicadas serão consideradas abertas > > Marcar uma mensagem como clicada usando o método descrito automaticamente a marca como aberta, pois o usuário não pode clicar na mensagem sem abri-la primeiro. No entanto, marcar uma mensagem como aberta não atualiza automaticamente o valor de clique, pois um usuário pode abrir uma mensagem e não interagir com nenhum dos CTAs dentro dela.