Isso foi respondido na maior parte, mas vou expandir ...
Passo 1
Meu objetivo era ativar o zoom em determinados momentos e desativá-lo em outros.
// enable pinch zoom
var $viewport = $('head meta[name="viewport"]');
$viewport.attr('content', 'width=device-width, initial-scale=1, maximum-scale=4');
// ...later...
// disable pinch zoom
$viewport.attr('content', 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no');
Passo 2
A tag da janela de visualização seria atualizada, mas o zoom ainda estava ativo !! Eu tive que encontrar uma maneira de fazer a página pegar as mudanças ...
É uma solução de hack, mas alternar a opacidade do corpo resolveu o problema. Tenho certeza de que existem outras maneiras de fazer isso, mas aqui está o que funcionou para mim.
// after updating viewport tag, force the page to pick up changes
document.body.style.opacity = .9999;
setTimeout(function(){
document.body.style.opacity = 1;
}, 1);
etapa 3
Meu problema foi praticamente resolvido neste ponto, mas não completamente. Eu precisava saber o nível de zoom atual da página para que pudesse redimensionar alguns elementos para caber na página (pense nos marcadores de mapa).
// check zoom level during user interaction, or on animation frame
var currentZoom = $document.width() / window.innerWidth;
Espero que isso ajude alguém. Passei várias horas batendo meu mouse antes de encontrar uma solução.
viewport = document.querySelector("meta[name=viewport]"); viewport.setAttribute('content', 'width=1020');
(Apenas para algum contexto: estou colocando isso em uma instância do Drupal um tanto bloqueada ... então não tenho acesso direto à área da cabeça e preciso usar Javascript)