Aggiungere richieste Adobe Target
Il SDK di Adobe Mobile Services (v4) fornisce metodi e funzionalità Adobe Target che consentono di personalizzare l’app con esperienze diverse per utenti diversi. In genere, l’app invia all’Adobe Target una o più richieste per recuperare il contenuto personalizzato e misurarne l’impatto.
In questa lezione, preparerai l'app We.Travel per la personalizzazione implementando Target richieste.
Prerequisiti
Assicurarsi di scaricare e aggiornare l'app di esempio.
Finalità di apprendimento
Alla fine di questa lezione, sarai in grado di:
- Memorizza nella cache più offerte Target (ad esempio contenuto personalizzato) utilizzando una richiesta di preacquisizione batch
- Carica posizioni Target preacquisite
- Carica una posizione Target in tempo reale (non precaricata)
- Cancella posizioni preacquisite dalla cache
- Convalidare richieste preacquisite e in tempo reale
Terminologia
Di seguito sono riportati alcuni termini chiave di Target che utilizzeremo nel resto di questa esercitazione.
- Richiesta: una richiesta di rete ai server Adobe Target
- Offerta: uno snippet di codice o altro contenuto basato su testo, definito nell'interfaccia utente di Target (o con API), che viene distribuito nella risposta. Di solito JSON quando Target viene utilizzato nelle app native per dispositivi mobili.
- Posizione: un nome definito dall'utente assegnato a una richiesta, utilizzato nell'interfaccia Target per associare le offerte a richieste specifiche
- Richiesta batch: una singola richiesta che include più posizioni
- Richiesta di preacquisizione: una singola richiesta che recupera le offerte e le memorizza in cache per utilizzarle in futuro nell'app
- Richiesta di preacquisizione batch: una singola richiesta che preacquisisce offerte per più posizioni
- Pubblico: un gruppo di visitatori definito nell'interfaccia Target o condiviso con Target da altre applicazioni Adobe (ad esempio "Visitatori iPhone X", "Visitatori in California", "Prima app aperta")
- Attività: un costrutto Target, definito nell'interfaccia utente Target (o con API) che collega posizioni, offerte e tipi di pubblico per creare un'esperienza personalizzata
Aggiungi una richiesta di preacquisizione batch
La prima richiesta che implementeremo in We.Travel è una richiesta di preacquisizione batch con due posizioni Target nella schermata iniziale. In una lezione successiva, configureremo le offerte per queste posizioni che visualizzano messaggi per aiutare i nuovi utenti nel processo di prenotazione.
Una richiesta di preacquisizione recupera il contenuto di Target il meno possibile memorizzando nella cache la risposta del server Adobe Target (offerta). Una richiesta di preacquisizione batch recupera e memorizza nella cache più offerte, ciascuna associata a una posizione diversa. Tutte le posizioni preacquisite vengono memorizzate nella cache del dispositivo per un utilizzo futuro nella sessione utente. Preacquisendo più posizioni nella schermata iniziale, possiamo recuperare le offerte da utilizzare in un secondo momento mentre il visitatore naviga attraverso l’app. Per ulteriori dettagli sui metodi di preacquisizione, consulta la documentazione di preacquisizione.
Aggiungi la richiesta di preacquisizione batch
Aggiorniamo il controller HomeActivity (il codice sorgente della schermata Home), che si trova in app > main > java > com.wetravel > Controller. Aggiungeremo i due blocchi di codice mostrati in rosso:
Inizieremo con il controller HomeActivity (il codice sorgente della schermata Home), che si trova in app > main > java > com.wetravel > Controller.
Aggiungeremo i due blocchi di codice mostrati in rosso:
Scorri verso il basso fino alla fine del codice di HomeActivity e aggiungi il codice fornito di seguito dopo la funzione setHeader() e sostituendo la funzione onResume() corrente:
@Override
protected void onResume() {
super.onResume();
targetPrefetchContent();
}
public void targetPrefetchContent() {
List<TargetPrefetchObject> prefetchList = new ArrayList<>();
prefetchList.add(Target.createTargetPrefetchObject(Constant.wetravel_engage_home, null));
prefetchList.add(Target.createTargetPrefetchObject(Constant.wetravel_engage_search, null));
Target.TargetCallback<Boolean> prefetchStatusCallback = new Target.TargetCallback<Boolean>() {
@Override
public void call(final Boolean status) {
HomeActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
String cachingStatus = status ? "YES" : "NO";
System.out.println("Received Response from prefetch : " + cachingStatus);
setUp();
}
});
}};
Target.prefetchContent(prefetchList, null, prefetchStatusCallback);
}
È probabile che l'IDE ti avviserà che le classi Target non sono state importate nel file. Assicurarsi di importare le classi Target nella parte superiore del controller HomeActivity, come illustrato di seguito in rosso:
import com.adobe.mobile.Target;
import com.adobe.mobile.TargetPrefetchObject;
È probabile che vengano visualizzati errori anche per "impossibile trovare la variabile simbolo wetravel_engagement_home" e "impossibile trovare la variabile simbolo wetravel_eng_search". Aggiungi questi al file Constant.java (in app > src > main > java > com > wetravel > Utils):
public static final String wetravel_engage_home = "wetravel_engage_home";
public static final String wetravel_engage_search = "wetravel_engage_search";
Spiegazione del codice di richiesta di preacquisizione batch
targetPrefetchContent()prefetchContent()Constant.wetravel_engage_homeConstant.wetravel_engage_searchInformazioni su asincrono e sincrono
Con il codice appena implementato, la richiesta di preacquisizione viene effettuata come chiamata sincrona di blocco, appena prima del rendering della schermata iniziale. Quando abbiamo incollato il nuovo codice nel controller HomeActivity, l'esecuzione della funzione setUp() è stata spostata dalla funzione onResume() a dopo la richiesta Target. Questo può essere utile negli scenari in cui desideri personalizzare il contenuto quando l’app si apre per la prima volta, perché assicura che il contenuto personalizzato dai server di Target sia stato restituito (o scaduto) prima del rendering della prima schermata. Per consentire il caricamento asincrono delle richieste (in background), è sufficiente chiamare setUp() nella funzione onCreate().
Convalidare la richiesta di preacquisizione batch
Rigenera l’app e apri l’emulatore Android. Le schermate seguenti utilizzano Pixel 2 su Android Q versione 9+, API livello 29. La risposta di preacquisizione deve riportare il testo "risposta di preacquisizione ricevuta":
Quando viene eseguito il rendering della schermata iniziale, la richiesta di preacquisizione deve essere caricata. Con Logcat, filtra per “Target” per visualizzare la richiesta e la risposta:
Se la risposta non viene visualizzata correttamente, verificare le impostazioni nel file ADBMobileConfig.json e la sintassi del codice nel file HomeActivity.
Due posizioni sono ora memorizzate nella cache del dispositivo. I nomi delle posizioni verranno presto caricati in modo lento nell'interfaccia Target, dove possono essere selezionati in vari menu a discesa quando vengono utilizzati in un'attività.
Aggiungi richieste di caricamento per ogni posizione memorizzata nella cache
Ora che le posizioni sono preacquisite e le loro risposte sono memorizzate nella cache del dispositivo, aggiungiamo il metodo Target.loadRequest() che recupera il contenuto dell'offerta dalla cache in modo che tu possa utilizzarlo per aggiornare l'applicazione. Verrà aggiunto un nuovo metodo personalizzato denominato engageMessage() che verrà eseguito con la richiesta di preacquisizione. engageMessage() chiamerà Target.loadRequest(). engageMessage() viene eseguito prima di setUp() per assicurarsi che la richiesta di caricamento venga chiamata prima della configurazione dello schermo.
Innanzitutto, aggiungi la chiamata e il metodo engageMessage() per la posizione wetravel_eng_home nell'attività Home:
Ecco il codice aggiornato:
public void targetPrefetchContent() {
List<TargetPrefetchObject> prefetchList = new ArrayList<>();
Map<String, Object> params1;
params1 = new HashMap<String, Object>();
params1.put("at_property", "your at_property value goes here");
prefetchList.add(Target.createTargetPrefetchObject(Constant.wetravel_engage_home, params1));
prefetchList.add(Target.createTargetPrefetchObject(Constant.wetravel_engage_search, params1));
Target.TargetCallback<Boolean> prefetchStatusCallback = new Target.TargetCallback<Boolean>() {
@Override
public void call(final Boolean status) {
HomeActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
String cachingStatus = status ? "YES" : "NO";
System.out.println("Received Response from prefetch : " + cachingStatus);
engageMessage();
setUp();
}
});
}};
Target.prefetchContent(prefetchList, null, prefetchStatusCallback);
}
public void engageMessage() {
Target.loadRequest(Constant.wetravel_engage_home, "", null, null, null,
new Target.TargetCallback<String>(){
@Override
public void call(final String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("Engage Message : " + s);
if(s != null && !s.isEmpty()) Utility.showToast(getApplicationContext(), s);
}
});
}
});
}
Aggiungere ora la chiamata e il metodo engageMessage() per la posizione wetravel_eng_search in SearchBusActivity. Si noti che la chiamata engageMessage() è impostata nel metodo onResume() prima della chiamata a setUpSearch(), quindi viene eseguita prima della configurazione della schermata:
Ecco il codice aggiornato:
@Override
public void onResume() {
super.onResume();
engageMessage();
setUpSearch();
}
public void engageMessage() {
Target.loadRequest(Constant.wetravel_engage_search, "", null, null, null,
new Target.TargetCallback<String>(){
@Override
public void call(final String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("Engage Message : " + s);
if(s != null && !s.isEmpty()) Utility.showToast(getApplicationContext(), s);
}
});
}
});
}
Poiché hai appena aggiunto i metodi Target a SearchBusActivity, assicurati di importare le classi Target:
import com.adobe.mobile.Target;
import com.adobe.mobile.TargetPrefetchObject;
Aggiungere una richiesta in tempo reale
La prossima richiesta che aggiungeremo all’app sarà una richiesta in tempo reale nella schermata di ringraziamento. Con "tempo reale" si intende che la richiesta verrà effettuata e la risposta verrà applicata immediatamente (non memorizzata nella cache per un momento successivo). In una lezione successiva, genereremo un’esperienza utilizzando questa richiesta, personalizzata in base alla destinazione del viaggio dell’utente.
Aggiungiamo quindi una richiesta in tempo reale nella schermata di ringraziamento. Nel file ThankYouActivity, le modifiche visualizzate sono in rosso:
Scorri fino alla fine del file ThankYouActivity. Commentare le tre righe della funzione getRecommandations() e aggiungere la chiamata della funzione targetLoadRequest():
// AppDialogs.dialogLoaderHide();
// recommandations.addAll(recommandation.recommandations);
// recommandationbAdapter.notifyDataSetChanged();
Aggiungi questa riga di codice alla funzione getRecommandations():
targetLoadRequest(recommandation.recommandations);
Ora è necessario definire la funzione targetLoadRequest():
Aggiungi questo blocco di codice dopo la funzione filterRecommendationBasedOnOffer():
public void targetLoadRequest(final ArrayList<Recommandation> recommandations) {
Target.loadRequest(Constant.wetravel_context_dest, "", null, null, null, new Target.TargetCallback<String>() {
@Override
public void call(final String response) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
AppDialogs.dialogLoaderHide();
filterRecommendationBasedOnOffer(recommandations, response);
recommandationbAdapter.notifyDataSetChanged();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
Poiché hai appena aggiunto i metodi Target all’attività ThankYouActivity, assicurati di importare le classi Target:
import com.adobe.mobile.Target;
import com.adobe.mobile.TargetPrefetchObject;
spiegazione del codice targetLoadRequest()
targetLoadRequest()Target.loadRequest() e carica e visualizza la posizione wetravel_context_destTarget.loadRequest()filterRecommendationBasedOnOffer()recommandations.addAll()filterRecommendationBasedOnOffer()Questo è stato un aggiornamento più sofisticato che abbiamo apportato all’app, poi con la richiesta che abbiamo aggiunto alla schermata iniziale, quindi proviamo a rivedere quello che abbiamo fatto:
- Abbiamo interrotto il comportamento precedente dell’app di mostrare tre promozioni predefinite, commentando le righe di codice
- Abbiamo chiesto all’app di eseguire una nuova funzione, chiamata arbitrariamente targetLoadRequest
- È stata definita la funzione
targetLoadRequestper effettuare una richiesta a Target utilizzando il metodo Target.loadRequest ed eseguire immediatamente la funzionefilterRecommendationBasedOnOffer()quando viene ricevuta la risposta all'offerta Target - La funzione
filterRecommendationBasedOnOffer()interpreta la risposta e decide quali promozioni applicare allo schermo
Si tratta di un modello di utilizzo molto comune quando si utilizza Target nelle app per dispositivi mobili. È entrambi molto potente, in quanto puoi personalizzare quasi qualsiasi aspetto della tua app mobile. Richiede anche il coordinamento tra il codice dell'app e le offerte che definiremo più avanti nell'interfaccia Target. A causa di questo coordinamento, per alcuni casi di utilizzo di personalizzazione potrebbe essere necessario aggiornare l’app nell’app store per avviare l’attività.
Convalidare la richiesta in tempo reale
Apri l’emulatore Android e segui tutti i passaggi per prenotare un viaggio: Home > Risultati ricerca bus > Selezione posti, Opzioni di pagamento (funziona qualsiasi opzione di pagamento con dati vuoti).
Nella schermata di ringraziamento finale, guarda Logcat per la risposta. La risposta deve contenere il testo "Il contenuto predefinito è stato restituito per "wetravel_context_dest":
Cancellazione delle posizioni di prelettura dalla cache
In alcune situazioni, le posizioni preacquisite devono essere cancellate durante una sessione. Ad esempio, quando si verifica una prenotazione, ha senso cancellare le posizioni memorizzate in cache, poiché l’utente è ora "coinvolto" e comprende il processo di prenotazione. Se prenotano un altro viaggio durante la sessione, non avranno bisogno delle posizioni originali nella schermata iniziale e nella schermata dei risultati di ricerca per guidare la prenotazione. Avrebbe più senso cancellare le posizioni dalla cache e preacquisire nuove offerte per una seconda prenotazione scontata o per un altro scenario pertinente. Puoi aggiungere la logica alla schermata iniziale e alla schermata dei risultati della ricerca per preacquisire nuove posizioni se durante la sessione è stata effettuata una prenotazione.
Per questo esempio, cancelleremo solo le posizioni preacquisite per la sessione quando avviene una prenotazione. Questa operazione viene eseguita chiamando la funzione Target.clearPrefetchCache(). Impostare la funzione all'interno della funzione targetLoadRequest() come illustrato di seguito:
Target.clearPrefetchCache()
Congratulazioni! L’app ora dispone del framework per la personalizzazione. Nella prossima lezione, miglioreremo le nostre funzionalità di personalizzazione aggiungendo parametri a queste posizioni.
AVANTI: "Aggiungi parametri" >