Правильное отслеживание установки рефералов в Play Store
У меня есть простая задача: я хочу отследить реферальный идентификатор установки приложения и передать его бэкэнду.
Что я сделал: я создал ссылку с дополнительным параметром referrer
и добавил его к ссылке приглашения. Когда он открыт, javascript
определяет, является ли браузер мобильным браузером Android, и затем готовит intent
и выдает редирект на это намерение. При подготовке намерения, referrer
поле извлекается из URL и добавляется к intent
как это:
intent://scan/#Intent;scheme=com.example.android;package=com.example.android&referrer=4;end
И вот мой код для 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);
}
}
Итак, что я ожидаю получить здесь в качестве значения referrer
является 4
на основании вышеизложенного intent
, Но ценность, которую я получаю, это строка utm_source=google-play&utm_medium=organic
Что я делаю не так и как я могу это исправить, чтобы получить правильное значение для referrer
поле?
редактировать
У меня нет проблем с созданием URL или извлечением значений из referrer
поле, как только приложение установлено.
После того, как ссылка приглашения нажата любым нажатием кнопки или открыта непосредственно в мобильном браузере, я использую вышеупомянутое, чтобы "либо открыть приложение, если оно уже установлено, либо открыть страницу приложения в приложении Play Store для пользователей, чтобы установить его".
Вопрос заключается в том, как передать значение поля referrer из ссылки на приглашение в приложение Play Store с помощью вышеуказанного намерения, чтобы Play Store получил это значение и передал его приложению после его установки.
3 ответа
Вы должны проверить это должным образом, я публикую свой вариант использования, надеюсь, это решит вашу проблему:)
Реферальный URL -
https://play.google.com/store/apps/details?id=com.mypackage&referrer=utm_source%3Dmobisoc%26utm_content%3D{transaction_id}%26utm_campaign%3D1
Код для получения реферала -
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 "";
}
Теперь самая важная часть тестирования. Вы можете проверить реферала локально. Просто вам нужно подключить телефон, откройте командную строку с помощью adb shell
, И транслировать реферальные данные. Вот пример последовательности команд:
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"
Дополнительный -
https://play.google.com/store/apps/details?id=com.mypackage&;referrer=utm_source%3Dmobisoc%26utm_content%3D{action_id}%26utm_campaign%3D1
Просто посмотрите мою ссылку. Если пользователь перейдет в PlayStore по этой ссылке, и установите приложение. Тогда в первый раз, когда приложение запустится, ваш метод onReceive будет запущен автоматически, и вы получите все данные после referrer =.
Трансляция -
$ 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"
Для тестирования вам не нужно публиковать ваше приложение в playstore. Просто поместите точку отладки в первую точку onReceive, запустите в режиме отладки и запустите последовательности команд, которые я опубликовал, вы получите все данные после тега "referrer". Таким образом, вы можете решить, какие данные вам нужно добавить при создании реферальной ссылки.
Дайте мне знать, если вам понадобятся дополнительные разъяснения:)
Лучше и надежнее отслеживать реферера через Firebase Dynamic Link.
Ниже это, как это работает.
Вот пример ссылки после заполнения параметров.
Конечно, вы можете сократить ссылку на что-то вроде https://example.app.goo.gl/abcde
прямо на консоли Firebase. Установка динамического соединения займет всего несколько минут.
Затем в приложении Android на вашем главном Activity
ты можешь позвонить AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, false)
чтобы получить информацию о ссылке.
Дополнительную информацию можно найти здесь https://firebase.google.com/docs/dynamic-links/
Я использовал UTM теги
Вы можете увидеть полный источник на https://github.com/dheeraj9198/Utm-Test
Я предоставляю основной код
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();
}
}
--------------------------Manifest---------------------------------------
<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>