Правильное отслеживание ссылок на установку в 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, чтобы пользователи могли его установить».

Проблема в том, как мне передать значение поля реферера из ссылки-приглашения в приложение Play Store с помощью вышеуказанного намерения, чтобы Play Store получил это значение и передал его приложению при его установке.


person Amit Tiwari    schedule 28.06.2016    source источник
comment
Рассматривали ли вы Firebase Dynamic Link? Это лучше и надежнее.   -  person Pongpat    schedule 06.07.2016
comment
@Pongpat Я еще не изучал это.   -  person Amit Tiwari    schedule 06.07.2016
comment
Вам интересно? Если это так, я могу опубликовать краткое объяснение в качестве ответа.   -  person Pongpat    schedule 06.07.2016
comment
@Pongpat да, конечно. Мне бы понравилось это.   -  person Amit Tiwari    schedule 06.07.2016
comment
Пожалуйста, смотрите мой ответ ниже. Пожалуйста, также опубликуйте ссылку, которую вы используете и которая не работает.   -  person Pongpat    schedule 06.07.2016
comment
Как вы тестируете, реферал?   -  person Neo    schedule 07.07.2016
comment
@Pongpat ссылка для приглашения.   -  person Amit Tiwari    schedule 07.07.2016
comment
@Neo На самом деле, я не могу проверить рефералы напрямую, но журналы серверной части показывают значение поля referrer, которое я пытаюсь отправить из внешнего интерфейса, и это не то, что я ожидал.   -  person Amit Tiwari    schedule 07.07.2016
comment
Хорошо, я публикую процедуру тестирования и мой рабочий код. Это может вам помочь :)   -  person Neo    schedule 07.07.2016
comment
@AmitTiwari Я опубликовал свою рабочую реализацию. Дайте мне знать, если вам нужно больше. У нас мало времени :)   -  person Neo    schedule 07.07.2016
comment
@AmitTiwari Можете ли вы дать мне полную ссылку, по которой вы перенаправляете пользователя в магазин игр?   -  person Pongpat    schedule 08.07.2016
comment
Привет, не могли бы вы рассказать мне о части javascript, так как теперь я застрял в том, как автоматически открывать приложение после завершения установки приложений в магазине игр.   -  person Choy Wing Lun    schedule 08.03.2021


Ответы (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{transaction_id}%26utm_campaign%3D1

Просто посмотрите мою ссылку. Если пользователь перейдет в игровой магазин по этой ссылке и установит приложение. Затем в первый раз, когда приложение запустится, ваш метод 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». Таким образом, вы можете решить, какие данные вам нужно добавить при создании реферальной ссылки.

Дайте мне знать, если вам нужны дополнительные разъяснения :)

person Neo    schedule 07.07.2016
comment
Создание URL-адреса приглашения и извлечение данных из поля referrer понятно. Проблема в том, что когда я открываю свой URL-адрес приглашения из мобильного браузера, мне нужно открыть приложение, если оно установлено, или открыть магазин игр, если оно не установлено. Для этого я использую intent, как указано в вопросе. Что я хочу знать, так это то, какие изменения я должен внести в intent, чтобы передать реферальное значение в приложение play store, чтобы я мог вернуть его, когда приложение будет установлено? - person Amit Tiwari; 07.07.2016
comment
Опубликованы дополнительные разъяснения, дайте мне знать, если у вас все еще есть какие-либо сомнения :) - person Neo; 07.07.2016
comment
Я пробовал это. Оно работает. Скажите, что произойдет, если ссылку, которую вы разместили, поместить в a href для кнопки в рекламном письме или отправить другим пользователям, скажем, через Whatsapp? Будет ли одна эта ссылка при открытии на мобильном устройстве открывать мое приложение, если оно установлено, или открывать приложение Play Store (не Play Store в Chrome)? - person Amit Tiwari; 07.07.2016
comment
сделано, но если мы все еще получаем utm source %20set и то же самое для utm meduim. как я могу исправить проблему %20set. Я могу получить параметры URL, указанные в cmd, при тестировании вручную. но %20set в playstore ..Пожалуйста, помогите - person atish naik; 23.11.2018
comment
Можете ли вы объяснить свою проблему на примере, я хотел бы помочь вам. - person Neo; 25.11.2018
comment
Привет, как и @atishnaik, я также сталкиваюсь с той же проблемой при передаче правильно сгенерированной ссылки, которую я получил с помощью инструмента по адресу developers.google.com/analytics/devguides/collection/android/v4/. Сгенерированная мной ссылка была play.google.com/store/apps/ Но я все равно получаю not_set в параметрах кампании в приемнике вещания при установке - person saurabhlahoti; 21.06.2019
comment
при проверке с добавлением его работы и не работы из игрового магазина. - person DKV; 17.11.2020

Лучше и надежнее отслеживать реферера через Firebase Dynamic Link.

Ниже показано, как это работает.

https://domain/?link=your_deep_link&apn=package_name[&amv=minimum_version][&ad=1][&al=android_link][&afl=fallback_link]

Вот пример ссылки после заполнения параметров.

https://example.app.goo.gl/?link=https://www.example.com/someresource&apn=com.example.android&amv=3&al=exampleapp://someresource&ibi=com.example.ios&isi=1234567&ius=exampleapp

Конечно, вы можете сократить ссылку до чего-то вроде https://example.app.goo.gl/abcde прямо в консоли Firebase. Настройка Dynamic Link займет всего несколько минут.

Затем в приложении Android на главном Activity вы можете вызвать AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, false) для получения информации о ссылке.

Дополнительную информацию можно найти здесь https://firebase.google.com/docs/dynamic-links/

person Pongpat    schedule 06.07.2016

Я использовал теги 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();
    }
}

--------------------------Манифест----------------------- ----------------

        <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>
person Dheeraj Sachan    schedule 07.07.2016