Otrzymywanie powiadomień push na urządzeniach przenośnych
Aby dowiedzieć się więcej o ogólnym podejściu do konfigurowania powiadomień push w Customer Insights - Journeys, odwiedź stronę omówienia konfiguracji powiadomień push
Aby włączyć powiadomienia push w Customer Insights - Journeys, należy obserwować następujące kroki:
- Konfigurowanie aplikacji powiadomienia push
- Mapowanie użytkownika na powiadomienia push
- Rejestracja urządzenia dla powiadomień push
- Otrzymywanie powiadomień push na urządzeniach
- Raportowanie interakcji w powiadomieniu push
Ważne
Aby śledzić łącza otwierane przez odbiorców w powiadomieniach, należy zebrać zgodę na śledzenie klientów. Więcej informacji o strategii zbierania zgody klienta w Customer Insights - Journeys: Omówienie zarządzania zgodę
Jeśli nie zebrano zgody na śledzenie, musisz użyć pola adres URL originalLink opisanego w poniższej wstawce kodu. W przypadku uzyskania zgody możesz użyć wartości pola link, którą można śledzić.
PushLinkClicked — ta wartość jest generowana automatycznie. Adres URL jest linkiem przekierowywania, który tworzy interakcję, jeśli jest używany z pola link.
Odbieranie powiadomień push dotyczących wiadomości w systemie iOS
1. Przykładowy kod wstawka do analizowania przychodzących powiadomień w systemie 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];
}
}
Przykładowy kod wstawka do analizowania przychodzących powiadomień w systemie iOS (wersja 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. Przykładowy fragment kodu Swift do analizowania przychodzących powiadomień push w systemie iOS (powiadomienie z obrazem):
Oprócz metody didReceive
w AppDelegate
, musimy dodać rozszerzenie NotificationExtension
, aby przechwycić powiadomienie przed jego wyświetleniem, pobrać obraz i wzbogacić powiadomienie o dane obrazu. Dowiedz się więcej: 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)
}
}
}
Otrzymuj powiadomienia w systemie Android
Przykładowy kod wstawka do analizowania przychodzących powiadomień w systemie Android
Część 1: Uzyskiwanie identyfikatora śledzenia z wiadomości powiadomienia
Uwaga
Customer Insights - Journeys używa formatu komunikatów dotyczących danych zamiast formatu powiadomień. W związku z tym aplikacja kliencka musi przeanalizować ładunek danych wysyłany przez Customer Insights - Journeys w celu wyodrębnienia poprawnego linku (śledzonego lub nieśledzonego). Dowiedz się więcej: Informacje o komunikatach FCM
Zastąp metodę OnMessageReceived
usługi FirebaseMessagingService
i wyodrębnij wymagane dane z ładunku w następujący sposób:
@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");
}
}
Część 2: Utwórz powiadomienie
Aby wygenerować zdarzenie w powiadomieniu, otwórz zawartość powiadomienia i dodaj do danych identyfikator śledzenia.
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;
}
}
Część 3: Generowanie powiadomienia o otwartym zdarzeniu
Zajmij się aplikacją otwieraną za pośrednictwem powiadomienia w MainActivity
, aby uzyskać identyfikator śledzenia.
@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());