Web业已成为移动互联网最普遍的技术形态,绝大多数移动App都包含基于移动Web的模块。由于Web技术的标准性和开放性,App内移动Web场景自身安全面临普遍威胁。移动互联网生态中灰色产业链可以利用典型如:DSN劫持、HTTP劫持、系统内核漏洞利用、恶意网址等恶意手段,较为轻易地实施窃取隐私、欺诈、远程控制等行为,并给合法应用和用户造成利益损害。
传统移动操作系统内核缺乏安全防护的能力,同时,传统的移动安全应用手段也难以为移动Web应用提供细粒度的保护;事实上,几乎所有的移动互联网应用Web场景都遭受过各类安全攻击。
TBS独立于传统的系统内核,基于云防护,本地热修复,腾讯安全云等能力,TBS能为移动应用Web场景提供高效低成本的E2E安全保障。
demo下载http://download.csdn.net/download/cxscxs123cxs/10167776
public class MainActivity extends Activity {
/***
* 使用腾讯com.tencent.smtt.sdk.WebView
* */
private WebView mWebView;
private static final String mHomeUrl = "https://www.jd.com";
private static final String TAG = "SdkDemo";
private static final int MAX_LENGTH = 14;
private boolean mNeedTestPage = false;
private ProgressBar mPageLoadingProgressBar = null;
private ValueCallback uploadFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
try {
if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 11) {
getWindow()
.setFlags(
android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
}
} catch (Exception e) {
}
setContentView(R.layout.activity_main);
mTestHandler.sendEmptyMessageDelayed(MSG_INIT_UI, 10);
}
private void initProgressBar() {
mPageLoadingProgressBar = (ProgressBar) findViewById(R.id.progressBar1);// new
mPageLoadingProgressBar.setMax(100);
mPageLoadingProgressBar.setProgressDrawable(this.getResources().getDrawable(R.drawable.color_progressbar));
}
private void init() {
mWebView = (WebView) findViewById(R.id.webView1);
initProgressBar();
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mTestHandler.sendEmptyMessageDelayed(MSG_OPEN_TEST_URL, 5000);// 5s?
}
});
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsConfirm(WebView arg0, String arg1, String arg2, JsResult arg3) {
return super.onJsConfirm(arg0, arg1, arg2, arg3);
}
@Override
public void onProgressChanged(WebView webView, int newProgress) {
if(newProgress==100){
mPageLoadingProgressBar.setVisibility(View.GONE);//加载完网页进度条消失
}
else{
mPageLoadingProgressBar.setVisibility(View.VISIBLE);//开始加载网页时显示进度条
mPageLoadingProgressBar.setProgress(newProgress);//设置进度值
}
}
View myVideoView;
View myNormalView;
IX5WebChromeClient.CustomViewCallback callback;
/**
* 全屏播放配置
*/
@Override
public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback customViewCallback) {
FrameLayout normalView = (FrameLayout) findViewById(R.id.web_filechooser);
ViewGroup viewGroup = (ViewGroup) normalView.getParent();
viewGroup.removeView(normalView);
viewGroup.addView(view);
myVideoView = view;
myNormalView = normalView;
callback = customViewCallback;
}
@Override
public void onHideCustomView() {
if (callback != null) {
callback.onCustomViewHidden();
callback = null;
}
if (myVideoView != null) {
ViewGroup viewGroup = (ViewGroup) myVideoView.getParent();
viewGroup.removeView(myVideoView);
viewGroup.addView(myNormalView);
}
}
@Override
public boolean onJsAlert(WebView arg0, String arg1, String arg2, JsResult arg3) {
/**
* 这里写入你自定义的window alert
*/
return super.onJsAlert(null, arg1, arg2, arg3);
}
});
mWebView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String arg0, String arg1, String arg2,
String arg3, long arg4) {
TbsLog.d(TAG, "url: " + arg0);
new AlertDialog.Builder(MainActivity.this)
.setTitle("allow to download?")
.setPositiveButton("yes",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(
MainActivity.this,
"fake message: i'll download...",
Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("no",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Toast.makeText(
MainActivity.this,
"fake message: refuse download...",
Toast.LENGTH_SHORT).show();
}
})
.setOnCancelListener(
new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
Toast.makeText(
MainActivity.this,
"fake message: refuse download...",
Toast.LENGTH_SHORT).show();
}
}).show();
}
});
WebSettings webSetting = mWebView.getSettings();
webSetting.setAllowFileAccess(true);
webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSetting.setSupportZoom(true);
webSetting.setBuiltInZoomControls(true);
webSetting.setUseWideViewPort(true);
webSetting.setSupportMultipleWindows(false);
// webSetting.setLoadWithOverviewMode(true);
webSetting.setAppCacheEnabled(true);
// webSetting.setDatabaseEnabled(true);
webSetting.setDomStorageEnabled(true);
webSetting.setJavaScriptEnabled(true);
webSetting.setGeolocationEnabled(true);
webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
webSetting.setAppCachePath(this.getDir("appcache", 0).getPath());
webSetting.setDatabasePath(this.getDir("databases", 0).getPath());
webSetting.setGeolocationDatabasePath(this.getDir("geolocation", 0)
.getPath());
// webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
// webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
// webSetting.setPreFectch(true);
long time = System.currentTimeMillis();
mWebView.loadUrl(mHomeUrl);
TbsLog.d("time-cost", "cost time: "
+ (System.currentTimeMillis() - time));
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().sync();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (mWebView != null && mWebView.canGoBack()) {
mWebView.goBack();
return true;
} else
return super.onKeyDown(keyCode, event);
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
TbsLog.d(TAG, "onActivityResult, requestCode:" + requestCode + ",resultCode:" + resultCode);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case 0:
if (null != uploadFile) {
Uri result = data == null || resultCode != RESULT_OK ? null
: data.getData();
uploadFile.onReceiveValue(result);
uploadFile = null;
}
break;
default:
break;
}
} else if (resultCode == RESULT_CANCELED) {
if (null != uploadFile) {
uploadFile.onReceiveValue(null);
uploadFile = null;
}
}
}
@Override
protected void onNewIntent(Intent intent) {
if (intent == null || mWebView == null || intent.getData() == null)
return;
mWebView.loadUrl(intent.getData().toString());
}
@Override
protected void onDestroy() {
if (mTestHandler != null)
mTestHandler.removeCallbacksAndMessages(null);
if (mWebView != null)
mWebView.destroy();
super.onDestroy();
}
public static final int MSG_OPEN_TEST_URL = 0;
public static final int MSG_INIT_UI = 1;
private final int mUrlStartNum = 0;
private int mCurrentUrl = mUrlStartNum;
private Handler mTestHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_OPEN_TEST_URL:
if (!mNeedTestPage) {
return;
}
String testUrl = "file:///sdcard/outputHtml/html/"
+ Integer.toString(mCurrentUrl) + ".html";
if (mWebView != null) {
mWebView.loadUrl(testUrl);
}
mCurrentUrl++;
break;
case MSG_INIT_UI:
init();
break;
}
super.handleMessage(msg);
}
};
}
运行效果: