Show Menu
ARGOMENTI×

Implementazione del tracciamento push

Informazioni sul tracciamento push

Per garantire che la notifica push sia stata completamente sviluppata, è necessario assicurarsi che la parte di tracciamento sia stata implementata correttamente. Presuppone che siano già state implementate le prime parti dell'implementazione delle notifiche push:
  • Registrazione dell'utente dell'app
  • Gestione di un messaggio di notifica push
Il tracciamento push è separato in tre tipi:
  • Impressioni push - Quando una notifica push viene inviata al dispositivo e si trova nel centro notifiche ma non è stata toccata per niente. Questa è considerata un'impressione. Nella maggior parte dei casi, i numeri di impression devono essere simili a quelli forniti. Garantisce che il dispositivo abbia ricevuto il messaggio e abbia inviato tali informazioni al server.
  • Clic push - Quando una notifica push viene inviata al dispositivo e l'utente fa clic sul dispositivo. L'utente desiderava visualizzare la notifica (che a sua volta si sposterà al tracciamento dell'apertura push) oppure chiudeva la notifica.
  • Push Open - Quando una notifica push viene inviata al dispositivo e l'utente fa clic sulla notifica che causa l'apertura dell'app. Questo è simile al clic push, tranne per il fatto che l'apertura push non viene attivata se la notifica è stata chiusa.
Per implementare il tracciamento per i Campaign Standard, l'app mobile deve includere Mobile SDK. Questi SDK sono disponibili Adobe Mobile Services. Per ulteriori informazioni, consulta questa pagina .
Per inviare le informazioni di tracciamento, sono necessarie tre variabili. Due dati che fanno parte dei dati ricevuti dai Campaign Standard e una variabile di azione che stabilisce se si tratta di un' Impression , Click o Open .
Variabile
Valore
broadlogId
_mId dai dati
deliveryId
_dId dai dati
action
1 per Open, 2 per Click e 7 per Impression

Implementazione per Android

Come implementare il tracciamento delle impression push

Per il tracciamento dell'impressione, è necessario inviare il valore "7" per l'azione durante la chiamata trackAction() della funzione.
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
....{Handle push messages}....
  if (data.size() > 0) {
    String deliveryId = data.get("_dId");
    String messageId = data.get("_mId");
    HashMap<String, String> contextData = new HashMap<>();
    if (deliveryId != null && messageId != null) {
                contextData.put("deliveryId", deliveryId);
                contextData.put("broadlogId", messageId);
                contextData.put("action", "7");
                MobileCore.trackAction("tracking", contextData);
    }
  }
}

Come implementare il tracciamento dei clic

Per il monitoraggio dei clic, è necessario inviare il valore "2" per l'azione durante la chiamata della trackAction() funzione.
Per tenere traccia del clic, è necessario gestire due scenari:
  • L’utente visualizza la notifica ma la cancella.
  • L’utente visualizza la notifica e fa clic su di essa per trasformarla in un tracciamento aperto.
Per gestire questo problema, è necessario utilizzare due Intenti: uno per fare clic sulla notifica e uno per chiudere la notifica.
MyFirebaseMessagingService.java
private void sendNotification(Map<String, String> data) {
    Intent openIntent = new Intent(this, CollectPIIActivity.class);
    Intent dismissIntent = new Intent(this, NotificationDismissedReceiver.class);
    openIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  
    //put the data map into the intent to track clickthroughs
    Bundle pushData = new Bundle();
    Set<String> keySet = data.keySet();
    for (String key : keySet) {
        pushData.putString(key, data.get(key));
    }
    openIntent.putExtras(pushData);
    dissmissIntent.putExtras(pushData);
  
  
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, openIntent,
        PendingIntent.FLAG_UPDATE_CURRENT);
    PendingIntent onDismissPendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, dismissIntent, 0);
  
    //<BUILD NOTIFICATION using notification builder>
    //Add both Intents to the notification
    notificationBuilder.setContentIntent(pendingIntent);
    notificationBuilder.setDeleteIntent(onDismissPendingIntent);
}

