Compartilhar via


Recebimento de notificações por push em dispositivos móveis

Para saber mais sobre a abordagem geral para configurar notificações por push no Customer Insights - Journeys, visite a visão geral de configuração da notificação por push

Para habilitar notificações por push no Customer Insights - Journeys, você precisa concluir as seguintes etapas:

  1. Configuração do aplicativo de notificação por push
  2. Mapeamento de usuário para notificações por push
  3. Registro do dispositivo para notificações por push
  4. Recebimento de notificações por push em dispositivos
  5. Relatório de interação para notificações por push

Importante

Para rastrear os links que os destinatários abrem nas notificações, você deve coletar o consentimento de rastreamento do cliente. Saiba mais sobre estratégias para obter consentimento do cliente no Customer Insights - Journeys: Visão geral do gerenciamento de consentimento

Se não tiver obtido consentimento de rastreamento, você deverá usar o campo de URL originalLink descrito no trecho de código abaixo. Se tiver obtido consentimento, você poderá usar o valor de campo link, que é rastreável.

PushLinkClicked é gerado automaticamente. A URL é um link de redirecionamento que vai criar a interação se o link do campo link for usado.

Receber notificações de mensagem por push no iOS

1. Trecho de código de exemplo para analisar as notificações recebidas no iOS:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{

// Print full message
    NSString *urlString = [[userInfo valueForKey:@"data"] valueForKey:@"link"];
    NSString *originalUrlString = [[userInfo valueForKey:@"data"] valueForKey:@"originalLink"];
    NSString *trackingIdString = [[userInfo valueForKey:@"data"] valueForKey:@"trackingId"];
    
    if(![urlString isEqual:[NSNull null]])
    {
        if([urlString length] != 0)
        {
            [self createInteraction:[NSNumber numberWithInt:0] stringTracking:trackingIdString];
            
            NSURL *url = [NSURL URLWithString:urlString];
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10) {
                
// iOS 10 and above
                [[UIApplication sharedApplication] openURL:url options:[NSDictionary dictionary] completionHandler:nil];
            }
            else
            {
                [[UIApplication sharedApplication] openURL:url]; // iOS <10
            }
        }
    }
    else
    {
        [self createInteraction:[NSNumber numberWithInt:1] stringTracking:trackingIdString];
    }
}

Trecho de código de exemplo para analisar as notificações recebidas no iOS (versão Swift):

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse,  withCompletionHandler completionHandler: @escaping () -> Void) { 

        let userInfo = response.notification.request.content.userInfo 
        let data = userInfo["data"] as? [String:Any] ?? [:]; 
        print("User info \(userInfo)") 
        let urlString = data["link"] as? String; 
        let trackingIdString = data["trackingId"] as? String; 

        if(urlString != nil && !urlString!.isEmpty) 
        { 

            self.createInteraction(typeInteraction:0, trackingId:trackingIdString ?? ""); 

            if let url = URL(string: urlString ?? ""), UIApplication.shared.canOpenURL(url) { 

                UIApplication.shared.open(url) 
            } 
        } 
        else 
        { 
            self.createInteraction(typeInteraction:1, trackingId:trackingIdString ?? ""); 
        } 
        // Always call the completion handler when done. 
        completionHandler() 
    } 

2. Trecho de código Swift de exemplo para analisar as notificações por push sofisticadas recebidas no iOS (notificação com imagem):

Além do método didReceive em AppDelegate, precisamos adicionar NotificationExtension para interceptar a notificação antes de ser exibida, baixar a imagem e enriquecer a notificação com os dados da imagem. Saiba mais: UNNotificationServiceExtension

class NotificationService: UNNotificationServiceExtension { 
    var contentHandler: ((UNNotificationContent) -> Void)? 
    var content: UNMutableNotificationContent? 
    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { 
        self.contentHandler = contentHandler 
        self.content        = (request.content.mutableCopy() as? UNMutableNotificationContent) 
        if let bca = self.content { 
            func save(_ identifier: String, 
                      data: Data, options: [AnyHashable: Any]?) -> UNNotificationAttachment? { 
                    let directory = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(ProcessInfo.processInfo.globallyUniqueString, isDirectory: true) 
                    do { 
                        try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) 
                        let fileURL = directory.appendingPathComponent(identifier) 
                        try data.write(to: fileURL, options: []) 
                        return try UNNotificationAttachment.init(identifier: identifier, url: fileURL, options: options) 
                    } catch {} 
                    return nil 
            } 
            func exitGracefully(_ reason: String = "") { 
                let bca    = request.content.mutableCopy() as? UNMutableNotificationContent 
                bca!.title = reason 
                contentHandler(bca!) 
            }
            DispatchQueue.main.async { 
                guard let content = (request.content.mutableCopy() as? UNMutableNotificationContent) else { 
                    return exitGracefully() 
                } 
                let userInfo : [AnyHashable: Any] = request.content.userInfo; 
                let data = userInfo["data"] as? [String:Any] ?? [:]; 
                guard let attachmentURL = data["imageUrl"] as? String else { 
                    return exitGracefully() 
                } 
                guard let imageData = try? Data(contentsOf: URL(string: attachmentURL)!) else { 
                    return exitGracefully() 
                } 
                guard let attachment = save("image.png", data: imageData, options: nil) else { 
                    return exitGracefully() 
                } 
                content.attachments = [attachment] 
                contentHandler(content) 
            } 
        } 
    }   
    override func serviceExtensionTimeWillExpire() { 
        // Called just before the extension will be terminated by the system. 
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. 
        if let contentHandler = contentHandler, let bestAttemptContent =  content { 
            contentHandler(bestAttemptContent) 
        } 
    } 
}

