Апну тему.
На этот раз - Tokio upd1, с патчем под iOS11.
Что требуется: скопировать в папку с проектом (рядом с dpr) файл FMX.WebBrowser.pas. В нем внести изменения в метод TCustomWebBrowser.FormHandleCreated, чтобы он выглядел следующим образом:
procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage);
function GetParentForm(Control: TFmxObject): TCommonCustomForm;
begin
if (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then
Result := TCommonCustomForm(Control.Root.GetObject)
else
Result := nil;
end;
var
WBService : IFMXWBService;
begin
if not (csDesigning in ComponentState) and ((FWeb = nil) or (Sender = GetParentForm(self as TFmxObject))) and
TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then
begin
WBService.DestroyWebBrowser(FWeb); // добавлена эта строка.
FWeb := WBService.CreateWebBrowser;
FWeb.SetWebBrowserControl(Self);
FWeb.UpdateContentFromControl;
FWeb.URL := FURL;
FWeb.Navigate;
end;
end;
Что дает правка:
допустим, у вас есть WB на главной форме и на дочерней форме (или фрейме - без разницы), которая создается / уничтожается динамически. При создании вторичной формы метод FormHandleCreated вызывается дважды, при этом FWeb, созданный в первом вызове просто забывается, но не уничтожается (сильная ссылка в списке веббраузеров в WBService). Дальше вторичная форма уничтожается (захватывая с собой FWeb, созданный при втором вызове FormHandleCreated ), а в "забытом" FWeb остаются невалидные ссылки на родителя. Что при вызове метода TWBFactoryService.RealignBrowsers (активация / изменение размеров формы) приведет к AV.
Внесенное изменение удаляет FWeb из списка WBService, и в дальнейшем ничего не мешает его спокойному уничтожению.