Integrare gli SDK di Campaign con la tua app integrate-campaign-sdk

Puoi utilizzare gli SDK di Campaign per iOS e Android per facilitare l’integrazione dell’app mobile nella piattaforma Adobe Campaign.

Le versioni supportate di Android ed iOS e le versioni compatibili con gli SDK di Campaign per Campaign v8 sono elencate nella Matrice di compatibilità.

In qualità di amministratore di Campaign, puoi scaricare gli SDK di Campaign dal Distribuzione di software di Experience Cloud. Per ulteriori informazioni, contattare Assistenza clienti Adobe.

NOTE
Puoi anche utilizzare l’SDK di Adobe Experience Platform Mobile configurando l’estensione Adobe Campaign nell’interfaccia utente di Data Collection. Ulteriori informazioni sono disponibili nella documentazione per gli sviluppatori.

Dichiarare le impostazioni di integrazione declaring-integration-settings

Per integrare l’SDK di Campaign nell’app mobile, l’amministratore funzionale deve fornire le seguenti informazioni allo sviluppatore:

  • Una chiave di integrazione: per abilitare la piattaforma Adobe Campaign per identificare l’app mobile.

    note note
    NOTE
    Questa chiave di integrazione viene immessa nella console Adobe Campaign, nel Information scheda del servizio dedicata all’app mobile.
  • Un URL di tracciamento: corrisponde all’indirizzo del server di tracciamento di Adobe Campaign.

  • Un URL di marketing: per abilitare la raccolta di abbonamenti.

  • In Android:

    code language-sql
    Neolane.getInstance().setIntegrationKey("your Adobe mobile app integration key");
    Neolane.getInstance().setMarketingHost("https://yourMarketingHost:yourMarketingPort/");
    Neolane.getInstance().setTrackingHost("https://yourTrackingHost:yourTrackingPort/");
    
  • In iOS:

    code language-sql
    Neolane_SDK *nl = [Neolane_SDK getInstance];
    [nl setMarketingHost:strMktHost];
    [nl setTrackingHost:strTckHost];
    [nl setIntegrationKey:strIntegrationKey];
    

Integrare l’SDK per Android

Android SDK è una libreria jar scritta in JAVA. Consente agli sviluppatori Android di integrarsi con Adobe Campaign: registrare un nuovo dispositivo, collegarlo a un utente, tenere traccia del comportamento e altro ancora.

In questa sezione, scopri come utilizzare l’SDK per Android in un’applicazione Android implementando Google Firebase Cloud Messaging (FCM).

CAUTION
Per Campaign v8, utilizza Campaign Android SDK v1.1.1.

Configurare FCM

Per utilizzare la notifica push su Android, è necessario disporre di un account FCM, configurare l’applicazione Android per ricevere la notifica e collegare l’applicazione all’account FCM. Ulteriori informazioni in Documentazione di Google.

Fai riferimento a Documentazione di Google per aggiungere Firebase al progetto Android.

Scopri come implementare FCM nell’applicazione in Documentazione di Google.

NOTE
  • Non dimenticare di scaricare e aggiungere google-services.json al progetto.

  • Il apiKey deve corrispondere al projectKey impostato nell’applicazione mobile Adobe Campaign collegata a questa applicazione Android.

