我跟踪访问者的用户名,我想将网页中的用户名数据传递给我的活动方法。传递此数据的正确方法是什么?
(将用户名数据放在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等中使用的通用解决方案。
答案 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" );