【问题标题】:Properly tracking install referrals on Play Store在 Play 商店中正确跟踪安装推荐
【发布时间】:2016-10-30 17:07:55
【问题描述】:

我有一个简单的任务:我想跟踪应用安装的推荐 ID 并将其传递给后端。

我做了什么:我创建了一个带有额外参数referrer 的链接,并将其附加到邀请链接。当它打开时,javascript 会检测浏览器是否是 Android 移动浏览器,然后准备一个 intent 并发出指向该意图的重定向。在准备 Intent 时,从 url 中提取 referrer 字段并附加到 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商店应用程序,以便Play商店接收该值并在安装时将其传递给应用程序。

【问题讨论】:

  • 您考虑过 Firebase 动态链接吗?它更好,更可靠。
  • @Pongpat 我还没有调查过。
  • 你感兴趣吗?如果是这样,我可以发布一些简短的解释作为答案。
  • @Pongpat 是的,当然。我会喜欢的。
  • 请看下面我的回答。还请发布您使用但不起作用的链接。

标签: android android-intent android-broadcastreceiver install-referrer


【解决方案1】:

您需要正确测试它,我正在发布我的用例,希望它能解决您的问题:)

推荐网址 -

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 打开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

请看我的链接。如果用户将通过该链接访问 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”之后的所有数据“ 标签。因此,您可以决定在创建引荐来源链接时需要添加哪些数据。

如果您需要更多说明,请告诉我:)

【讨论】:

  • 创建邀请 url 并从 referrer 字段中提取数据很清楚。问题是,当我从移动浏览器打开我的邀请 url 时,如果已安装,我需要打开应用程序;如果未安装,则需要打开 Play 商店。为此,我使用问题中给出的intent。我想知道的是,我应该在intent 中进行哪些更改,以便将推荐值传递给play store 应用程序,以便在安装应用程序时将其取回?
  • 发布了额外的说明,如果您仍有任何疑问,请告诉我:)
  • 我试过这个。有用。告诉我,如果您发布的链接放在a href 中作为促销电子邮件中的一个按钮,或者通过例如 Whatsapp 发送给其他用户,会发生什么?如果安装了我的应用程序或打开 Play 商店应用程序(不是 Chrome 上的 Play 商店),在移动设备上打开此链接是否会单独打开它?
  • 因此,无论您在数据中放入什么数据(例如 - play.google.com/store/apps/… data>),您都将在首次启动后进入 onReceive。所以假设你的链接是play.google.com/store/apps/…。因此,如果用户单击该链接,请转到 Play 商店并下载它。在第一次启动时,您将在 onReceive 中获得 my_test_data。再次进行测试,只需在“referrer”标签之后传递“my_test_data”。
【解决方案2】:

通过 Firebase 动态链接跟踪引荐来源网址会更好、更可靠。

下面是它的工作原理。

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

当然,您可以直接在 Firebase 控制台将链接缩短为 https://example.app.goo.gl/abcde 之类的内容。设置动态链接只需几分钟。

然后在您的主Activity 上的Android 应用程序中,您可以调用AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, false) 来检索链接信息。

更多信息可以在这里找到https://firebase.google.com/docs/dynamic-links/

【讨论】:

    【解决方案3】:

    我用过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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2016-03-18
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多