Configurare l’SDK per Android

  1. Inizializzare l’SDK

    Prima di utilizzare l’SDK per Android, è necessario inizializzarlo. L’inizializzazione dell’SDK può essere eseguita nel onCreate funzione di un’attività.

    code language-sql
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    
        // initialize Campaign SDK
        SharedPreferences settings = getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
    
        Neolane.getInstance().setIntegrationKey(settings.getString(YourApplicationActivity.APPUUID_NAME, YourApplicationActivity.DFT_APPUUID));
        Neolane.getInstance().setMarketingHost(settings.getString(YourApplicationActivity.SOAPRT_NAME, YourApplicationActivity.DFT_SOAPRT));
        Neolane.getInstance().setTrackingHost(settings.getString(YourApplicationActivity.TRACKRT_NAME, YourApplicationActivity.DFT_TRACKRT));
        ...
    }
    

    Il IntegrationKey deve corrispondere al set "IntegrationKey" nell'applicazione mobile Adobe Campaign collegata a questa applicazione Android.

  2. Registrare il dispositivo mobile sul server Adobe Campaign

    La funzione di registrazione consente di:

    • invia l’ID notifica o l’ID push (deviceToken per iOS e registrationID per Android) ad Adobe Campaign.
    • recupera la chiave di riconciliazione o userKey (ad esempio e-mail o numero di account)

    È necessario registrare il dispositivo in Adobe Campaign, all’inizializzazione dell’app o in seguito a un’azione dell’utente. Può essere fatto facilmente utilizzando registerDevice metodo.

    code language-sql
    public void onClick(View v)
    {
    SharedPreferences settings = this.context.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
    EditText mailEdit = (EditText) this.context.findViewById(R.id.editText1);
    
    final String FCMRegistrationId = FirebaseInstanceId.getInstance().getToken();
    if (FCMRegistrationId != null)
        NeoTripActivity.registerOnNeolane(this.context, FCMRegistrationId, mailEdit.getText().toString());
    
    }
    

    YourApplicationActivity.java

    code language-sql
    public static void registerOnNeolane(final Context ctx, String registrationId, String userKey)
    {
        NeolaneAsyncRunner neolaneAs = new NeolaneAsyncRunner(Neolane.getInstance());
        // Additional Subscription Parameters
        Map<String,Object> additionnalParam = new HashMap<String, Object>();
        additionnalParam.clear();
        SharedPreferences settings = ctx.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
        if (settings.getBoolean(YourApplicationActivity.SUBPARAMEN1_NAME, false))
        {
            additionnalParam.put(settings.getString(YourApplicationActivity.SUBPARAMNAME1_NAME, "") , settings.getString(YourApplicationActivity.SUBPARAMVALUE1_NAME, ""));
        }
        if (settings.getBoolean(YourApplicationActivity.SUBPARAMEN2_NAME, false))
        {
            additionnalParam.put(settings.getString(YourApplicationActivity.SUBPARAMNAME2_NAME, "") , settings.getString(YourApplicationActivity.SUBPARAMVALUE2_NAME, ""));
        }
        if ( additionnalParam.isEmpty() )
        {
            additionnalParam = null;
        }
        // Campaign Registration
        neolaneAs.registerDevice(registrationId, userKey, additionnalParam, ctx, new RequestListener() {
        public void onComplete(String e, Object obj)
        {
            Intent upd = new Intent();
            upd.setAction(BROADCAST_NEWREGISTER_ACTION);
            ctx.sendBroadcast(upd);
        }
    
        public void onNeolaneException(NeolaneException e, Object obj)
        {
            sendErrorMsg(e.getErrorString());
        }
    
        public void onIOException(IOException e, Object obj)
        {
            sendErrorMsg(e.getMessage());
        }
    
        public void sendErrorMsg(String err)
        {
            SharedPreferences.Editor edit = ctx.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE).edit();
            edit.putBoolean(YourApplicationActivity.REGISTRATION_ERROR_NEOLANE_KEYNAME, true);
            edit.commit();
            Intent toast = new Intent();
            toast.setAction(BROADCAST_TOAST_DISPLAY_TEXT);
            toast.putExtra("text", "An error happened, please register again (" + err + ")");
            ctx.sendBroadcast(toast);
        }
        });
    }
    
  3. Notifica Campaign quando cambia il token del dispositivo mobile dell’utente

    Si consiglia di utilizzare il registerDevice quando si chiama il onTokenRefresh per notificare ad Adobe Campaign la modifica nel token del dispositivo mobile dell’utente.

    Ad esempio:

    YourApplicationFirebaseInstanceIDService.java

    code language-sql
    package com.android.YourApplication;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.util.Log;
    
    import com.google.firebase.iid.FirebaseInstanceId;
    import com.google.firebase.iid.FirebaseInstanceIdService;
    
    import static android.content.SharedPreferences.*;
    
    public class YourApplicationFirebaseInstanceIDService extends FirebaseInstanceIdService
    {
        @Override
        public void onTokenRefresh()
        {
        SharedPreferences settings = getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
        if (!settings.getBoolean(YourApplicationActivity.USE_GCM, false))
            {
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            String userKey = settings.getString(YourApplicationActivity.USERKEY_NAME, "");
            Editor edit = settings.edit();
            edit.putString(YourApplicationActivity.FCM_REGISTRATIONID_NAME, refreshedToken);
            edit.commit();
            YourApplicationActivity.registerOnNeolane(this, refreshedToken, userKey);
            }
        }
    }
    
  4. Configurare il servizio Firebase Messaging

    Estendi il FirebaseMessagingService nel onMessageReceived callback per ricevere messaggi. È consigliabile chiamare il notifyReceive funzione quando onMessageReceived callback viene chiamato per abilitare il tracciamento della ricezione della notifica sul dispositivo mobile. In Adobe Campaign questo è denominato stampa notifica: questa funzione deve essere chiamata immediatamente prima di richiedere al sistema operativo di visualizzare la notifica.

    YourApplicationMessagingService.java

    code language-sql
    package com.android.YourApplication;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.util.Log;
    
    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    
    public class YourApplicationFirebaseMessagingService extends FirebaseMessagingService
        {
        private static final String TAG = "MyFirebaseMsgService";
    
        @Override
        public void onMessageReceived(RemoteMessage message)
            {
            Log.d(TAG, "Receive message from: " + message.getFrom());
            Map<String,String> payloadData = message.getData();
            final Bundle extras = new Bundle();
            final Iterator<Entry<String, String>> iter = payloadData.entrySet().iterator();
            while(iter.hasNext())
            {
            final Entry<String, String>  entry =iter.next();
            extras.putString(entry.getKey(), entry.getValue());
            }
    
            SharedPreferences settings = this.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
            String mesg = payloadData.get("_msg");
            String title = payloadData.get("title");
            String url = payloadData.get("url");
            String messageId = payloadData.get("_mId");
            String deliveryId = payloadData.get("_dId");
            YourApplicationActivity.handleNotification(this, mesg, title, url, messageId, deliveryId, extras);
            }
        }
    
    code language-sql
    public static void handleNotification(Context context, String message, String title, String url, String messageId, String deliveryId, Bundle extras)
    {
        if( message == null ) message = "No Content";
        if( title == null )   title = "No title";
        if( url == null )     url = "http://www.tripadvisor.fr";
        int iconId = R.drawable.notif_neotrip;
    
        // notify Adobe Campaign that a notification just arrived
        SharedPreferences settings = context.getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
        Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
        Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
        Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
    
        NeolaneAsyncRunner nas = new NeolaneAsyncRunner(Neolane.getInstance());
        nas.notifyReceive(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
        public void onNeolaneException(NeolaneException arg0, Object arg1) {}
        public void onIOException(IOException arg0, Object arg1) {}
        public void onComplete(String arg0, Object arg1){}
        });
        if (yourApplication.isActivityVisible())
        {
        Log.i("INFO", "The application has the focus" );
        ...
        }
        else
        {
        // notification creation
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification;
    
        // Activity to start
        Intent notifIntent = new Intent(context.getApplicationContext(), NotificationActivity.class);
        notifIntent.putExtra("notificationText", message);
        notifIntent.putExtra(NotificationActivity.NOTIFICATION_URL_KEYNAME, url);
        notifIntent.putExtra("_dId", deliveryId);
        notifIntent.putExtra("_mId", messageId);
        notifIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 1, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
        notification = new Notification.Builder(context)
                .setContentTitle(title)
                .setContentText(message)
                .setSmallIcon(iconId)
                .setContentIntent(contentIntent)
                .build();
    
        // launch the notification
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notificationManager.notify(1234, notification);
        }
    }
    
  5. Tracciare le aperture dei messaggi di dati

    Per i messaggi di dati, puoi tenere traccia di quando un utente fa clic su una notifica per aprirla, utilizzando notifyOpening funzione. L’attività di notifica viene creata quando l’utente fa clic sulla notifica (creata durante onMessageReceivedchiamata di funzione)

    code language-sql
    public class NotificationActivity extends Activity {
        public void onCreate(Bundle savedBundle) {
            [...]
            Bundle extra = getIntent().getExtras();
            if (extra != null) {
                // reinit the Campaign sdk
                SharedPreferences settings = getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
                Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
                Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
                Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
    
                // Get the messageId and the deliveryId to perform tracking
                String deliveryId = extra.getString("_dId");
                String messageId = extra.getString("_mId");
    
                if (deliveryId != null && messageId != null)
                {
                    try {
                    Neolane.getInstance().notifyOpening(messageId, Integer.valueOf(deliveryId));
                    } catch (NeolaneException e) {
                    // ...
                    } catch (IOException e) {
                    // ...
                    }
                }
            }
        }
    }
    
  6. Tracciare i messaggi di apertura e i clic sui messaggi di notifica

    Per i messaggi di notifica, il tracciamento dei clic e dell’apertura deve essere eseguito con notifyOpening all’interno dell’attività di avvio dell’applicazione, come segue:

    code language-sql
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    
        SharedPreferences settings = getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
    
        // initialize Campaign SDK
        Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
        Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
        Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
    ...
    ...
    ...
    
        // Manage opening/receive tracking of message notification
        Intent intent = getIntent();
        Bundle data = intent.getExtras();
        String messageId = null, deliveryId = null;
        if( data != null ) {
        if (data.containsKey("_mId")) messageId = data.get("_mId").toString();
        if (data.containsKey("_dId")) deliveryId = data.get("_dId").toString();
        if ( messageId != null && deliveryId != null) {
            Log.i(TAG, "Notify opening from backgroun click_action");
            NeolaneAsyncRunner nas = new NeolaneAsyncRunner(Neolane.getInstance());
            nas.notifyOpening(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
            public void onNeolaneException(NeolaneException arg0, Object arg1) {
                toastMessage( "error", getString(R.string.open_track_sdk_error) + arg0.getErrorCode());
            }
            public void onIOException(IOException arg0, Object arg1) {
                toastMessage( "error", getString(R.string.open_track_io_error) +  arg0.getLocalizedMessage());
            }
            public void onComplete(String arg0, Object arg1) {
                toastMessage( "error", getString(R.string.open_track_ok));
            }
            });
            nas.notifyReceive(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
            public void onNeolaneException(NeolaneException arg0, Object arg1) {
                toastMessage( "error", getString(R.string.rec_track_sdk_error) + arg0.getErrorCode());
            }
            public void onIOException(IOException arg0, Object arg1) {
                toastMessage( "error", getString(R.string.rec_track_io_error) +  arg0.getLocalizedMessage());
            }
            public void onComplete(String arg0, Object arg1) {
                toastMessage( "error", getString(R.string.rec_track_ok));
            }
            });
        }
        }
    }
    
    note note
    NOTE
    È necessario eseguire una gestione simile se l’utente utilizza click_action all'interno dell'attività target.
  7. Tracciamento ricezione per messaggi di dati

    Per i messaggi di dati, il tracciamento viene ricevuto al onMessageReceived livello di chiamata. È necessario chiamare la funzione 'notificationReceive'.

    YourApplicationMessagingService.java

    code language-sql
    package com.android.YourApplication;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.util.Log;
    
    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    
    
    public class YourApplicationFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MyFirebaseMsgService";
    
    @Override
    public void onMessageReceived(RemoteMessage message)
        {
            Log.d(TAG, "Receive message from: " + message.getFrom());
            Map<String,String> payloadData = message.getData();
            final Bundle extras = new Bundle();
            final Iterator<Entry<String, String>> iter = payloadData.entrySet().iterator();
            while(iter.hasNext())
            {
            final Entry<String, String>  entry =iter.next();
            extras.putString(entry.getKey(), entry.getValue());
            }
    
            SharedPreferences settings = this.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
            String mesg = payloadData.get("_msg");
            String title = payloadData.get("title");
            String url = payloadData.get("url");
            String messageId = payloadData.get("_mId");
            String deliveryId = payloadData.get("_dId");
            YourApplicationActivity.handleNotification(this, mesg, title, url, messageId, deliveryId, extras);
        }
    }
    
    code language-sql
    public static void handleNotification(Context context, String message, String title, String url, String messageId, String deliveryId, Bundle extras){
        .....
        .....
            // notify Campaign that a notification just arrived
            SharedPreferences settings = context.getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
            Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
            Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
            Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
    
            NeolaneAsyncRunner nas = new NeolaneAsyncRunner(Neolane.getInstance());
            nas.notifyReceive(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
                public void onNeolaneException(NeolaneException arg0, Object arg1) {}
                public void onIOException(IOException arg0, Object arg1) {}
                public void onComplete(String arg0, Object arg1){}
        });
    }
    
  8. Tracciamento ricezione per messaggi di notifica

    Per i messaggi di notifica, la ricezione di tracciamento deve essere configurata a due livelli:

    • onMessageReceived (applicazione non in background): l’implementazione è stata eseguita nella sezione precedente
    • onCreate dell’attività di lancio (o dell’attività target se click_actionviene utilizzata la funzione.) (Applicazione non in background).

    Deve essere eseguito nello stesso momento del tracciamento di apertura/clic.

    code language-sql
    /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
    
            SharedPreferences settings = getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
    
            // initialize Campaign SDK
            Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
            Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
            Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
    ...
    ...
    ...
    
        // Manage opening/receive tracking of message notification
        Intent intent = getIntent();
        Bundle data = intent.getExtras();
        String messageId = null, deliveryId = null;
        if( data != null ) {
        if (data.containsKey("_mId")) messageId = data.get("_mId").toString();
        if (data.containsKey("_dId")) deliveryId = data.get("_dId").toString();
        if ( messageId != null && deliveryId != null) {
            Log.i(TAG, "Notify opening from backgroun click_action");
            NeolaneAsyncRunner nas = new NeolaneAsyncRunner(Neolane.getInstance());
            nas.notifyOpening(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
            public void onNeolaneException(NeolaneException arg0, Object arg1) {
                toastMessage( "error", getString(R.string.open_track_sdk_error) + arg0.getErrorCode());
            }
            public void onIOException(IOException arg0, Object arg1) {
                toastMessage( "error", getString(R.string.open_track_io_error) +  arg0.getLocalizedMessage());
            }
            public void onComplete(String arg0, Object arg1) {
                toastMessage( "error", getString(R.string.open_track_ok));
            }
            });
            nas.notifyReceive(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
            public void onNeolaneException(NeolaneException arg0, Object arg1) {
                toastMessage( "error", getString(R.string.rec_track_sdk_error) + arg0.getErrorCode());
            }
            public void onIOException(IOException arg0, Object arg1) {
                toastMessage( "error", getString(R.string.rec_track_io_error) +  arg0.getLocalizedMessage());
            }
            public void onComplete(String arg0, Object arg1) {
                toastMessage( "error", getString(R.string.rec_track_ok));
            }
            });
        }
        }
    }
    

