Android Webview从标头数据传递到Google Analytics

时间:2013-11-28 13:03:40

标签: android webview google-analytics

我跟踪访问者的用户名,我想将网页中的用户名数据传递给我的活动方法。传递此数据的正确方法是什么?

(将用户名数据放在HTML页面的隐藏div和解析网页是我的最后一个选项,我不喜欢它)

我在Android应用程序中使用Webview。我加载了这样的网址:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
  ...
  String url = "http://example.com";
  webView.postUrl(url, EncodingUtils.getBytes(myPostData, "base64"));
  ...
}

我的网页回复中有一些自定义标题。响应标头包含:

header('User name: michael');

如果页面成功加载,我需要从响应中获取标题,并将其作为自定义维度在我的Google Analytics中使用。

 EasyTracker easyTracker = EasyTracker.getInstance();
 easyTracker.send(MapBuilder
    .createAppView("Home screen")
    .set(Fields.customDimension(1), "michael");
    .build()
);

我的问题是什么是正确的方法?是否有可能从onPageFinished获取它并在Google Analytics代码中设置此标题或者有更好的方法吗?我愿意接受与此结构兼容的任何方法/解决方案。

请注意,我为我的活动覆盖了这些方法:

WebViewClient::onPageStarted(WebView view, String url, Bitmap favicon) 
WebViewClient::onPageFinished(WebView view, String url) 
WebViewClient::shouldOverrideUrlLoading(WebView view, String url) 
WebViewClient::onLoadResource(WebView view, String url) 
WebViewClient::onReceivedError(WebView view, int errorCode, String description, String failingUrl)
WebChromeClient::onProgressChanged(WebView view, int newProgress) 

编辑:
这里有一个类似的答案是3岁:https://stackoverflow.com/a/3134609/429938
但它提供了shouldOverrideUrlLoading中的标题。是不是可以在onPageFinished中捕获它?或者我如何在Webview.postUrl()

中使用它

EDIT2:
另一种解决方案是使用addJavascriptInterface并从javascript代码设置用户名,并在活动中设置Google Analytics代码。但这是Android特定的解决方案。我更喜欢可以在IOS等中使用的通用解决方案。

3 个答案:

答案 0 :(得分:2)

最跨平台的解决方案是一个javascript桥(addJavascriptInterface)。这就是我建议你的。

原生部分也可以在iOS上实现。 HTML部分保持不变。

如果没有,您需要使用其中一个事件(如onPageFinished)实现本机端的所有逻辑。如果无法从此处访问标头,请使用HTTPURLConnection自行执行请求,然后使用loadDataWithBaseURL。

答案 1 :(得分:1)

我正在使用以下代码来了解何时加载页面:

 webview.setWebChromeClient(new WebChromeClient() {
                     public void onProgressChanged(WebView view, int progress)   
                     {
                      MyActivity.setTitle("Loading...");
                      MyActivity.setProgress(progress * 100); 

                        if (progress == 100) {
    //page is successfully loaded and you can get our header.

                         }
                       }
                     });

答案 2 :(得分:1)

试试这个:这里我从标题

获得“用户名”值
HttpURLConnection conn = null;
            final HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
           };
            try {
                URL url = new URL(YOUR_URL);
                if (url.getProtocol().toLowerCase().equals("https")) {
                    trustAllHosts();
                    HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
                    https.setHostnameVerifier(DO_NOT_VERIFY);
                    conn = https;
                } else {
                    conn = (HttpURLConnection) url.openConnection();
                }
                conn.setInstanceFollowRedirects(false);
                conn.connect();
        String location = conn.getHeaderField( "User name" );