You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi TWebBrowser Android:如何离线加载缓存网站而非显示空白页?

解决方案:修改TWebBrowser缓存策略实现GLPI离线UI加载

核心思路

FireMonkey的TWebBrowser在Android平台底层基于Chrome/WebView,只需通过配置原生WebView的缓存模式,就能实现优先加载本地缓存、在线时自动更新的需求,完全无需修改GLPI源码。

具体实现步骤

1. 获取底层WebView实例

首先要从TWebBrowser中拿到Android原生的WebView对象,后续的缓存配置都基于它:

uses
  FMX.WebBrowser.Android, Androidapi.JNI.WebKit;

var
  LAndroidBrowser: TAndroidWebBrowser;
  LWebView: JWebView;
begin
  if WebBrowser1.PlatformBrowser is TAndroidWebBrowser then
  begin
    LAndroidBrowser := TAndroidWebBrowser(WebBrowser1.PlatformBrowser);
    LWebView := LAndroidBrowser.WebView;
    // 后续缓存配置代码写在这里
  end;
end;

2. 配置缓存模式与参数

设置WebView的缓存策略,同时启用必要的前端存储支持(适配GLPI的交互需求):

uses
  Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers;

var
  LSettings: JWebSettings;
  LCacheDir: JFile;
begin
  LSettings := LWebView.getSettings;
  
  // 启用DOM存储,GLPI前端需要该支持
  LSettings.setDomStorageEnabled(True);
  // 开启应用缓存功能
  LSettings.setAppCacheEnabled(True);
  // 设置核心缓存模式:优先用本地缓存,缓存不存在时再走网络
  LSettings.setCacheMode(TJWebSettings.JavaClass.LOAD_CACHE_ELSE_NETWORK);
  
  // 可选:自定义缓存路径与大小(默认路径也可满足需求)
  LCacheDir := TAndroidHelper.Context.getCacheDir;
  LSettings.setAppCachePath(LCacheDir.getAbsolutePath);
  LSettings.setAppCacheMaxSize(1024 * 1024 * 50); // 配置50MB缓存空间
end;

3. 基于网络状态调整缓存逻辑

可以监听设备网络状态,离线时强制仅加载缓存,在线时允许更新缓存内容:

uses
  Androidapi.JNI.Net, Androidapi.JNI.JavaTypes;

// 判断当前是否联网的工具函数
function IsNetworkConnected: Boolean;
var
  LConnectivityManager: JConnectivityManager;
  LNetworkInfo: JNetworkInfo;
begin
  LConnectivityManager := TJConnectivityManager.Wrap(
    TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE));
  LNetworkInfo := LConnectivityManager.getActiveNetworkInfo;
  Result := (LNetworkInfo <> nil) and LNetworkInfo.isConnected;
end;

// 加载URL前调用该逻辑
begin
  if IsNetworkConnected then
    // 在线时用默认模式:优先验证缓存有效性,更新过期资源
    LSettings.setCacheMode(TJWebSettings.JavaClass.LOAD_DEFAULT)
  else
    // 离线时仅加载本地缓存
    LSettings.setCacheMode(TJWebSettings.JavaClass.LOAD_CACHE_ONLY);
  
  WebBrowser1.URL := '你的GLPI地址';
end;

关键注意事项

  • 首次缓存预热:首次启动应用必须保持在线,让WebView完整加载GLPI的所有静态资源(CSS、JS、图片等)到本地缓存,后续离线才能正常展示UI。
  • 缓存自动管理:WebView会自动处理缓存过期逻辑,在线时会向服务器验证资源是否更新,避免加载过时内容。
  • 权限配置:需要在AndroidManifest.xml中添加必要权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

方案优势

完全基于客户端WebView配置实现,不改动GLPI服务器代码,既保留了未来升级GLPI版本的能力(升级后只需在线启动一次即可缓存新资源),也不会影响其他浏览器对GLPI的访问。

内容的提问来源于stack exchange,提问作者Zakaria Mimeche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:32:42