Per poter BroadcastReceiver lavorare è necessario registrarlo nel AndroidManifest.xml
<manifest>
    <application>
        <receiver android:name=".NotificationDismissedReceiver">
        </receiver>
    </application>
</manifest>

NotificationDismessedReceiver.java
public class NotificationDismissedReceiver extends BroadcastReceiver {
    private static final String TAG = NotificationDismissedReceiver.class.getSimpleName();
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle data = intent.getExtras();
        String deliveryId = data.getString("_dId");
        String messageId = data.getString("_mId");
  
        HashMap<String, Object> contextData = new HashMap<>();
  
        //We only send the click tracking since the user dismissed the notification
        if (deliveryId != null && messageId != null) {
            contextData.put("deliveryId", deliveryId);
            contextData.put("broadlogId", messageId);
            contextData.put("action", "1");
            MobileCore.trackAction("tracking", contextData);
        }
    }
}

Come implementare il tracciamento aperto

Dovrete inviare "1" e "2" perché l'utente deve fare clic sulla notifica per aprire l'app. Se l'app non viene avviata/aperta tramite la notifica push, non si verificano eventi di tracciamento.
Per tenere traccia dell'apertura, è necessario creare Intent. Gli oggetti Intent consentono ad Android OS di chiamare il metodo al termine di determinate azioni. In questo caso, fate clic sulla notifica per aprire l'app.
Questo codice è basato sull’implementazione del monitoraggio delle impression dei clic. Con Intent set, è ora necessario inviare le informazioni di tracciamento a Adobe Campaign Standard. In questo caso, devi impostare l' Open Intent opzione per l'apertura di una determinata vista nell'app, che chiamerà il metodo onResume con i dati di notifica nell'app Intent Object .
@Override
protected void onResume() {
    super.onResume();
    handleTracking();
}
  
  
private void handleTracking() {
    //Check to see if this view was opened based on a notification
    Intent intent = getIntent();
    Bundle data = intent.getExtras();
  
    if (data != null) {
        //Looks it was opened based on the notification, lets get the tracking we passed on.
        String deliveryId = data.getString("_dId");
        String messageId = data.getString("_mId");
  
        HashMap<String, Object> contextData = new HashMap<>();
  
        if (deliveryId != null && messageId != null) {
            contextData.put("deliveryId", deliveryId);
            contextData.put("broadlogId", messageId);
  
            //Send Click Tracking since the user did click on the notification
            contextData.put("action", "2");
            MobileCore.trackAction("tracking", contextData);
  
            //Send Open Tracking since the user opened the app
            contextData.put("action", "1");
            MobileCore.trackAction("tracking", contextData);
        }
    }
}

Implementazione per iOS

Come implementare il tracciamento delle impression push

Per il tracciamento dell'impressione, è necessario inviare il valore "7" per l'azione durante la chiamata trackAction() della funzione.
Per comprendere il funzionamento delle notifiche iOS, i tre stati di un'app devono essere dettagliati:
  • Primo piano : quando l'app è attualmente attiva e si trova sullo schermo (in primo piano).
  • Sfondo : quando l'app is non è sullo schermo ma il processo non è chiuso. Quando fai doppio clic sul pulsante Home, in genere vengono visualizzate tutte le app che si trovano in background.
  • Disattivato/chiuso : un'app il cui processo è stato eliminato.
Se un'app viene chiusa, Apple non chiamerà l'app finché l'app non viene riavviata. Ciò significa che non sarete in grado di sapere quando la notifica è stata ricevuta su iOS.
Per poter continuare a utilizzare il Impression tracciamento mentre l'app è in background, dobbiamo inviare all'app Content-Available per informarla che è necessario eseguire il tracciamento.
Il tracciamento delle impressioni iOS non è accurato e non deve essere considerato affidabile.
Il codice seguente ha come destinazione l'app in background:
// In didReceiveRemoteNotification event handler in AppDelegate.m
  
