A API de Perfis Múltiplos do WebView2 permite criar e manipular perfis de usuário para trabalhar com seus controles WebView2. Os perfis no WebView2 são conceitualmente semelhantes aos perfis no Microsoft Edge. O suporte a vários perfis permite que um aplicativo WebView2 tenha vários perfis em uma única pasta de dados do usuário.
Cada perfil tem uma pasta de perfil dedicada para salvar dados do navegador, que fornece armazenamento de dados de navegação separado para cada usuário, como cookies, configurações de preferência do usuário e recursos em cache. Todos os controles WebView2 associados ao mesmo perfil de usuário compartilham uma única pasta de perfil.
Abordagem anterior: Usando uma pasta de dados do usuário diferente para cada controle WebView2
Anteriormente, sem suporte a vários perfis, para obter a separação de dados, um aplicativo WebView2 poderia usar diferentes pastas de dados do usuário para diferentes controles WebView2. No entanto, nessa abordagem, você deve executar várias instâncias de tempo de execução do WebView2 (cada uma incluindo um processo do navegador e um monte de processos filho), que consumiram mais recursos do sistema, incluindo memória, espaço ocupado pela CPU e espaço em disco.
Especifique o perfil ao criar um WebView2
Criar um objeto de opções que define um perfil
O CreateCoreWebView2ControllerOptions método cria CoreWebView2Environment um objeto options, CoreWebView2ControllerOptions, para fornecer informações específicas sobre um perfil, incluindo ProfileName e IsInPrivateModeEnabled. Use esse objeto para especificar o perfil de destino ao criar uma instância de controle WebView2.
Criar um controle WebView2 que usa o perfil
Cada Create...Controller método que usa um options parâmetro cria um controle WebView2 e o associa ao perfil especificado. Se o perfil especificado não existir, um novo perfil será criado.
Exemplo de especificação do perfil ao criar um 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;
}
Acessar e manipular o perfil
Você pode obter o objeto de perfil acessando a Profile propriedade de um controle WebView2.
Depois de obter o objeto de perfil, você pode manipulá-lo. Use CoreWebView2Profile para obter informações de perfil e fazer configurações e operações em todo o perfil.
Exemplo de acesso e manipulação do perfil
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);
}
// ...
}
Confira também