Uma PWA fora do navegador gerencia a própria janela. Saiba mais sobre as APIs e os recursos para gerenciar uma janela no sistema operacional.
A execução na sua própria janela, gerenciada pela PWA, tem todas as vantagens e responsabilidades de qualquer janela nesse sistema operacional, como:
- A capacidade de mover e redimensionar a janela em sistemas operacionais com várias janelas, como Windows ou ChromeOS.
- Compartilhamento da tela com outras janelas de apps, como no modo de tela dividida do iPadOS ou do Android.
- Aparecem em bases, barras de tarefas e no menu "alt-tab" em computadores e listas de janelas multitarefa em dispositivos móveis.
- A capacidade de minimizar, mover a janela entre telas e áreas de trabalho e fechá-la a qualquer momento.
Mover e redimensionar a janela
A janela da PWA pode ter qualquer tamanho e ser posicionada em qualquer lugar da tela em sistemas operacionais de computador. Por padrão, quando o usuário abre o app pela primeira vez após a instalação, ele recebe um tamanho de janela padrão de uma porcentagem da tela atual, com uma resolução máxima de 1920x1080 posicionada no canto superior esquerdo da tela.
O usuário pode mover e redimensionar a janela, e o navegador vai lembrar da última preferência. Na próxima vez que o usuário abrir o app, a janela vai manter o tamanho e a posição do uso anterior.
Não há como definir o tamanho e a posição preferidos da PWA no
manifesto. Só é possível reposicionar e redimensionar a janela usando a API
JavaScript. No código, é possível mover e redimensionar a janela da PWA usando as funções
moveTo(x, y)
e
resizeTo(x, y)
do objeto window
.
Por exemplo, é possível redimensionar e mover a janela da PWA quando ela é carregada usando:
document.addEventListener("DOMContentLoaded", event => {
// we can move only if we are not in a browser's tab
isBrowser = matchMedia("(display-mode: browser)").matches;
if (!isBrowser) {
window.moveTo(16, 16);
window.resizeTo(800, 600);
}
});
É possível consultar o tamanho e a posição da tela atual usando o objeto
window.screen
. Você pode detectar quando a janela é redimensionada usando o evento resize
do
objeto window
. Não há um evento para capturar o movimento da janela. Portanto, sua
opção é consultar a posição com frequência.
Em vez de mover e redimensionar a janela de forma absoluta, você pode mover de forma relativa
e redimensionar usando moveBy()
e resizeBy()
.
Procurar outros sites
Se você quiser enviar o usuário para um site externo que está fora do escopo da
PWA, faça isso com um elemento HTML <a href>
padrão. Use location.href
ou abra uma nova janela em plataformas compatíveis.
Quando você visita um URL fora do escopo do seu manifesto, o motor do navegador da sua PWA renderiza um navegador no app no contexto da janela.
Alguns recursos dos navegadores no app são:
- Eles aparecem acima do conteúdo.
- Eles têm uma barra de endereço estática mostrando a origem atual, o título da janela
e um menu. Normalmente, eles têm o tema
theme_color
do manifesto. - No menu contextual, você pode abrir esse URL no navegador.
- Os usuários podem fechar o navegador ou voltar.
Enquanto o navegador no app está na tela, o PWA está aguardando em segundo plano, como se outra janela estivesse obscurecendo-o.
![](https://web.developers.google.cn/static/learn/pwa/windows/image/an-app-browser-an-iphon-dddc327f709aa.png?authuser=7&hl=pt)
![](https://web.developers.google.cn/static/learn/pwa/windows/image/an-app-browser-android-3d73f1c909f0b.png?authuser=7&hl=pt)
Fluxos de autorização
Muitos fluxos de autenticação e autorização da Web exigem que o usuário seja redirecionado para um URL diferente em uma origem diferente para adquirir um token que retorna à origem do PWA, como o OAuth 2.0.
Nesses casos, o navegador no app segue este processo:
- O usuário abre sua PWA e clica em "Fazer login".
- O PWA redireciona o usuário para um URL fora do escopo dele, para que o mecanismo de renderização abra um navegador no app.
- O usuário pode cancelar o navegador no app e voltar para a PWA a qualquer momento.
- O usuário faz login no navegador no app. O servidor de autenticação redireciona o usuário para a origem da PWA, enviando o token como um argumento.
- O navegador no app se fecha quando detecta um URL que faz parte do escopo da PWA.
- O mecanismo redireciona a navegação da janela principal do PWA para o URL que o servidor de autenticação acessou enquanto estava no navegador no app.
- O PWA recebe, armazena e renderiza o token.
Forçar a navegação de um navegador
Se você quiser forçar a abertura do navegador com um URL e não um navegador no app, use
a meta _blank
dos elementos <a href>
. Isso funciona apenas em apps da Web
para computador. Em dispositivos móveis, não há opção para abrir um navegador com um URL.
function openBrowser(url) {
window.open("url", "_blank", "");
}
Abrir novas janelas
Em computadores, os usuários podem abrir mais de uma janela do mesmo app da Web progressivo. Cada janela tem
uma navegação diferente para o mesmo start_url
, como se você estivesse abrindo duas
guias do navegador com o mesmo URL.
No menu do PWA, os usuários podem selecionar File e New window. No
código do PWA, é possível abrir uma nova janela com a
função open()
.
function openNewWindow() {
window.open("/", "new-window", "width=600,height=600");
}
Quando você chama open()
em uma janela de PWA no iOS ou iPadOS, ela retorna null
e não abre uma janela. A abertura de novas janelas no Android cria um novo navegador
no app para o URL, mesmo que ele esteja no escopo da sua PWA, que
normalmente não aciona uma experiência de navegação externa.
Título da janela
O elemento <title>
era usado principalmente para SEO, já que o espaço em uma guia do navegador é limitado. Quando você muda do navegador para a janela em um PWA, todo o espaço da barra de título fica disponível.
É possível definir o conteúdo da barra de título:
- Estático no elemento
<title>
HTML. - Mudança dinâmica da propriedade de string
document.title
a qualquer momento.
Em PWAs para computador, o título é essencial e é usado na barra de título da janela e, às vezes, no gerenciador de tarefas ou na seleção de várias tarefas. Se você tiver um aplicativo de página única, atualize o título em todas as rotas.
Modo com guias
O modo de guias é um recurso experimental que permite que seu PWA tenha um design baseado em guias, semelhante a um navegador da Web. Nesse caso, o usuário pode abrir várias guias no mesmo PWA, mas todas vinculadas na mesma janela do sistema operacional.
Saiba mais sobre esse recurso experimental em Modo de aplicativo com guias para PWA.
Sobreposição dos controles da janela
Já mencionamos que é possível mudar o título da janela definindo o valor do
elemento <title>
ou da propriedade document.title
. Mas ele sempre é um valor
de string. E se pudéssemos projetar a barra de título com HTML, CSS e imagens?
A sobreposição de controles de janela, um recurso experimental no Microsoft Edge e no Google
Chrome para PWAs para computador, pode ajudar.
Saiba mais sobre esse recurso em Personalizar a sobreposição de controles da janela da barra de título do PWA.
Como gerenciar janelas
Com várias telas, os usuários querem usar todo o espaço disponível. Por exemplo:
- Editores gráficos com várias janelas, como o Gimp, podem colocar várias ferramentas de edição em janelas posicionadas com precisão.
- As mesas de negociação virtuais podem mostrar tendências de mercado em várias janelas, que podem ser visualizadas no modo de tela cheia.
- Os apps de apresentação de slides podem mostrar anotações do orador na tela principal interna e a apresentação em um projetor externo.
A API Window Management permite que os PWAs façam isso e muito mais.
Como conferir detalhes da tela
A API Window Management adiciona um novo método, window.getScreenDetails()
, que retorna um objeto com telas como uma matriz imutável de telas anexadas. Também há um objeto em tempo real acessível em ScreenDetails.currentScreen
, correspondente ao window.screen
atual.
O objeto retornado também dispara um evento screenschange
quando a matriz screens
muda. Isso não acontece quando os atributos em telas individuais são alterados. Telas individuais, window.screen
ou uma tela na matriz screens
, também acionam um evento change
quando os atributos delas mudam.
// Request an object with a screen objects
const screenDetails = await window.getScreenDetails();
screenDetails.screens[0].isPrimary; // e.g. true
screenDetails.screens[0].isInternal; // e.g. true
screenDetails.screens[0].label; // e.g. 'Samsung Electric Company 28"'
// Access the live object corresponding to the current `window.screen`.
// The object is updated on cross-screen window placements or device changes.
screenDetails.currentScreen;
screenDetails.addEventListener('screenschange', function() {
// NOTE: Does not fire on changes to attributes of individual screens.
const screenCount = screenDetails.screens.length;
const currentScreen screenDetails.currentScreen.id;
});
Se o usuário ou o sistema operacional mover a janela da PWA de uma tela para
outra, um evento currentscreenchange
também será acionado pelo objeto de detalhes
da tela.
Bloqueio de tela ativada
Imagine o seguinte. Você está na cozinha seguindo uma receita no seu tablet. Você acabou de preparar os ingredientes. Suas mãos estão sujas, e você volta para o dispositivo para ler a próxima etapa. Desastre! A tela ficou preta. A API Screen Wake Lock permite que um PWA impeça que as telas sejam escurecidas, entrem em suspensão ou sejam bloqueadas, permitindo que os usuários parem, iniciem, saiam e voltem sem se preocupar.
// Request a screen wake lock
const wakeLock = await navigator.wakeLock.request();
// Listen for wake lock release
wakeLock.addEventListener('release', () => {
console.log(`Screen Wake Lock released: ${wakeLock.released}`);
});
// Manually release the wake lock
wakeLock.release();
Teclado virtual
Dispositivos com tela touch, como smartphones e tablets, oferecem um teclado virtual na tela para que o usuário possa digitar quando os elementos de formulário do seu PWA estiverem em foco.
Com a API VirtualKeyboard, sua PWA pode ter
mais controle do teclado em plataformas compatíveis usando a
interface navigator.virtualKeyboard
.
- Mostre e oculte o teclado virtual com
navigator.virtualKeyboard.show()
enavigator.virtualKeyboard.hide()
. - Informe ao navegador que você está fechando o teclado virtual definindo
navigator.virtualKeyboard.overlaysContent
comotrue
. - Saiba quando o teclado aparece e desaparece com o evento
geometrychange
. - Defina a política do teclado virtual ao editar elementos do host definindo
contenteditable
comoauto
oumanual
, com o atributo HTMLvirtualkeyboardpolicy
. Uma política permite decidir se você quer que o teclado virtual seja gerenciado automaticamente pelo navegador (auto
) ou pelo script (manual
). - Use variáveis de ambiente do CSS para receber informações sobre a aparência
do teclado virtual, como
keyboard-inset-height
ekeyboard-inset-top
.
Leia mais sobre essa API em Controle total com a API VirtualKeyboard.