Menerima pemberitahuan push di perangkat seluler
Untuk mempelajari selengkapnya tentang pendekatan keseluruhan untuk menyiapkan pemberitahuan Customer Insights - Journeys push, kunjungi ikhtisar penyiapan pemberitahuan push
Untuk mengaktifkan pemberitahuan Customer Insights - Journeys push, Anda harus menyelesaikan langkah-langkah berikut:
- Konfigurasi aplikasi pemberitahuan push
- Pemetaan pengguna untuk pemberitahuan push
- Pendaftaran perangkat untuk pemberitahuan push
- Menerima pemberitahuan push di perangkat
- Pelaporan interaksi untuk pemberitahuan push
Penting
Untuk melacak tautan yang dibuka penerima di notifikasi, Anda harus mengumpulkan persetujuan pelacakan pelanggan. Pelajari lebih lanjut strategi untuk mengumpulkan persetujuan pelanggan di Customer Insights - Journeys: Ringkasan pengelolaan persetujuan
Jika belum mengumpulkan izin pelacakan, Anda harus menggunakan kolom URL Tautan asli yang dijelaskan pada cuplikan kode di bawah. Jika Anda telah memperoleh persetujuan, Anda dapat menggunakan nilai bidang tautan , yang dapat dilacak.
PushLinkClicked dihasilkan secara otomatis. URL adalah tautan pengalihan yang menciptakan interaksi jika tautan dari bidang tautan digunakan.
Menerima pemberitahuan pesan push di iOS
1. Contoh cuplikan kode untuk mengurai notifikasi masuk di 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];
}
}
Contoh cuplikan kode untuk mengurai pemberitahuan masuk di iOS (versi 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. Contoh Swift cuplikan kode untuk mengurai pemberitahuan iOS push kaya yang masuk (pemberitahuan dengan gambar):
Selain didReceive
metode dalam AppDelegate
, kita perlu menambahkan NotificationExtension
untuk mencegat pemberitahuan sebelum ditampilkan, mengunduh gambar, dan memperkaya pemberitahuan dengan data gambar. Pelajari lebih lanjut: 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)
}
}
}
Terima pemberitahuan di Android
Contoh cuplikan kode untuk mengurai pemberitahuan masuk di Android
Bagian 1: Mendapatkan ID pelacakan dari pesan pemberitahuan
Catatan
Customer Insights - Journeys menggunakan format pesan data, bukan format pemberitahuan. Ini mengharuskan aplikasi klien untuk mengurai muatan data yang dikirim oleh Customer Insights - Journeys untuk mengekstrak tautan yang benar (dilacak atau tidak dilacak). Pelajari lebih lanjut: Tentang pesan FCM
Ganti metode OnMessageReceived
dan ekstrak data yang diperlukan dari payload seperti yang FirebaseMessagingService
ditunjukkan:
@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");
}
}
Bagian 2: Membuat pemberitahuan
Untuk membuat peristiwa saat pemberitahuan terbuka, buat konten pemberitahuan dan tambahkan ID pelacakan dalam data.
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;
}
}
Bagian 3: Membuat acara pemberitahuan yang dibuka
Tangani aplikasi terbuka melalui pemberitahuan untuk MainActivity
mendapatkan ID pelacakan.
@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());