A API de Múltiplos Perfis webView2 permite-lhe criar e manipular perfis de utilizador para trabalhar com os seus controlos WebView2. Os perfis no WebView2 são conceptualmente semelhantes aos perfis no Microsoft Edge. O suporte de múltiplos perfis permite que uma aplicação WebView2 tenha múltiplos perfis numa única pasta de dados de utilizador.
Cada perfil tem uma pasta de perfil dedicada para guardar dados do browser, que fornece armazenamento de dados de navegação separado para cada utilizador, como cookies, definições de preferência do utilizador e recursos em cache. Todos os controlos WebView2 associados ao mesmo perfil de utilizador partilham uma única pasta de perfil.
Abordagem anterior: Utilizar uma pasta de dados de utilizador diferente para cada controlo WebView2
Anteriormente, sem suporte de múltiplos perfis, para alcançar a separação de dados, uma aplicação WebView2 poderia utilizar pastas de dados de utilizador diferentes para diferentes controlos WebView2. No entanto, nessa abordagem, tem de executar várias instâncias de runtime webView2 (cada uma incluindo um processo do browser e um conjunto de processos subordinados), que consumiram mais recursos do sistema, incluindo memória, espaço na CPU e espaço em disco.
Especificar o perfil ao criar um WebView2
Criar um objeto de opções que define um perfil
O CreateCoreWebView2ControllerOptions método em CoreWebView2Environment cria um objeto de opções, CoreWebView2ControllerOptions, para fornecer informações específicas sobre um perfil, incluindo ProfileName e IsInPrivateModeEnabled. Utilize este objeto para especificar o perfil de destino ao criar uma instância de controlo WebView2.
Criar um controlo WebView2 que utiliza o perfil
Cada Create...Controller método que utiliza um options parâmetro cria um controlo WebView2 e associa-o ao perfil que especificou. Se o perfil especificado não existir, será criado um novo perfil.
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;
}
Aceder e manipular o perfil
Pode obter o objeto de perfil ao aceder à Profile propriedade de um controlo WebView2.
Depois de obter o objeto de perfil, pode manipulá-lo. Utilize CoreWebView2Profile para obter informações de perfil e realizar operações e definições ao nível do 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