Λήψη ειδοποιήσεων push σε κινητές συσκευές
Για να μάθετε περισσότερα σχετικά με τη συνολική προσέγγιση στη ρύθμιση ειδοποιήσεων push στο Customer Insights - Journeys, επισκεφτείτε την επισκόπηση εγκατάστασης ειδοποιήσεων push
Για να ενεργοποιήσετε τις ειδοποιήσεις push στο Customer Insights - Journeys, θα πρέπει να ολοκληρώσετε τα παρακάτω βήματα:
- Ρύθμιση εφαρμογής ειδοποιήσεων push
- Αντιστοίχιση χρήστη για ειδοποιήσεις push
- Καταχώρηση συσκευής για ειδοποιήσεις push
- Λήψη ειδοποιήσεων push σε συσκευές
- Αναφορά αλληλεπίδρασης για ειδοποιήσεις push
Σημαντικό
Για να παρακολουθήσετε τις συνδέσεις που ανοίγουν οι παραλήπτες στις ειδοποιήσεις, πρέπει να συγκεντρώσετε τη συγκατάθεση του πελάτη για παρακολούθηση. Μάθετε περισσότερα σχετικά με τις στρατηγικές για τη συγκέντρωση της συναίνεσης των πελατών στο Customer Insights - Journeys: Επισκόπηση διαχείρισης συναινέσεων
Αν δεν έχετε συλλέξει τη συγκατάθεσή σας για την παρακολούθηση, πρέπει να χρησιμοποιήσετε το πεδίο διεύθυνσης URL originalLink που περιγράφεται στο παρακάτω τμήμα κώδικα. Εάν έχετε αποκτήσει τη συγκατάθεσή σας, μπορείτε να χρησιμοποιήσετε την τιμή του πεδίου σύνδεση, η οποία έχει δυνατότητα παρακολούθησης.
PushLinkClicked δημιουργείται αυτόματα. Η διεύθυνση URL είναι μια σύνδεση ανακατεύθυνσης, η οποία δημιουργεί την αλληλεπίδραση, εάν χρησιμοποιείται η σύνδεση από το πεδίο σύνδεσης.
Λήψη ειδοποιήσεων 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: Δημιουργία μιας ειδοποίησης push
Για να δημιουργήσετε το συμβάν στην ειδοποίηση ανοίξτε και δημιουργήστε το περιεχόμενο ειδοποίησης και προσθέστε το αναγνωριστικό παρακολούθησης στα δεδομένα.
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());