有些人(rén)開發了(le)一個(gè)基于html5的(de)app,開發好了(le),一般會遇到以下(xià)問題。
1.在中國移動網絡下(xià),右下(xià)角多(duō)出來(lái)一個(gè)圓形的(de)中國移動運營商标志(本來(lái)是一件好事,但是移動網絡下(xià),用(yòng)戶手機網速和(hé)流量已經緊缺的(de)情況下(xià),居然還(hái)要加載這(zhè)種耗流量的(de)東東,簡直太反人(rén)類設計了(le))。
2.在wifi網絡下(xià),頁面的(de)底部會偶發性得(de)多(duō)出來(lái)長(cháng)條廣告,嚴重影(yǐng)響頁面的(de)美(měi)觀和(hé)性能(這(zhè)種情況下(xià)應該屬于運營商域名劫持或ip劫持)。
現在,杭諧科技的(de)技術爲大(dà)家提供一種非常好的(de)方法,能夠徹底清除這(zhè)種惡瘤。還(hái)用(yòng)戶一個(gè)清潔的(de)上網環境。這(zhè)裏就說一下(xià)android版本的(de)方法(ios方法同理(lǐ))
實現原理(lǐ):由于中國移動标識和(hé)其他(tā)的(de)廣告都直接會自動在頁面填寫js文件,所以這(zhè)裏直接判斷url是否包含js文件,然後再判斷url是否是本app授權的(de)域名,如果沒有授權說明(míng)是其他(tā)的(de)外部網址,則過濾掉,并在sdcard裏面創建這(zhè)個(gè)js文件,這(zhè)樣就無需關注具體是哪個(gè)js文件,反正不是本站授權的(de)文件統統過濾掉。關鍵是public WebResourceResponse shouldInterceptRequest(WebView view,String url)這(zhè)個(gè)方法,就是截取請求的(de)url然後替換本地的(de)url。當然,你也(yě)可(kě)以用(yòng)這(zhè)個(gè)方法過濾:jpg、png、css等等。反正後期服務商該後綴名了(le),你添加一下(xià)類型就好
webView.setWebViewClient(new WebViewClient(){
@SuppressLint ("NewApi")
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,String url) {
if(url.contains(".js")){
if(!url.contains("hzappkf.com")){
String result = url.substring(url.lastIndexOf('/')+1);
Tools.writeToFile("",getApplicationContext(), result);
return getWebResourceResponse_sdcard(result);
}
}
return super.shouldInterceptRequest(view, url);
}
}
public static void writeToFile(String data,Context context,String fileName) {
if(!fileExists(context,fileName)){
try {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput(fileName, Context.MODE_PRIVATE));
outputStreamWriter.write(data);
outputStreamWriter.close();
}
catch (IOException e) {
}
}
}
@SuppressLint("NewApi")
private WebResourceResponse getWebResourceResponse_sdcard(String fileName){
WebResourceResponse res = new WebResourceResponse("text/javascript", "UTF-8", Tools.readFromFile(getApplicationContext(), fileName));
return res;
}
public static InputStream readFromFile(Context context,String fileName) {
InputStream ret=null;
try {
ret = context.openFileInput(fileName);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ret;
}
public static boolean fileExists(Context context, String filename) {
File file = context.getFileStreamPath(filename);
if(file == null || !file.exists()) {
return false;
}
return true;