Integrare l’SDK di iOS

  1. Registrare il dispositivo mobile sul server Adobe Campaign

    La funzione di registrazione consente di:

    • invia l’ID notifica o l’ID push (deviceToken per iOS e registrationID per Android) ad Adobe Campaign.
    • recupera la chiave di riconciliazione o userKey (ad esempio e-mail o numero di account)
    code language-sql
    // Callback called on successful registration to the APNs
     - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
    {
      // Pass the token to Adobe Campaign
      Neolane_SDK *nl = [Neolane_SDK getInstance];
      [nl registerDevice:tokenString:self.userKey:dic];
    }
    
  2. Abilita funzione di tracciamento

    La funzione di tracciamento ti consente di tenere traccia di quando le notifiche vengono attivate (si apre).

    code language-sql
    (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)launchOptions
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
    if( launchOptions ) { // Retrieve notification parameters here ... // Track application opening Neolane_SDK
    *nl = [Neolane_SDK getInstance]; [nl track:launchOptions:NL_TRACK_CLICK]; }
    ...
    completionHandler(UIBackgroundFetchResultNoData);
    }
    
  3. Tracciamento delle notifiche silenziose

    iOS consente di inviare notifiche invisibili all’utente, una notifica o dati che verranno inviati direttamente a un’app mobile senza visualizzarli. Adobe Campaign consente di tracciarli.

    Per tenere traccia della notifica invisibile all’utente, segui l’esempio seguente:

    code language-sql
    // AppDelegate.m
    ...
    ...
    #import "AppDelegate.h"
    #import "Neolane_SDK.h"
    ...
    ...
    // Callback called when the application is already launched (whether the application is running foreground or background)
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)launchOptions fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
    NSLog(@"IN didReceiveRemoteNotification:fetchCompletionHandler");
    if (launchOptions) NSLog(@"IN launchOptions: %@", [launchOptions description]);
    NSLog(@"Application state: %ld", (long)application.applicationState);
    
    // Silent Notification (specific case, can use NL_TRACK_RECEIVE as the user does not have click/open the notification)
    if ([launchOptions[@"aps"][@"content-available"] intValue] == 1 )
        {
    NSLog(@"Silent Push Notification");
    ...
    ...
    //Call receive tracking
            Neolane_SDK *nl = [Neolane_SDK getInstance];
    [nl track:launchOptions:NL_TRACK_RECEIVE];
    
    completionHandler(UIBackgroundFetchResultNoData); //Do not show notification
    return;
    }
    ...
    ...
            completionHandler(UIBackgroundFetchResultNoData);
    }
    
  4. Configurare lo stato della registrazione

    Il protocollo delegato ti consente di ottenere il risultato del registerDevice e può essere utilizzato per sapere se si è verificato un errore durante la registrazione.

    Il registerDeviceStatus prototipo:

    code language-sql
    - (void) registerDeviceStatus: (ACCRegisterDeviceStatus) status:(NSString *) errorReason;
    
    • Stato consente di sapere se la registrazione è avvenuta correttamente o se si è verificato un errore.

    • ErrorReason fornisce ulteriori informazioni sugli errori che si sono verificati. Per ulteriori informazioni sugli errori disponibili e sulle relative descrizioni, consulta la tabella seguente.

    table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 5-row-3 6-row-3 layout-auto
    Stato Descrizione ErrorReason
    ACCRegisterDeviceStatusSuccess Registrazione riuscita VUOTO
    ACCRegisterDeviceStatusFailureMarketingServerHostnameEmpty Il nome host del server di marketing ACC è vuoto o non impostato. VUOTO
    ACCRegisterDeviceStatusFailureIntegrationKeyEmpty La chiave di integrazione è vuota o non impostata. VUOTO
    ACCRegisterDeviceStatusFailureConnectionIssue Problema di connessione con ACC Ulteriori informazioni (nella lingua corrente del sistema operativo)
    ACCRegisterDeviceStatusFailureUnknownUUID L’UUID (chiave di integrazione) fornito è sconosciuto. VUOTO
    ACCRegisterDeviceStatusFailureUnexpectedError Errore imprevisto restituito al server ACC. Messaggio di errore restituito ad ACC.

    Neolane_SDKDelegate protocollo e registerDeviceStatus la definizione del delegato è la seguente:

    code language-sql
    //  Neolane_SDK.h
    //  Campaign SDK
    ..
    ..
    // Register Device Status Enum
    typedef NS_ENUM(NSUInteger, ACCRegisterDeviceStatus) {
    ACCRegisterDeviceStatusSuccess,                               // Resistration Succeed
    ACCRegisterDeviceStatusFailureMarketingServerHostnameEmpty,   // The Campaign marketing server hostname is Empty or not set
    ACCRegisterDeviceStatusFailureIntegrationKeyEmpty,            // The integration key is empty or not set
    ACCRegisterDeviceStatusFailureConnectionIssue,                // Connection issue with Campaign, more information in errorReason
    ACCRegisterDeviceStatusFailureUnknownUUID,                    // The provided UUID (integration key) is unknown
    ACCRegisterDeviceStatusFailureUnexpectedError                 // Unexpected error returned by Campaign server, more information in errorReason
    };
    // define the protocol for the registerDeviceStatus delegate
    @protocol Neolane_SDKDelegate <NSObject>
    @optional
    - (void) registerDeviceStatus: (ACCRegisterDeviceStatus) status :(NSString *) errorReason;
    @end
    @interface Neolane_SDK: NSObject {
    }
    ...
    ...
    // registerDeviceStatus delegate
    @property (nonatomic, weak) id <Neolane_SDKDelegate> delegate;
    ...
    ...
    @end
    

    Per implementare registerDeviceStatus delegato, segui questi passaggi:

    1. Implementare setDelegate durante l’inizializzazione dell’SDK.

      code language-sql
      // AppDelegate.m
      ...
      ...
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
      ...
      ...
          // Get the stored settings
      
          NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
          NSString *strMktHost = [defaults objectForKey:@"mktHost"];
          NSString *strTckHost = [defaults objectForKey:@"tckHost"];
          NSString *strIntegrationKey = [defaults objectForKey:@"integrationKey"];
          userKey = [defaults objectForKey:@"userKey"];
      
          // Configure Campaign SDK on first launch
          Neolane_SDK *nl = [Neolane_SDK getInstance];
          [nl setMarketingHost:strMktHost];
          [nl setTrackingHost:strTckHost];
          [nl setIntegrationKey:strIntegrationKey];
          [nl setDelegate:self];    // HERE
      ...
      ...
      }
      
    2. Aggiungere il protocollo in @interface della tua classe.

      code language-sql
      //  AppDelegate.h
      
      #import <UIKit/UIKit.h>
      #import <CoreLocation/CoreLocation.h>
      #import "Neolane_SDK.h"
      
      @class LandingPageViewController;
      
      @interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, Neolane_SDKDelegate> {
          CLLocationManager *locationManager;
          NSString *userKey;
          NSString *mktServerUrl;
          NSString *tckServerUrl;
          NSString *homeURL;
          NSString *strLandingPageUrl;
          NSTimer *timer;
      }
      
    3. Implementare il delegato in AppDelegate.

      code language-sql
      //  AppDelegate.m
      
      #import "AppDelegate.h"
      #import "Neolane_SDK.h"
      #import "LandingPageViewController.h"
      #import "RootViewController.h"
      ...
      ...
      - (void) registerDeviceStatus: (ACCRegisterDeviceStatus) status :(NSString *) errorReason
      {
          NSLog(@"registerStatus: %lu",status);
      
          if ( errorReason != nil )
              NSLog(@"errorReason: %@",errorReason);
      
          if( status == ACCRegisterDeviceStatusSuccess )
          {
              // Registration successful
              ...
              ...
          }
          else { // An error occurred
              NSString *message;
              switch ( status ){
                  case ACCRegisterDeviceStatusFailureUnknownUUID:
                      message = @"Unkown IntegrationKey (UUID)";
                      break;
                  case ACCRegisterDeviceStatusFailureMarketingServerHostnameEmpty:
                      message = @"Marketing URL not set or Empty";
                      break;
                  case ACCRegisterDeviceStatusFailureIntegrationKeyEmpty:
                      message = @"Integration Key not set or empty";
                      break;
                  case ACCRegisterDeviceStatusFailureConnectionIssue:
                      message = [NSString stringWithFormat:@"%@ %@",@"Connection issue:",errorReason];
                      break;
                  case ACCRegisterDeviceStatusFailureUnexpectedError:
                  default:
                      message = [NSString stringWithFormat:@"%@ %@",@"Unexpected Error",errorReason];
                      break;
              }
          ...
          ...
          }
      }
      @end
      