//In order to handle push notification when only in background with content-available: 1
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  
        //Check if the app is not in the foreground right now
        if(UIApplication.shared.applicationState != .active) {
            let deliveryId = userInfo["_dId"] as? String
            let broadlogId = userInfo["_mId"] as? String
            if (deliveryId != nil && broadlogId != nil) {
               ACPCore.trackAction("tracking", data: ["deliveryId": deliveryId!, "broadlogId": broadlogId!, "action":"7"])
            }
        }
        completionHandler(UIBackgroundFetchResult.noData)
    }

Il codice seguente ha come destinazione l'app in primo piano:
// This will get called when the app is in the foreground
  
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
  
  
        let userInfo = notification.request.content.userInfo
        let deliveryId = userInfo["_dId"] as? String
        let broadlogId = userInfo["_mId"] as? String
        if (deliveryId != nil && broadlogId != nil) {
             ACPCore.trackAction("tracking", data: ["deliveryId": deliveryId!, "broadlogId": broadlogId!, "action":"7"])
        }
        completionHandler([.alert,.sound])
    }

Come implementare il tracciamento dei clic

Per il monitoraggio dei clic, è necessario inviare il valore "2" per l'azione durante la chiamata della trackAction() funzione.
// AppDelegate.swift
...
import os.log
import UserNotifications
...
  
func registerForPushNotifications() {
        let center = UNUserNotificationCenter.current()
        center.delegate = notificationDelegate
        //Here we are creating a new Category that allows us to handle Dismiss Actions
        let defaultCategory = UNNotificationCategory(identifier: "DEFAULT", actions: [], intentIdentifiers: [], options: .customDismissAction)
        //Add it to our array of Category, in this case we only have one
        center.setNotificationCategories([defaultCategory])
        center.requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            os_log("Permission granted: %{public}@", type:. debug, granted.description)
            if error != nil {
                return
            }
            if granted {
                os_log("Notifications allowed", type: .debug)
            }
            else {
                os_log("Notifications denied", type: .debug)
            }
  
            // 2. Attempt registration for remote notifications on the main thread
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    }

Ora, quando invii notifiche push devi aggiungere una categoria. In questo caso, l'abbiamo chiamato "DEFAULT".
Quindi per gestire Dismiss e inviare le informazioni di tracciamento è necessario aggiungere quanto segue:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        switch response.actionIdentifier {
        case UNNotificationDismissActionIdentifier:
            print("Dismiss Action")
            let deliveryId = userInfo["_dId"] as? String
            let broadlogId = userInfo["_mId"] as? String
            if (deliveryId != nil && broadlogId != nil) {
                ADBMobile.trackAction("tracking", data: ["deliveryId": deliveryId!, "broadlogId": broadlogId!, "action":"2"])
            }
        default:
            ////MORE CODE
        }
        completionHandler()
    }

Come implementare il tracciamento aperto

Dovrete inviare "1" e "2" perché l'utente deve fare clic sulla notifica per aprire l'app. Se l'app non viene avviata/aperta tramite la notifica push, non si verificano eventi di tracciamento.
import Foundation
import UserNotifications
import UserNotificationsUI
  
class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate {
  
    // Called when user clicks the push notification or also called from willPresent()
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
  
        let userInfo = response.notification.request.content.userInfo
        os_log("App push data %{public}@, in userNotificationCenter:didReceive()", type: .debug, userInfo)
        switch response.actionIdentifier {
        case UNNotificationDismissActionIdentifier:
            //This is to handle the Dismiss Action
            let deliveryId = userInfo["_dId"] as? String
            let broadlogId = userInfo["_mId"] as? String
            if (deliveryId != nil && broadlogId != nil) {
                ACPCore.trackAction("tracking", data: ["deliveryId": deliveryId!, "broadlogId": broadlogId!, "action":"2"])
            }
        default:
            //This is to handle the tracking when the app opens
            let deliveryId = userInfo["_dId"] as? String
            let broadlogId = userInfo["_mId"] as? String
            if (deliveryId != nil && broadlogId != nil) {
                ACPCore.trackAction("tracking", data: ["deliveryId": deliveryId!, "broadlogId": broadlogId!, "action":"2"])
                ACPCore.trackAction("tracking", data: ["deliveryId": deliveryId!, "broadlogId": broadlogId!, "action":"1"])
            }
        }
        completionHandler()
    }
}