Проверьте, поддерживается ли схема URL-адресов в JavaScript.
-
06-07-2019 - |
Вопрос
Есть ли способ проверить, зарегистрирована ли в данный момент схема URL-адресов на телефоне...с яваскриптом?
Решение
Нет, не с веб-страницы.
Другие советы
Не без проблем. Но есть способ, похожий на проверку, было ли заблокировано всплывающее окно.
При попытке использовать схему 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 Store, если приложение не установлено.
- Откройте приложение с определенной глубокой ссылкой, используя параметр app-argument.
Включите следующий метатег:
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
взято отсюда:Руководство по веб-контенту Safari
Вот вариант предыдущих двух решений. Будет создана ссылка, которую можно открыть в 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>
Это основано на ответе Мрахмана. Как отмечается, JoshNaro new Date () возвращает неверную дату при вызове в течение тайм-аута. Тесты показывают, что дата не обновляется в потоках, которые запускаются до деактивации приложения.
Дальнейший уродливый 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 для добавления альтернативная ссылка приложения на обычные ссылки.