2009-03-09 15 views

Odpowiedz

1

Nie, nie ze strony internetowej.

+0

Pomyślałem, że przypomniałem sposób, w jaki aplikacje mogą to sprawdzić, ale prawdopodobnie jestem w błędzie. –

+1

Dzięki za szybką odpowiedź. O ile z natywnego kodu, jest to możliwe przez openUrl: sprawdzić, więc czytałem ... nie testowałem –

+11

@Brent Royal-Gordon: Nie. Natywna aplikacja na iPhone'a może sprawdzić dzwoniąc ** canOpenURL: **. –

55

Nie płynnie. Ale istnieje sposób podobny do sprawdzania, czy wyskakujące okienko zostało zablokowane, czy nie.

Po wypróbowaniu schematu URL, który nie jest obsługiwany, Safari ostrzega użytkownika, że ​​nie wie, co z nim zrobić i pozostać na tej samej stronie.

Więc jeśli dałeś swojej aplikacji czas na aktywację, powiedzmy 300 ms, a następnie zrób coś innego, aby odpowiedzieć na nieistnienie schematu.

To nie jest najładniejszy, ale to działa:

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> 
+0

ładne obejście :) –

+2

Warto było spróbować, ale w rzeczywistości jest to dość nieprzyjemne rozwiązanie. Ta funkcja jest wywoływana, nawet jeśli schemat URL przechodzi po powrocie na stronę. Dzięki temu użytkownik otrzymuje powiadomienie bez względu na wszystko. Albo 1 albo 2, w zależności od tego, czy jego urządzenie obsługuje schemat. – samvermette

+9

@samvermette Istnieje pół-skomplikowane obejście. Jeśli działa schemat adresu URL, aplikacja powinna przesłać potwierdzenie na serwer. Następnie, po powrocie do aplikacji, poproś serwer o wykonanie polecenia ping, aby sprawdzić, czy aplikacja została pomyślnie otwarta. Skomplikowane, ale wykonalne. – Amir

35

Oto rozwiązanie, które nie pokazuje okienko po powrocie z aplikacji, to zakłada, kiedy cię nie ma dłużej niż 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); 
} 
+0

Wystąpił problem, w którym zmienna "teraz" w tym rozwiązaniu jest błędna. Możemy odczekać kilka minut w aplikacji, wrócić do przeglądarki i uzyskać potwierdzenie. Wygląda na to, że proces hibernacji jest błędny. – JoshNaro

1

Oto odmiana dwóch poprzednich rozwiązań. Utworzy on link, który można otworzyć w Google Chrome. Jeśli to się nie powiedzie to otwiera link za pomocą protokołu 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> 
6

Kolejny świetny (przynajmniej działa w najnowszych wersjach przeglądarek) obejście jest aby sprawdzić, czy okno przeglądarka ma koncentrować się po krótkim limitu czasu, w ten sposób można pokazać okno dialogowe dla użytkownika tylko wtedy, gdy schemat URI nie działa

HTML:

<a class="uri-link" data-uri="qobuzapp://" href="#">URI</a>​ 

Javascript (jQuery tutaj):

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')); 
});​ 

Oto pracuje jsFiddle, wystarczy zaktualizować go z własnego schematu URI: http://jsfiddle.net/mF6TZ/

+2

jsfiddle jest martwe – jcesarmobile

10

znalazłem pagehide zdarzenie jest bardziej wytrzymała niż w zależności od czasu systemowego. Dla tych z nas, którzy wolą przysługę nie jQuery, tutaj jest fragment.

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); 
    } 
6

Począwszy od wersji 6.0 iOS firmy Apple przedstawił inteligentnych aplikacji Banery który robić to, co większość z nas szuka:

  • Wyślij do App Store, jeśli aplikacja nie jest zainstalowana.
  • Otwórz aplikację z konkretnym precyzyjnym łączem, używając parametru aplikacji-argumentu.

Dołącz następujący meta tag:

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

podjętą stąd: Safari Web Content Guide

0

Próbuję użyć tylko zdarzenia "pagehide", ale nie działa ono w przeglądarce Firefox. Stworzyłem tę wersję tutaj http://jsfiddle.net/thiagomata/6tvoc4f1/2/ co działa w Firefoksie, Google Chrome i Safari. Nie testowałem jeszcze w Internet Explorerze.

Jedną z rzeczy koniecznych do uruchomienia Firefoksa było użycie Iframe do ustawienia src. Dzięki temu mogę zadzwonić do aplikacji bez opuszczania mojej strony.

<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

fajna koncepcja. mimo że aplikacja nie występuje nigdy. Nawet jeśli aplikacja jest zainstalowana (próbowałem instagram: // app), uruchamia ona ignorowaną aplikację. –

+0

Czy próbowałeś zwiększyć czas oczekiwania? Zmień wartość w linii 95 z 1000 na 9000 (tylko dla zabawy) i powiedz mi, co się stanie. –

1

Jest to oparte na odpowiedzi mrahmana. Jak zauważono, JoshNaro new Date() zwraca niewłaściwą datę, gdy zostanie wywołana w limicie czasu. Testy sugerują, że data nie jest aktualizowana w wątkach, które są uruchamiane przed dezaktywacją aplikacji.

Kolejny nieprzyjemny setTimeout wywołany po aktywacji utworzy nowy wątek z bieżącą datą.

ten był testowany na 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); 
} 
Powiązane problemy