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
相关产品推荐
相关产品推荐

