Проверьте, поддерживается ли схема URL в JavaScript - PullRequest
58 голосов
/ 09 марта 2009

Есть ли способ проверить, зарегистрирована ли в данный момент схема URL на телефоне ... с помощью javascript?

Ответы [ 10 ]

59 голосов
/ 10 сентября 2009

Не без проблем. Но есть способ, похожий на проверку, было ли заблокировано всплывающее окно.

Когда вы пытаетесь использовать схему 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>
37 голосов
/ 06 июля 2011

Вот решение, которое не отображает всплывающее окно, когда вы возвращаетесь из приложения, оно предполагает, что вы пропустили более 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);
}
11 голосов
/ 05 февраля 2013

Я нашел событие 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);
  }
7 голосов
/ 20 сентября 2012

Еще один замечательный (по крайней мере, работающий в последних версиях браузера) обходной путь - это проверить, находится ли окно браузера в фокусе после короткого времени ожидания, таким образом, вы можете показать диалоговое окно пользователю, только если схема URI не работает 1001 *

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/

6 голосов
/ 29 августа 2013

Начиная с iOS 6.0 Apple представила Smart App Banners, которые делают то, что ищет большинство из нас:

  • Отправить в App Store, если приложение не установлено.
  • Откройте приложение с определенной глубокой ссылкой, используя параметр аргумента приложения.

Включите следующий метатег:

<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">

взято отсюда: Руководство по веб-контенту Safari

2 голосов
/ 09 марта 2009

Нет, не с веб-страницы.

1 голос
/ 30 апреля 2015

Это основано на ответе Мрахмана. Как отмечается, 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);
}
1 голос
/ 12 июля 2012

Вот вариант предыдущих двух решений. Будет создана ссылка, которую можно открыть в 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>
0 голосов
/ 23 августа 2014

Я пытаюсь использовать только событие '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>
0 голосов
/ 10 сентября 2013

У меня есть этот комментарий https://stackoverflow.com/a/18715513/49114 с плагином jQuery для добавления альтернативной ссылки на приложение к обычным ссылкам.

...