Variabili variables

Le variabili ti consentono di definire il comportamento dell’app mobile dopo aver ricevuto una notifica. Queste variabili devono essere definite nel codice dell’app mobile e nella console client di Adobe Campaign, nel Variables nel servizio dedicato di app mobili.

Di seguito è riportato un esempio di codice che consente a un’app mobile di raccogliere tutte le variabili aggiunte in una notifica. Nel nostro esempio, utilizziamo la variabile "VAR".

  • In Android:

    code language-sql
    public void onReceive(Context context, Intent intent) {
         ...
        String event = intent.getStringExtra("VAR");
         ...
    }
    
  • In iOS:

    code language-sql
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        ....
        if( launchOptions )
        {
            // When application is not already launched, the notification data if any are stored in the key 'UIApplicationLaunchOptionsRemoteNotificationKey'
            NSDictionary *localLaunchOptions = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
            if( localLaunchOptions )
            {
             ...
             [localLaunchOptions objectForKey:@"VAR"];
            ...
            }
       }
    }
    
    // Callback called when the application is already launched (whether the application is running foreground or background)
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)launchOptions
    {
        if( launchOptions )
        {
         ...
            [launchOptions objectForKey:@"VAR"];
        }
    }
    
CAUTION
L’Adobe consiglia di scegliere nomi di variabili brevi, perché la dimensione della notifica è limitata a 4 kB per iOS e Android.

