Проверьте, поддерживается ли схема URL в javascript
есть ли способ проверить, если схема URL в настоящее время зарегистрирована на телефоне... с помощью javascript?
10 ответов:
Не плавно. Но есть способ, похожий на проверку, если всплывающее окно было заблокировано или нет.
при попытке использовать схему URL, которая не поддерживается, Safari предупредит пользователя, что он не знает, что с ней делать, и останется на той же странице.
Итак, если вы дали своему приложению-вызовите некоторое время для активации, скажем, 300 мс, а затем сделайте что-то еще, чтобы ответить на несуществование схемы.
Это не самый красивый, но он работает:
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>
вот решение, которое не показывает всплывающее окно, когда вы возвращаетесь из приложения, он предполагает, что вы ушли дольше, чем 400 мс:
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); }
нашел
pagehide
мероприятие будет более надежным, чем в зависимости от системного времени. Для тех из нас, кто предпочитает не на jQuery пользу, вот фрагмент.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); }
еще один отличный (по крайней мере, работающий в последних версиях браузера) обходной путь-проверить, имеет ли окно браузера Фокус после короткого тайм-аута, таким образом, вы можете показать диалоговое окно пользователю только в том случае, если схема URI не работала
HTML:
<a class="uri-link" data-uri="qobuzapp://" href="#">URI</a>
Javascript (используя jQuery здесь):
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')); });
вот рабочий jsFiddle, просто обновите его с помощью собственной схемы URI: http://jsfiddle.net/mF6TZ/
начиная с iOS 6.0 Apple представила смарт-баннеры приложений, которые делают то, что большинство из нас ищут:
- отправить в магазин приложений, если приложение не установлено.
- Откройте приложение с определенной глубокой ссылкой, используя параметр app-argument.
добавить следующий мета-тег:
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
взято отсюда: Safari Web Content Guide
вот вариация на предыдущие 2 решения. Он создаст ссылку, которую можно открыть в Google Chrome. Если это не удается, он открывает ссылку с помощью 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>
это основано на ответе мрамана. Как уже отмечалось, Джошнаро новая дата() возвращает неправильную дату при вызове внутри тайм-аута. Тесты показывают, что дата не обновляется в потоках, которые запускаются до деактивации приложения.
еще один уродливый setTimeout, вызванный после активации, создаст новый поток с текущей датой.
Это было протестировано на 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); }
Я пытаюсь использовать только событие "pagehide", но тогда оно не работает в Firefox. Я создал эту версию здесь http://jsfiddle.net/thiagomata/6tvoc4f1/2/ что работает в Firefox, Google Chrome и Safari. Я еще не тестировал в Internet Explorer.
одна вещь, которая была необходима, чтобы заставить его работать в Firefox, было использование Iframe для установки src. Это позволяет мне позвонить в приложение, не выходя из моей страницы.
<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>
У меня есть этот комментарий https://stackoverflow.com/a/18715513/49114 с плагином jQuery, чтобы добавить альтернативную ссылку приложения на обычные ссылки.