亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

使用 AndroidX 增強 WebView 的能力-2

2024-06-17 04:08:57
32
0

代理功能支持

一直以來 WebView 的代理設置異常繁瑣,當遇到復雜的代理規則就無能為力了。在 AndroidX Webkit 中增加了 ProxyController API 用于為 WebView 設置代理。ProxyConfig.Builder 類提供了設置代理以及配置代理的繞過方式等方法,通過組合可以滿足復雜的代理場景。
if (WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) {
    ProxyConfig proxyConfig = new ProxyConfig.Builder()
            .addProxyRule("localhost:7890") //添加要用于所有 URL 的代理
            .addProxyRule("localhost:1080") //優先級低于第一個代理,僅在上一個失敗時應用
            .addDirect()                    //當前面的代理失敗時,不使用代理直連
            .addBypassRule("baidu.com") //該網址不使用代理,直連服務
            .addBypassRule("*.cn")          //以.cn結尾的網址不使用代理
            .build();
    Executor executor = ...
    Runnable listener = ...
    ProxyController.getInstance().setProxyOverride(proxyConfig, executor, listener);
}
以上代碼定義了一個復雜的代理場景,我們為 WebView 設置了兩個代理服務器,localhost:1080 僅當 localhost:7890 失敗的情況下啟用,addDirect 聲明了如果兩個服務器都失敗則直連服務器,addBypassRule 規定了 baidu.com 和以 .so 結尾的域名始終不應該使用代理。

 

白名單代理

如果僅有少量的 URL 需要配置代理,我們可以使用 setReverseBypassEnabled(true) 方法將 addBypassRule 添加的 URL 轉變為使用代理服務器,而其他的 URL 則直連服務。

安全的 WebView 和 Native 通信支持

建立 WebView 和 Native 的雙向通信是使用 Hybrid 混合開發模式的基礎,在之前 Android 已經提供了一些機制能夠完成基本的通信,但是已有的接口都存在一些安全和性能問題,在 AndroidX 中增加了一個功能強大的接口 addWebMessageListener 兼顧了安全和性能等問題。
代碼示例中將 JavaSript 對象 replyObject 注入到匹配 allowedOriginRules 的上下文中,這樣只有在可信的網站中才能被使用此對象,也就防止了不明來源的網絡攻擊者對該對象的利用。
// App (in Java)
WebMessageListener myListener = new WebMessageListener() {
  @Override
  public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
           boolean isMainFrame, JavaScriptReplyProxy replyProxy) {
    // do something about view, message, sourceOrigin and isMainFrame.
    replyProxy.postMessage("Got it!");
  }
};

HashSet<String> allowedOriginRules = new HashSet<>(Arrays.asList("[https:\/\/example.com](https:\/\/example.com/ "https:\/\/example.com")"));
// Add WebMessageListeners.

WebViewCompat.addWebMessageListener(webView, "replyObject", allowedOriginRules,myListener);

調用上述方法之后,在 JavaScript 上下文中我們就可以訪問 myObject,調用 postMessage 就可以回調 Native 端的 onPostMessage 方法并自動切換到主線程執行,當 Native 端需要發送消息給 WebView 時,可以通過 JavaScriptReplyProxy.postMessage 發送到 WebView,并將消息傳遞給 onmessage 閉包。

// Web page (in JavaScript)
myObject.onmessage = function(event) {
  // prints "Got it!" when we receive the app's response.
  console.log(event.data);
}
myObject.postMessage("I'm ready!");

文件傳遞

在以往的通訊機制中,如果我們想傳遞一個圖片只能將其轉換為 base64 等進行傳輸,如果曾經使用過 shouldOverrideUrlLoading 攔截 url 大概率會遇見傳輸瓶頸,AndroidX Webkit 中很貼心的提供了字節流傳遞機制。
Native 傳遞文件給 WebView:
// App (in Java)
WebMessageListener myListener = new WebMessageListener() {
  @Override
  public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
           boolean isMainFrame, JavaScriptReplyProxy replyProxy) {
    // Communication is setup, send file data to web.
    if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_ARRAY_BUFFER)) {
      // Suppose readFileData method is to read content from file.
      byte[] fileData = readFileData("myFile.dat");
      replyProxy.postMessage(fileData);
    }
  }
}
// Web page (in JavaScript)
myObject.onmessage = function(event) {
  if (event.data instanceof ArrayBuffer) {
    const data = event.data;  // Received file content from app.
    const dataView = new DataView(data);
    // Consume file content by using JavaScript DataView to access ArrayBuffer.
  }
}
myObject.postMessage("Setup!");

 

WebView 傳遞文件給 Native:

// Web page (in JavaScript)
const response = await fetch('example.jpg');
if (response.ok) {
    const imageData = await response.arrayBuffer();
    myObject.postMessage(imageData);
}
// App (in Java)
WebMessageListener myListener = new WebMessageListener() {
  @Override
  public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
           boolean isMainFrame, JavaScriptReplyProxy replyProxy) {
    if (message.getType() == WebMessageCompat.TYPE_ARRAY_BUFFER) {
      byte[] imageData = message.getArrayBuffer();
      // do something like draw image on ImageView.
    }
  }
};
0條評論
0 / 1000
wbq
18文章數
0粉絲數
wbq
18 文章 | 0 粉絲
wbq
18文章數
0粉絲數
wbq
18 文章 | 0 粉絲
原創