Estensione del servizio di notifica notification-service-extension

Per iOS

Il supporto deve essere scaricato a livello di estensione del servizio di notifica.

#import "NotificationService.h"

@interface NotificationService ()

@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;

@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    NSDictionary *userInfo = nil;
    NSString *url = nil;

    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    userInfo = request.content.userInfo;
    if ( userInfo != nil )
    {
        url = userInfo[@"mediaUrl"];  // Get the url of the media to download (Adobe Campaign additional variable)
    }
    ...
    // Perform the download to local storage

Estensione contenuto notifica notification-content-extension

Per iOS

A questo livello, devi:

  • Associa l’estensione di contenuto alla categoria inviata da Adobe Campaign:

    Se desideri che nell’app mobile venga visualizzata un’immagine, puoi impostare il valore della categoria su "image" in Adobe Campaign e creare un’estensione di notifica con il UNNotificationExtensionCategory parametro impostato su "image". Quando la notifica push viene ricevuta sul dispositivo, l’estensione viene chiamata in base al valore di categoria definito.

  • Definire il layout delle notifiche

    È necessario definire un layout con i widget pertinenti. Per un’immagine, il widget è denominato UimageView.

  • Visualizzare i file multimediali

    È necessario aggiungere il codice per alimentare i dati multimediali al widget. Di seguito è riportato un esempio di codice per un’immagine:

    code language-sql
    #import "NotificationViewController.h"
    #import <UserNotifications/UserNotifications.h>
    #import <UserNotificationsUI/UserNotificationsUI.h>
    
    @interface NotificationViewController () <UNNotificationContentExtension>
    
    @property (strong, nonatomic) IBOutlet UIImageView *imageView;
    @property (strong, nonatomic) IBOutlet UILabel *notifContent;
    @property (strong, nonatomic) IBOutlet UILabel *label;
    
    @end
    
    @implementation NotificationViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any required interface initialization here.
    }
    
    - (void)didReceiveNotification:(UNNotification *)notification {
        self.label.text = notification.request.content.title;
        self.notifContent.text = notification.request.content.body;
        UNNotificationAttachment *attachment = [notification.request.content.attachments objectAtIndex:0];
        if ([attachment.URL startAccessingSecurityScopedResource])
        {
          NSData * imageData = [[NSData alloc] initWithContentsOfURL:attachment.URL];
          self.imageView.image =[UIImage imageWithData: imageData];
          [attachment.URL stopAccessingSecurityScopedResource];
        }
    }
    @end
    
recommendation-more-help
35662671-8e3d-4f04-a092-029a056c566b