Delphi 11.3 FMX.TWebBrowser安卓访问谷歌地图同意页循环问题
问题分析
使用FMX框架的TWebBrowser(设置为EdgeIfAvailable模式)访问https://www.google.de/maps时,首次加载会正常跳转到Cookie同意页,但在Android设备上点击「接受」或「拒绝」后,页面会陷入同意页反复加载的循环。临时解决方案是通过应用内按钮跳转至谷歌地图的其他随机地址,此时可正常进入地图页面——这说明Cookie已被正确设置,问题出在同意页的重定向环节。
当前论坛提到的shouldOverrideUrlLoading标准实现(如下)无法解决问题,因为它仅通知加载事件并返回False让WebView自行处理,未针对谷歌地图的重定向逻辑做适配:
function TAndroidWebBrowserService.TWebBrowserListener.shouldOverrideUrlLoading(view: JWebView; url: JString): Boolean; begin FWBService.ShouldStartLoading(JStringToString(url)); Result := False; end;
解决方案
1. 重写shouldOverrideUrlLoading处理重定向
修改该方法,手动识别并处理谷歌地图的Cookie同意页重定向,确保跳转时携带已设置的Cookie:
function TAndroidWebBrowserService.TWebBrowserListener.shouldOverrideUrlLoading(view: JWebView; url: JString): Boolean; var SUrl: string; begin SUrl := JStringToString(url); // 检测是否为谷歌Cookie同意页的重定向链接 if Pos('consent.google.com', SUrl) > 0 then begin // 手动加载谷歌地图主页,确保Cookie被正确携带 view.loadUrl(StringToJString('https://www.google.de/maps')); Result := True; // 告知WebView由我们处理该URL end else begin FWBService.ShouldStartLoading(SUrl); Result := False; // 其他URL交给WebView默认处理 end; end;
2. 提前配置WebView的Cookie策略
在TWebBrowser初始化时,确保WebView允许存储第三方Cookie(谷歌地图依赖此设置):
procedure TYourForm.FormCreate(Sender: TObject); var WebView: JWebView; CookieManager: JCookieManager; begin if TOSVersion.Platform = pfAndroid then begin WebView := TAndroidWebBrowserService(WebBrowser1.Service).WebView; CookieManager := TJCookieManager.JavaClass.getInstance; // 启用Cookie存储 CookieManager.setAcceptCookie(True); // Android 5.0及以上允许第三方Cookie if TOSVersion.Check(5) then CookieManager.setAcceptThirdPartyCookies(WebView, True); end; end;
3. 直接使用带Cookie同意参数的URL
构造跳过同意页的谷歌地图URL(参数可能随谷歌策略调整,需测试验证):
https://www.google.de/maps?hl=de&gl=DE&cookie=1
问题根源
并非Android WebView对HTTP 302/303状态码的原生处理存在错误,而是谷歌地图Cookie同意页的重定向逻辑与FMX封装的TWebBrowser默认行为不兼容:点击同意/拒绝后,WebView发起的重定向请求未正确携带刚设置的Cookie,导致服务器再次返回同意页。临时方案有效是因为跳转其他地址时,WebView已携带了之前保存的Cookie,服务器验证通过后允许进入地图页面。
内容的提问来源于stack exchange,提问作者P0wnD
相关产品推荐
相关产品推荐

