Verifique se esquema de URL é suportada em javascript
-
06-07-2019 - |
Pergunta
Existe alguma maneira de verificar se um esquema de URL é atualmente registrado no telefone ... com javascript?
Solução
Não, não a partir de uma página web.
Outras dicas
Não sem problemas. Mas há uma maneira semelhante ao verificar se um pop-up foi bloqueada ou não.
Quando você tentar um esquema de URL que não é suportado, o Safari irá avisar o usuário que não sabe o que fazer com ele e estadia na mesma página.
Então, se você deu o seu app-chamar algum tempo para activar, digamos 300 ms, e depois fazer outra coisa para responder à não-existência do regime.
Não é o mais bonito, mas funciona:
function startIThrown(){
document.location = 'ithrown://restart';
setTimeout(function(){
if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
}
}, 300);
}
<a href="#" onclick="startIThrown()">Restart iThrown</a>
Aqui está uma solução que não mostrar o pop-up quando você voltar a partir do aplicativo, ele pressupõe que você se foi mais de 400 ms:
function startiThrown() {
document.location = appurl;
var time = (new Date()).getTime();
setTimeout(function(){
var now = (new Date()).getTime();
if((now - time)<400) {
if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
}
}
}, 300);
}
Eu encontrei evento pagehide
a ser mais robusto do que dependendo da hora do sistema. Para aqueles de nós que prefere um favor não jQuery, aqui está o trecho.
var appurl = 'custom://url';
var appstore = 'https://itunes.apple.com/us/app/your-app';
var timeout;
function preventPopup() {
clearTimeout(timeout);
timeout = null;
window.removeEventListener('pagehide', preventPopup);
}
function startApp() {
window.location = appurl;
timeout = setTimeout(function(){
if(confirm('You do not seem to have the App installed, do you want to go download it now?')){
document.location = appstore;
}
}, 1000);
window.addEventListener('pagehide', preventPopup);
}
Outra grande (pelo menos de trabalho em versões mais recentes do navegador) solução é verificar se a janela do navegador tem o foco depois de um curto tempo de espera, desta forma você pode mostrar uma caixa de diálogo para o usuário somente se o esquema de URI não funcionou
HTML:
<a class="uri-link" data-uri="qobuzapp://" href="#">URI</a>
Javascript (usando jQuery aqui):
var windowHasFocus;
$(window).focus(function() {
windowHasFocus = true;
}).blur(function() {
windowHasFocus = false;
});
function goToUri(uri) {
window.location = uri;
setTimeout(function(){
if (windowHasFocus) {
if (confirm('You do not seem to have Qobuz installed, do you want to go download it now?')){
window.location = 'http://www.qobuz.com';
}
}
}, 100);
}
$('a').on('click', function(){
goToUri($(this).data('uri'));
});
Aqui está uma jsFiddle trabalhando, apenas atualizá-lo com seu próprio esquema de URI: http://jsfiddle.net/mF6TZ/
A partir de iOS 6.0 Apple apresentou a App Banners inteligentes que fazem o que a maioria de nós está procurando:
- Enviar a App Store se o aplicativo não está instalado.
- Abra a App com uma profunda ligação específica, usando o param app-argumento.
Inclua a seguinte meta tag:
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
tomada a partir daqui: Safari Web Guia de Conteúdo
Aqui é uma variação sobre o anterior 2 soluções. Ele vai criar um link que pode ser aberto no Google Chrome. Se ele falhar, ele abre o link usando http
<script>
function checkChrome(h){
document.location=h;
var time = (new Date()).getTime();
setTimeout(function(){
var now = (new Date()).getTime();
if((now-time)<400) {
if(confirm('Missing Chrome. Download it now?')){
document.location = 'http://itunes.apple.com/us/app/chrome/id535886823?mt=8';
} else {
document.location=h.replace('googlechrome','http');
}
}
}, 300);
}
</script>
<a href="googlechrome://www.google.com" onclick="checkChrome(this.href);return false;">Open Google with Chrome</a>
Este é baseado na resposta de mrahman. Como se observa, por JoshNaro new Date () devolve uma data errada quando chamado dentro do tempo limite. Testes sugerem que a data não é atualizada em tópicos que são iniciados antes de o aplicativo está desativado.
Uma outra setTimeout feio chamado após a ativação irá criar um novo segmento com a data atual.
Esta foi testado em iOS 8.
function startiThrown() {
document.location = appurl;
var time = (new Date()).getTime();
setTimeout(function(){
setTimeout(function(){ // <-- start new thread after activation
var now = (new Date()).getTime();
if((now - time)<400) {
if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
}
}
}, 10); // <-- start new thread after activation
}, 300);
}
Eu tento usar apenas o evento 'pagehide', mas então não trabalho no Firefox. Eu criei esta versão aqui http://jsfiddle.net/thiagomata/6tvoc4f1/2/ que funciona no Firefox, Google Chrome e Safari. Eu não testei no Internet Explorer ainda.
Uma coisa que era necessário para fazê-lo funcionar no Firefox, foi o uso Iframe para definir o src. Isto permite-me para chamar o aplicativo sem sair de minha página.
<a class="uri-link" href="#"
data-uri-app="myapp://"
data-url-app-not-found="http://www.google.com?q=not-found-link"
>
Example 1
</a>
<a class="uri-link" href="#"
data-uri-app="myapp://"
data-url-app-not-found="http://www.google.com?q=not-found-link"
data-url-app-found="http://www.google.com?q=found-link"
>
Example 2
</a>
<a class="uri-link" href="#"
data-uri-app="notexists://"
data-url-app-not-found="http://www.google.com?q=not-exists"
>
Example 3
</a>
<iframe id="callapp" style="display:none"></iframe>
Eu tenho este comentário https://stackoverflow.com/a/18715513/49114 com um plugin jQuery para adicionar link de aplicativo alternativa às ligações regulares.