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:
- Configuração do aplicativo de notificação por push
- Mapeamento de usuário para notificações por push
- Registro do dispositivo para notificações por push
- Recebimento de notificações por push em dispositivos
- 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());