Получение push-уведомлений на мобильных устройствах
Чтобы узнать больше об общем подходе к настройке push-уведомлений в Customer Insights - Journeys, см. обзор настройки push-уведомлений
Чтобы включить push-уведомления в Customer Insights - Journeys, вам необходимо выполнить следующие шаги:
- Конфигурация приложений для push-уведомлений
- Сопоставление пользователей для push-уведомлений
- Регистрация устройства для push-уведомлений
- Получение push-уведомлений на устройствах
- Отчетность по взаимодействиям для push-уведомлений
Важно
Чтобы отслеживать ссылки, которые получатели открывают в уведомлениях, необходимо получить согласие клиента на отслеживание. Узнайте больше о стратегиях сбора согласия клиентов в Customer Insights - Journeys: Обзор управления согласием
Если вы не получили согласие на отслеживание, вам необходимо использовать поле URL-адреса originalLink, описанное в приведенном ниже фрагменте кода. Если вы получили согласие, вы можете использовать значение поля link, которое можно отслеживать.
PushLinkClicked создается автоматически. URL-адрес представляет собой ссылку перенаправления, которая создает взаимодействие, если используется ссылка из поля link.
Получение push-уведомлений в iOS
1. Пример фрагмента кода для синтаксического анализа входящих уведомлений в 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];
}
}
Пример фрагмента кода для синтаксического анализа входящих уведомлений в iOS (версия 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. Пример фрагмента кода Swift для анализа входящих расширенных push-уведомлений в iOS (уведомление с изображением):
В дополнение к методу didReceive
в AppDelegate
нам нужно добавить NotificationExtension
для перехвата уведомления перед его отображением, загрузкой изображения и обогащения уведомления данными изображения. Чтобы узнать больше, см. раздел 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)
}
}
}
Получение уведомлений в Android
Пример фрагмента кода для синтаксического анализа входящих уведомлений в Android
Часть 1. Получение идентификатора отслеживания из сообщения уведомления
Заметка
Customer Insights - Journeys использует формат сообщения данных вместо формата уведомления. Для этого клиентское приложение должно проанализировать полезные данные, отправленные Customer Insights - Journeys, чтобы извлечь правильную ссылку (отслеживаемую или неотслеживаемую). Подробнее: Информация о сообщениях FCM
Переопределите метод OnMessageReceived
для FirebaseMessagingService
и извлеките необходимые данные из полезных данных, как показано:
@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");
}
}
Часть 2. Создание уведомления
Чтобы сгенерировать событие при открытии уведомления, создайте содержимое уведомления и добавьте идентификатор отслеживания в данные.
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;
}
}
Часть 3. Создание события открытия уведомления
Обработайте приложение, открытое через уведомление в MainActivity
, чтобы получить идентификатор отслеживания.
@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());