J'ai une tâche simple: je veux suivre l'identifiant de référence d'une installation d'application et le transmettre au backend.
Ce que j'ai fait: J'ai créé un lien avec un paramètre supplémentaire referrer
et l'ai ajouté au lien d'invitation. Lorsqu’elle est ouverte, la javascript
détecte si le navigateur est un navigateur mobile Android, puis prépare une intent
et envoie une redirection vers cette intention. Lors de la préparation de l'intention, le champ referrer
est extrait de l'URL et ajouté à la intent
comme ceci:
intent://scan/#Intent;scheme=com.example.Android;package=com.example.Android&referrer=4;end
Et voici mon code pour BroadCastReceiver
:
public class InstallReferrerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
TinyDB tinyDB = new TinyDB(context);
String referrer = intent.getStringExtra("referrer");
tinyDB.putString(AppConstants.REFERRAL_ID, referrer);
tinyDB.putBoolean(AppConstants.REFERRAL_SENT, false);
}
}
Donc, je pense que referrer
est 4
d'après la intent
ci-dessus. Mais la valeur que je reçois est cette chaîne utm_source=google-play&utm_medium=organic
Qu'est-ce que je fais mal et comment puis-je résoudre ce problème pour obtenir la valeur correcte pour le champ referrer
?
Modifier
Je n'ai aucun problème à créer l'URL ou à extraire les valeurs du champ referrer
une fois l'application installée.
Une fois que le lien d'invitation a été cliqué via n'importe quel clic ou ouvert directement dans le navigateur mobile, j'utilise ce qui précède pour "ouvrir l'application si elle est déjà installée ou ouvrir la page de l'application sur l'application Play Store pour que les utilisateurs puissent l'installer".
Le problème est de savoir comment devrais-je transmettre la valeur du champ de référence du lien d'invitation à l'application Play Store par le biais de l'intention ci-dessus afin que le Play Store reçoive cette valeur et la transmette à l'application lors de son installation.
Vous devez le tester correctement, je poste le cas d'utilisation de mine, j'espère que cela résoudra votre problème :)
URL de référence -
https://play.google.com/store/apps/details?id=com.mypackage&referrer=utm_source%3Dmobisoc%26utm_content%3D{transaction_id}%26utm_campaign%3D1
Code à recevoir refferal -
public static final String KEY_UTM_SOURCE = "utm_source";
public static final String KEY_UTM_CONTENT = "utm_content";
public static final String KEY_UTM_CAMPAIGN = "utm_campaign";
public void onReceive(Context context, Intent intent) {
Utils.log("Referral Received");
try {
String referrer = intent.getStringExtra("referrer");
if (referrer != null && !referrer.equals("")) {
Utils.log("Referral Received - " + referrer);
String[] referrerParts = referrer.split("&");
String utmSource = getData(KEY_UTM_SOURCE, referrerParts);
String utmContent = getData(KEY_UTM_CONTENT, referrerParts);
String utmCampaign = getData(KEY_UTM_CAMPAIGN, referrerParts);
if (utmSource != null && utmSource.equals("mobisoc")) {
sendLogToMobisocServer(context, utmContent);
} else if (utmSource != null && utmSource.equals("app_share")) {
RawStorageProvider.getInstance(context).dumpDataToStorage(RaghuKakaConstants.REFFERAL_FOR, utmContent);
}
updateRKServerForReferral(context, utmSource, utmCampaign, utmContent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private String getData(String key, String[] allData) {
for (String selected : allData)
if (selected.contains(key)) {
return selected.split("=")[1];
}
return "";
}
Maintenant, la partie la plus importante des tests. Vous pouvez tester la référence localement. Il vous suffit de connecter votre téléphone et d’ouvrir l’invite du shell à l’aide de adb Shell
. Et diffuser les données de référence. Voici l'exemple de séquence de commandes -
C:\Users\Neo\Desktop>adb Shell
$ am broadcast -a com.Android.vending.INSTALL_REFERRER -n com.mypackage/<className of your ReferralReceiver with package> --es "referrer" "utm_source%3Dmobisoc%26utm_content%3D{transaction_id}%26utm_campaign%3D1"
Additionnel -
https://play.google.com/store/apps/details?id=com.mypackage&referrer = utm_source% 3Dmobisoc% 26utm_content% 3D {transaction_id}% 26utm_campaign% 3D1
Il suffit de voir mon lien. Si l'utilisateur va au magasin de jeu via ce lien, et installe l'application. Ensuite, lors du premier lancement de l’application, votre méthode onReceive sera automatiquement déclenchée et vous obtiendrez toutes les données après le référant =.
Diffusion -
$ am broadcast -a com.Android.vending.INSTALL_REFERRER -n com.mypackage/<className of your ReferralReceiver with package> --es "referrer" "utm_source%3Dmobisoc%26utm_content%3D{transaction_id}%26utm_campaign%3D1"
Pour le tester, vous n'avez pas besoin de publier votre application sur le PlayStore, il suffit de mettre un point de débogage sur le premier point de onReceive, de le lancer en mode débogage et d'activer les séquences de commandes que j'ai postées. Vous obtiendrez toutes les données après la balise "referrer". Vous pouvez ainsi choisir les données à ajouter lors de la création du lien de renvoi.
Faites-moi savoir au cas où vous auriez besoin de plus de précisions :)
Il est préférable et plus fiable de suivre le référant via Firebase Dynamic Link.
Ci-dessous, comment ça marche.
Voici l'exemple de lien après avoir renseigné les paramètres.
Bien sûr, vous pouvez raccourcir le lien à quelque chose comme https://example.app.goo.gl/abcde
directement sur la console Firebase. La configuration du lien dynamique ne prendra que quelques minutes.
Ensuite, dans l'application Android sur votre Activity
principale, vous pouvez appeler AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, false)
pour récupérer les informations sur les liens.
Plus d'informations peuvent être trouvées ici https://firebase.google.com/docs/dynamic-links/
J'ai utilisé le marquage utm
vous pouvez voir la source complète à https://github.com/dheeraj9198/Utm-Test
Je fournis le code de base
public class CustomCampaignTrackingReceiver extends BroadcastReceiver {
private static final String TAG = CustomCampaignTrackingReceiver.class.getSimpleName();
private static final Logger LOGGER = LoggerFactory.getLogger(TAG);
private static final Marker MARKER = MarkerFactory.getMarker(TAG);
@Override
public void onReceive(Context context,final Intent intentx) {
LOGGER.info(MARKER, "on Receive called");
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
@Override
public void run() {
try {
for (String key : intentx.getExtras().keySet()) {
try {
LOGGER.info(MARKER, key + " => " + String.valueOf(intentx.getExtras().get(key)));
} catch (Exception e) {
LOGGER.error(MARKER, "caught exception in on key retrieval ", e);
}
}
} catch (Exception e) {
LOGGER.error(MARKER, "caught exception in key loop ", e);
}
}
});
executorService.shutdown();
}
}
--------------------------Manifeste----------------------- ----------------
<receiver
Android:name="com.google.Android.gms.analytics.CampaignTrackingReceiver"
Android:exported="true" >
<intent-filter>
<action Android:name="com.Android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<receiver
Android:name=".receivers.CustomCampaignTrackingReceiver"
Android:exported="true" >
<intent-filter>
<action Android:name="com.Android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>