使用 AndroidX 增強 WebView 的能力-2

2024-06-17 04:08:57
32
0

代理功能支持

一直以來 WebView 的代理設置異常繁瑣,當遇到復雜的代理規則就無能為力了。在 AndroidX Webkit 中增加了 ProxyController API 用于為 WebView 設置代理。ProxyConfig.Builder 類提供了設置代理以及配置代理的繞過方式等方法,通過組合可以滿足復雜的代理場景。
if (WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) {
    ProxyConfig proxyConfig = new ProxyConfig.Builder()
            .addProxyRule("localhost:7890") //添加要用于所有 URL 的代理
            .addProxyRule("localhost:1080") //優先級低于第一個代理,僅在上一個失敗時應用
            .addDirect()                    //當前面的代理失敗時,不使用代理直連
            .addBypassRule("baidu.com") //該網址不使用代理,直連服務
            .addBypassRule("*.cn")          //以.cn結尾的網址不使用代理
            .build();
    Executor executor = ...
    Runnable listener = ...
    ProxyController.getInstance().setProxyOverride(proxyConfig, executor, listener);
}
以上代碼定義了一個復雜的代理場景,我們為 WebView 設置了兩個代理服務器,localhost:1080 僅當 localhost:7890 失敗的情況下啟用,addDirect 聲明了如果兩個服務器都失敗則直連服務器,addBypassRule 規定了 baidu.com 和以 .so 結尾的域名始終不應該使用代理。

 

白名單代理

如果僅有少量的 URL 需要配置代理,我們可以使用 setReverseBypassEnabled(true) 方法將 addBypassRule 添加的 URL 轉變為使用代理服務器,而其他的 URL 則直連服務。

安全的 WebView 和 Native 通信支持

建立 WebView 和 Native 的雙向通信是使用 Hybrid 混合開發模式的基礎,在之前 Android 已經提供了一些機制能夠完成基本的通信,但是已有的接口都存在一些安全和性能問題,在 AndroidX 中增加了一個功能強大的接口 addWebMessageListener 兼顧了安全和性能等問題。
代碼示例中將 JavaSript 對象 replyObject 注入到匹配 allowedOriginRules 的上下文中,這樣只有在可信的網站中才能被使用此對象,也就防止了不明來源的網絡攻擊者對該對象的利用。
// App (in Java)
WebMessageListener myListener = new WebMessageListener() {
  @Override
  public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
           boolean isMainFrame, JavaScriptReplyProxy replyProxy) {
    // do something about view, message, sourceOrigin and isMainFrame.
    replyProxy.postMessage("Got it!");
  }
};

HashSet<String> allowedOriginRules = new HashSet<>(Arrays.asList("[https:\/\/example.com](https:\/\/example.com/ "https:\/\/example.com")"));
// Add WebMessageListeners.

WebViewCompat.addWebMessageListener(webView, "replyObject", allowedOriginRules,myListener);

調用上述方法之后,在 JavaScript 上下文中我們就可以訪問 myObject,調用 postMessage 就可以回調 Native 端的 onPostMessage 方法并自動切換到主線程執行,當 Native 端需要發送消息給 WebView 時,可以通過 JavaScriptReplyProxy.postMessage 發送到 WebView,并將消息傳遞給 onmessage 閉包。

// Web page (in JavaScript)
myObject.onmessage = function(event) {
  // prints "Got it!" when we receive the app's response.
  console.log(event.data);
}
myObject.postMessage("I'm ready!");

文件傳遞

在以往的通訊機制中,如果我們想傳遞一個圖片只能將其轉換為 base64 等進行傳輸,如果曾經使用過 shouldOverrideUrlLoading 攔截 url 大概率會遇見傳輸瓶頸,AndroidX Webkit 中很貼心的提供了字節流傳遞機制。
Native 傳遞文件給 WebView:
// App (in Java)
WebMessageListener myListener = new WebMessageListener() {
  @Override
  public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
           boolean isMainFrame, JavaScriptReplyProxy replyProxy) {
    // Communication is setup, send file data to web.
    if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_ARRAY_BUFFER)) {
      // Suppose readFileData method is to read content from file.
      byte[] fileData = readFileData("myFile.dat");
      replyProxy.postMessage(fileData);
    }
  }
}
// Web page (in JavaScript)
myObject.onmessage = function(event) {
  if (event.data instanceof ArrayBuffer) {
    const data = event.data;  // Received file content from app.
    const dataView = new DataView(data);
    // Consume file content by using JavaScript DataView to access ArrayBuffer.
  }
}
myObject.postMessage("Setup!");

 

WebView 傳遞文件給 Native:

// Web page (in JavaScript)
const response = await fetch('example.jpg');
if (response.ok) {
    const imageData = await response.arrayBuffer();
    myObject.postMessage(imageData);
}
// App (in Java)
WebMessageListener myListener = new WebMessageListener() {
  @Override
  public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
           boolean isMainFrame, JavaScriptReplyProxy replyProxy) {
    if (message.getType() == WebMessageCompat.TYPE_ARRAY_BUFFER) {
      byte[] imageData = message.getArrayBuffer();
      // do something like draw image on ImageView.
    }
  }
};
文章來自個人專欄
文章 | 訂閱
0條評論
0 / 1000
請輸入你的評論
0
0