Gostaria de saber se é possível detectar se um navegador está sendo executado no iOS, semelhante a como você pode detectar com o Modernizr (embora isso seja obviamente uma detecção de dispositivo e não uma detecção de recurso).
Normalmente, eu preferiria a detecção de recursos, mas preciso descobrir se um dispositivo é iOS devido à maneira como eles lidam com vídeos, de acordo com esta pergunta. A API do YouTube não funciona com iPad / iPhone / dispositivo não Flash
javascript
ios
browser
browser-feature-detection
SparrwHawk
fonte
fonte
Respostas:
Detectando iOS
Eu não sou fã de cheirar o User Agent, mas eis como você faria isso:
Outra maneira é confiar
navigator.platform
:iOS
serátrue
oufalse
Por que não o MSStream
A Microsoft injetou a palavra iPhone no IE11
userAgent
para tentar enganar o Gmail de alguma forma. Portanto, precisamos excluí-lo. Mais informações sobre isso aqui e aqui .Abaixo está a atualização do IE11
userAgent
( Atualização do Internet Explorer para Windows Phone 8.1):Adicione facilmente mais dispositivos, sem usar expressões regulares:
iOS()
serátrue
oufalse
Nota: Ambos
navigator.userAgent
enavigator.platform
podem ser falsificados pelo usuário ou por uma extensão do navegador.Detectando a versão do iOS
A maneira mais comum de detectar a versão do iOS é analisando-a na cadeia de caracteres do User Agent . Mas também há inferência de
detecção derecursos* ;Sabemos que um fato
history API
foi introduzido no iOS4 -matchMedia API
no iOS5 -webAudio API
no iOS6 -WebSpeech API
no iOS7 e assim por diante.Nota: O código a seguir não é confiável e será interrompido se algum desses recursos do HTML5 for descontinuado em uma versão mais recente do iOS. Você foi avisado!
fonte
var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
portanto, essa resposta precisa ser atualizadaApós o iOS 13, você deve detectar dispositivos iOS como este, pois o iPad não será detectado como dispositivos iOS de maneiras antigas (devido às novas opções de "área de trabalho", ativadas por padrão):
A primeira condição para iOS <13 ou iPhone ou iPad com o modo Desktop desativado, a segunda condição para o iPadOS 13 na configuração padrão, uma vez que se posiciona como o Macintosh Intel, mas na verdade é o único Macintosh com multitoque.
Em vez de um hack do que uma solução real, mas trabalhe de maneira confiável para mim
PS Como foi dito anteriormente, você provavelmente deve adicionar um check-up do IE
fonte
navigator.userAgent
para esta verificação/iPad|iPhone|iPod/.test(navigator.platform)
? Parece quenavigator.platform
sempre retorna 'MacIntel' para iPhone iOS <= 12navigator.maxTouchPoints
não é suportado no iOS, portanto, essa verificação não fará nada por você.Isso define a variável
_iOSDevice
como true ou falsefonte
/iPhone|iPod|iPad/.test(navigator.platform)
você pode evitar o!!
Se você estiver usando o Modernizr , poderá adicionar um teste personalizado.
Não importa qual modo de detecção você decida usar (userAgent, navigator.vendor ou navigator.platform), você sempre pode agrupá-lo para facilitar o uso posteriormente.
fonte
return x ? true : false
areturn Boolean(x)
ou apenasreturn !!x
Existem testes Modernizr personalizados: https://gist.github.com/855078
fonte
Uma versão simplificada e fácil de estender.
fonte
navigator.platform.replace(' Simulator', '')
.['str'].indexOf('string') == -1
Provavelmente vale a pena responder que os iPads com iOS 13 terão
navigator.platform
definidoMacIntel
, o que significa que você precisará encontrar outra maneira de detectar dispositivos iPadOS.fonte
Eu escrevi isso há alguns anos, mas acredito que ainda funciona:
fonte
Os agentes do usuário nos dispositivos iOS dizem iPhone ou iPad. Eu apenas filtrei com base nessas palavras-chave.
fonte
Sempre que possível, ao adicionar testes Modernizr, você deve adicionar um teste para um recurso, em vez de um dispositivo ou sistema operacional. Não há nada errado em adicionar dez testes todos os testes para o iPhone, se é isso que é preciso. Algumas coisas simplesmente não podem ser detectadas.
Por exemplo, no vídeo do iPhone (não no iPad) não pode ser reproduzido em linha em uma página da Web, ele abre a tela inteira. Então eu criei um teste 'no-inpage-video'
Você pode usar isso em css (o Modernizr adiciona uma classe
.no-inpagevideo
à<html>
tag se o teste falhar)Isso ocultará o vídeo no iPhone (o que realmente estou fazendo neste caso é mostrar uma imagem alternativa com um clique para reproduzir o vídeo - só não quero que o player de vídeo padrão e o botão play sejam exibidos).
fonte
playsinline
que você possa usar'playsInline' in document.createElement('video');
como teste agora github.com/Modernizr/Modernizr/issues/2077Uau, muitos códigos complicados e longos aqui. Mantenha simples, por favor!
Este é IMHO rápido, economize e funcione bem:
ATUALIZAÇÃO: Isso não cobre o iPad no modo de área de trabalho (e, portanto, o iPadOS 13 padrão).
Isso é bom para os meus casos, se não é para você, veja as respostas de Justin e kikiwora.
fonte
iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
ao invés disso eu fariaiOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform);
como uma medida fallback porque no meu caso navigator.platform não funcionou, mas fazê-lo como mais tarde funcionou bemnavigator.platform
não funcionou? Você está realmente no iOS, então? Verifique com jeka.info/test/navigator.html .userAgent
fornece falsos positivos, porque alguns fornecedores fingem imitar dispositivos Apple por qualquer motivo.vendor
apenas retorna querGoogle Inc.
,Apple Computer, Inc.
ou nada (no Firefox).Atualize levemente a primeira resposta usando uma abordagem mais funcional.
fonte
MacIntel
Você também pode usar
includes
fonte
Nenhuma das respostas anteriores aqui funciona para todos os principais navegadores em todas as versões do iOS, incluindo o iOS 13. Aqui está uma solução que funciona para Safari, Chrome e Firefox para todas as versões do iOS:
Observe que esse trecho de código foi escrito com prioridade na legibilidade, não na concisão ou no desempenho.
Explicação:
Se o agente do usuário contiver algum "iPod | iPhone | iPad", então claramente o dispositivo é iOS. Caso contrário, continue ...
Qualquer outro agente de usuário que não contenha "Macintosh" não é um dispositivo Apple e, portanto, não pode ser iOS. Caso contrário, é um dispositivo Apple, então continue ...
Se
maxTouchPoints
tiver um valor igual1
ou superior, o dispositivo Apple possui uma tela sensível ao toque e, portanto, deve ser iOS, pois não há Macs com telas sensíveis ao toque (parabéns ao kikiwora por mencionarmaxTouchPoints
). Observe quemaxTouchPoints
éundefined
para iOS 12 e abaixo, por isso precisamos de uma solução diferente para esse cenário ...O iOS 12 e abaixo apresentam uma peculiaridade que não existe no Mac OS. A peculiaridade é que a
volume
propriedade de umAudio
elemento não pode ser definida com êxito para qualquer outro valor que não seja1
. Isso ocorre porque a Apple não permite alterações de volume noAudio
elemento para dispositivos iOS, mas para Mac OS. Essa peculiaridade pode ser usada como o método final de fallback para distinguir um dispositivo iOS de um dispositivo Mac OS.fonte
No meu caso, o agente do usuário não era bom o suficiente, pois no Ipad o agente do usuário era o mesmo do Mac OS; portanto, tive que fazer um truque desagradável:
fonte
Para detectar a versão do iOS, é necessário desestruturar o agente do usuário com um código Javascript como este:
fonte
var isiOSSafari = (navigator.userAgent.match(/like Mac OS X/i)) ? true: false;
fonte