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 и связывает его с указанным профилем. Если указанный профиль не существует, будет создан новый профиль.
Пример указания профиля при создании WebView2
public async void CreateWebView2Controller(object sender, RoutedEventArgs e)
{
var hwnd = new HwndForWV2();
Window window = new Window();
window.Content = hwnd;
window.Show();
var env = await CoreWebView2Environment.CreateAsync();
var options = env.CreateCoreWebView2ControllerOptions();
options.ProfileName = "MyProfile";
options.IsInPrivateModeEnabled = true;
var controller = await env.CreateCoreWebView2ControllerAsync(hwnd.Handle, options);
controller.Bounds = new System.Drawing.Rectangle(0, 0, 800, 600);
controller.CoreWebView2.Navigate("https://www.bing.com/");
controller.CoreWebView2.NavigationStarting += CoreWebView_NavigationStarting;
}
public async Task InitializeCoreWebView2()
{
CoreWindow coreWindow = Windows.UI.Core.CoreWindow.GetForCurrentThread();
CoreWebView2Environment env = await CoreWebView2Environment.CreateAsync();
CoreWebView2ControllerWindowReference windowReference = CoreWebView2ControllerWindowReference.CreateFromCoreWindow(coreWindow);
CoreWebView2ControllerOptions options = env.CreateCoreWebView2ControllerOptions();
options.ProfileName = "MyProfile";
options.IsInPrivateModeEnabled = true;
CoreWebView2Controller controller = await env.CreateCoreWebView2ControllerAsync(windowReference, options);
controller.CoreWebView2.NavigationStarting += WebView2_NavigationStarting;
controller.CoreWebView2.Navigate("https://www.bing.com");
}
HRESULT AppWindow::CreateControllerWithOptions()
{
auto webViewEnvironment10 = m_webViewEnvironment.try_query<ICoreWebView2Environment10>();
if (!webViewEnvironment10)
{
FeatureNotAvailable();
return S_OK;
}
wil::com_ptr<ICoreWebView2ControllerOptions> options;
// The validation of parameters occurs when setting the properties.
HRESULT hr = webViewEnvironment10->CreateCoreWebView2ControllerOptions(&options);
if (hr == E_INVALIDARG)
{
ShowFailure(hr, L"Unable to create WebView2 due to an invalid profile name.");
CloseAppWindow();
return S_OK;
}
CHECK_FAILURE(hr);
// If call 'put_ProfileName' with an invalid profile name, the 'E_INVALIDARG' returned
// immediately. ProfileName could be reused.
CHECK_FAILURE(options->put_ProfileName(m_webviewOption.profile.c_str()));
CHECK_FAILURE(options->put_IsInPrivateModeEnabled(m_webviewOption.isInPrivate));
#ifdef USE_WEBVIEW2_WIN10
if (m_dcompDevice || m_wincompCompositor)
#else
if (m_dcompDevice)
#endif
{
CHECK_FAILURE(webViewEnvironment10->CreateCoreWebView2CompositionControllerWithOptions(
m_mainWindow, options.get(),
Callback<ICoreWebView2CreateCoreWebView2CompositionControllerCompletedHandler>(
[this](
HRESULT result,
ICoreWebView2CompositionController* compositionController) -> HRESULT {
auto controller =
wil::com_ptr<ICoreWebView2CompositionController>(compositionController)
.query<ICoreWebView2Controller>();
return OnCreateCoreWebView2ControllerCompleted(result, controller.get());
})
.Get()));
}
else
{
CHECK_FAILURE(webViewEnvironment10->CreateCoreWebView2ControllerWithOptions(
m_mainWindow, options.get(),
Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>(
this, &AppWindow::OnCreateCoreWebView2ControllerCompleted)
.Get()));
}
return S_OK;
}
Доступ к профилю и управление им
Объект профиля можно получить, перейдя к свойству Profile элемента управления 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);
}
// ...
}
См. также