Поддержка нескольких профилей в одной папке данных пользователя
Мақала
API нескольких профилей WebView2 позволяет создавать профили пользователей и управлять ими для работы с элементами управления WebView2. Профили в WebView2 концептуально похожи на профили в Microsoft Edge. Поддержка нескольких профилей позволяет приложению WebView2 иметь несколько профилей в одной папке данных пользователя.
Каждый профиль имеет выделенную папку профиля для сохранения данных браузера, которая предоставляет отдельное хранилище данных браузера для каждого пользователя, например файлы cookie, параметры предпочтений пользователя и кэшированные ресурсы. Все элементы управления WebView2, связанные с одним профилем пользователя, совместно используют одну папку профиля.
Предыдущий подход: использование другой папки данных пользователя для каждого элемента управления WebView2
Ранее без поддержки нескольких профилей для разделения данных приложение WebView2 могло использовать разные пользовательские папки данных для различных элементов управления WebView2. Однако при таком подходе необходимо запустить несколько экземпляров среды выполнения WebView2 (каждый из которых включает в себя процесс браузера и несколько дочерних процессов), которые потребляют больше системных ресурсов, включая память, объем ЦП и дисковое пространство.
Указание профиля при создании WebView2
Создание объекта options, определяющего профиль
Метод CreateCoreWebView2ControllerOptions в CoreWebView2Environment создает объект параметров , CoreWebView2ControllerOptionsчтобы предоставить конкретные сведения о профиле, включая ProfileName и IsInPrivateModeEnabled. Этот объект используется для указания целевого профиля при создании экземпляра элемента управления WebView2.
Создание элемента управления WebView2, использующего профиль
Каждый Create...Controller метод, принимаюющий options параметр, создает элемент управления WebView2 и связывает его с указанным профилем. Если указанный профиль не существует, будет создан новый профиль.
Получив объект профиля, вы можете управлять им. Используйте CoreWebView2Profile для получения сведений о профиле и выполнения параметров и операций на уровне профиля.
string profileName = controller.CoreWebView2.Profile.ProfileName;
bool inPrivate = controller.CoreWebView2.Profile.IsInPrivateModeEnabled;
// update window title with profileName
UpdateAppTitle(profileName);
// update window icon
SetAppIcon(inPrivate);
string profileName = controller.CoreWebView2.Profile.ProfileName;
bool inPrivate = controller.CoreWebView2.Profile.IsInPrivateModeEnabled;
// update window title with profileName
UpdateAppTitle(profileName);
// update window icon
SetAppIcon(inPrivate);
// This is the callback passed to CreateCoreWebView2Controller.
// Here we can get the profile property of the WebView2 control, then manipulate it.
HRESULT AppWindow::OnCreateCoreWebView2ControllerCompleted(HRESULT result, ICoreWebView2Controller* controller)
{
// ...
m_controller = controller;
wil::com_ptr<ICoreWebView2> coreWebView2;
CHECK_FAILURE(m_controller->get_CoreWebView2(&coreWebView2));
// We should check for failure here because if this app is using a newer
// SDK version compared to the install of the Edge browser, the Edge
// browser might not have support for the latest version of the
// ICoreWebView2_N interface.
coreWebView2.query_to(&m_webView);
// Save PID of the browser process serving last WebView created from our
// CoreWebView2Environment. We know the controller was created with
// S_OK, and it hasn't been closed (we haven't called Close and no
// ProcessFailed event could have been raised yet) so the PID is
// available.
CHECK_FAILURE(m_webView->get_BrowserProcessId(&m_newestBrowserPid));
auto webView2_13 = coreWebView2.try_query<ICoreWebView2_13>();
if (webView2_13)
{
wil::com_ptr<ICoreWebView2Profile> profile;
CHECK_FAILURE(webView2_13->get_Profile(&profile));
wil::unique_cotaskmem_string profile_name;
CHECK_FAILURE(profile->get_ProfileName(&profile_name));
m_profileName = profile_name.get();
BOOL inPrivate = FALSE;
CHECK_FAILURE(profile->get_IsInPrivateModeEnabled(&inPrivate));
if (!m_webviewOption.downloadPath.empty())
{
CHECK_FAILURE(profile->put_DefaultDownloadFolderPath(
m_webviewOption.downloadPath.c_str()));
}
// update window title with m_profileName
UpdateAppTitle();
// update window icon
SetAppIcon(inPrivate);
}
// ...
}