Receber notificações no Android

Trecho de código de exemplo para analisar as notificações de entrada no Android

Parte 1: Obter a ID de rastreamento na mensagem da notificação

Observação

O Customer Insights - Journeys usa o formato da mensagem de dados, e não o formato da notificação. Isso exige que o aplicativo cliente analise o conteúdo de dados enviado pelo Customer Insights - Journeys para extrair o link correto (rastreado ou não rastreado). Saiba mais: Sobre mensagens FCM

Substitua o método OnMessageReceived de FirebaseMessagingService e extraia os dados necessários do conteúdo conforme mostrado:

@Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
         
// Not getting messages here? See why this may be: https://goo.gl/39bRNJ 
        Log.d(TAG, "From: " + remoteMessage.getFrom()); 
        String message = null; 
        String title = null; 
        String deepLink = null; 
        String name = null; 
        String trackingId = null; 

        String imageUrl = null; 
         
// Check if message contains a notification payload. 
        if (remoteMessage.getNotification() != null) { 
            message = remoteMessage.getNotification().getBody(); 
            title = remoteMessage.getNotification().getTitle(); 
        } 
         
// Check if message contains a data payload. 
        if (remoteMessage.getData().size() > 0) { 
            if (remoteMessage.getData().get("title") != null) { 
                title = remoteMessage.getData().get("title"); 
            } 
            if (remoteMessage.getData().get("body") != null) { 
                message = remoteMessage.getData().get("body"); 
            } 

if (remoteMessage.getData().get("imageUrl") != null) { 
    imageUrl = remoteMessage.getData().get("imageUrl"); 
} 

// If tracking consent has been taken, use link otherwise use 'originalLink' 
            if (remoteMessage.getData().get("link") != null) { 
                deepLink = remoteMessage.getData().get("link"); 
            } 
            if (remoteMessage.getData().containsKey("trackingId")) { 
                trackingId = remoteMessage.getData().get("trackingId"); 
            } 
        } 
        if (message != null || title != null) { 
            sendNotification(message, title, imageUrl, deepLink, name, trackingId); 
        } else { 
            Log.d(TAG, "Empty Notification Received"); 
        } 
    } 

Parte 2: Criar uma notificação

Para gerar o evento em notificação, abra e crie o conteúdo da notificação e adicione a ID de rastreamento nos dados.

private void sendNotification(String message, String title, String deeplink, String name, String trackingId) { 
    NotificationManager notificationManager = (NotificationManager) 
        this.getSystemService(Context.NOTIFICATION_SERVICE); 
 
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder( 
        this, 
        NOTIFICATION_CHANNEL_ID) 
        .setContentText(message) 
        .setContentTitle(title)              .setLargeIcon(getBitmapFromURL((imageUrl))) 
        .setPriority(NotificationCompat.PRIORITY_HIGH) 
        .setSmallIcon(android.R.drawable.ic_popup_reminder) 
        .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL) 
        .setContentIntent(createContentIntent(this, deeplink, name, trackingId)) 
        .setDeleteIntent(createOnDismissedIntent(this, trackingId)) 
        .setStyle(new NotificationCompat.BigTextStyle() 
            .bigText(message)); 
 
    notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); 
} 
 
private PendingIntent createOnDismissedIntent(Context context, String trackingId) { 
    Intent intent = new Intent(context, NotificationDismissalReceiver.class); 
    intent.putExtra("TrackingId", trackingId); 
 
    return PendingIntent.getBroadcast(context.getApplicationContext(),0, intent, 0); 
} 
 
private PendingIntent createContentIntent(Context context, String deeplink, String name, String trackingId) { 
    Intent intent; 
 
    if (deeplink != null) { 
        intent = new Intent(Intent.ACTION_VIEW, Uri.parse(deeplink)); 
    } else { 
        intent = new Intent(this, MainActivity.class); 
    } 
    Bundle pushData = new Bundle(); 
    pushData.putString("name", name); 
 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.putExtras(pushData); 
    intent.putExtra("Source", "Notification"); 
    intent.putExtra("TrackingId", trackingId); 
 
    return PendingIntent.getActivity(this, NOTIFICATION_ID, intent, PendingIntent.FLAG_ONE_SHOT); 
} 
 
public static Bitmap getBitmapFromURL(String src) { 
    try { 
        URL url = new URL(src); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setDoInput(true); 
        connection.connect(); 
        InputStream input = connection.getInputStream(); 
        Bitmap myBitmap = BitmapFactory.decodeStream(input); 
        return myBitmap; 
    } catch (IOException e) { 
        // Log exception 
        return null; 
    } 
} 

Parte 3: Gerar um evento de abertura da notificação

Abra o aplicativo por meio da notificação no MainActivity para obter a ID de rastreamento.

@Override
        protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        String source = getIntent().getStringExtra("Source"); 
        if (source != null && !source.isEmpty()) 
        { 
            String trackingId = getIntent().getStringExtra("TrackingId"); 
            EventTrackerClient.sendEventToServer(this.getApplicationContext(), trackingId, EventType.Opened); 
        } 
        checkPlayServices(); 
        FirebaseService.createChannelAndHandleNotifications(getApplicationContext());