Czy można zarejestrować schemat URL oparty na http + dla aplikacji na iPhone ' a, takich jak YouTube i mapy?

Chciałbym mieć iOS do otwierania adresów URL z mojej domeny (np. http://martijnthe.nl) z moją aplikacją za każdym razem, gdy aplikacja jest zainstalowana w telefonie, i z mobilnym Safari W przypadku, gdy nie jest.

Przeczytałem, że możliwe jest utworzenie unikalnego przyrostka protokołu do tego i zarejestrowanie go w Info.plist, ale Mobile Safari da błąd w przypadku, gdy aplikacja nie jest zainstalowana.

Jakie byłoby obejście?

Jeden pomysł:

1) Użyj adresów URL http://, które otwierają się na dowolnym pulpicie przeglądarka i renderować usługę za pośrednictwem przeglądarki

[[0]} 2) Sprawdź User-Agent i jeśli jest to mobilne Safari, Otwórz adres URL myprotocol://, aby (spróbować) otworzyć aplikację na iPhone ' a i otworzyć mobilny iTunes, aby pobrać aplikację na wypadek niepowodzenia

Nie wiem, czy to zadziała... sugestie? Dzięki!

 217
Author: User97693321, 2009-07-10

12 answers

Myślę, że najmniej natrętny sposób na zrobienie tego jest następujący:

  1. sprawdź, czy user-agent jest agentem iPhone / iPod Touch
  2. Sprawdź plik cookie appInstalled
  3. Jeśli plik cookie istnieje i jest ustawiony na true, Ustaw window.location na your-uri:// (lub wykonaj przekierowanie po stronie serwera)
  4. Jeśli plik cookie nie istnieje, otwórz "Czy wiesz, że Twoja nazwa witryny ma aplikację na iPhone' a?"modal Z "tak, już mam", "nie, ale chciałbym spróbować" i " Zostaw mnie w spokoju" guzik.
    1. Przycisk "Yep" ustawia plik cookie na true i przekierowuje do your-uri://
    2. Przycisk " Nie " przekierowuje na " http://itunes.com/apps/yourappname", który otworzy App Store na urządzeniu
    3. Przycisk "Leave me alone" ustawia ciasteczko na false i zamyka modal

Inną opcją, którą grałem, ale znalazłem trochę niezgrabny, było wykonanie następujących czynności w Javascript:

setTimeout(function() {
  window.location = "http://itunes.com/apps/yourappname";
}, 25);

// If "custom-uri://" is registered the app will launch immediately and your
// timer won't fire. If it's not set, you'll get an ugly "Cannot Open Page"
// dialogue prior to the App Store application launching
window.location = "custom-uri://";
 235
Author: Nathan de Vries,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-10 12:18:40

Jest całkiem możliwe, aby to zrobić w JavaScript, tak długo, jak Twój awaryjny jest inny applink. Budowanie na sugestii Nathana :

<html>
  <head>
    <meta name="viewport" content="width=device-width" />
  </head>
  <body>

    <h2><a id="applink1" href="fb://profile/116201417">open facebook with fallback to appstore</a></h2>
    <h2><a id="applink2" href="unknown://nowhere">open unknown with fallback to appstore</a></h2>
    <p><i>Only works on iPhone!</i></p>    

  <script type="text/javascript">

// To avoid the "protocol not supported" alert, fail must open another app.
var appstorefail = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";

function applink(fail){
    return function(){
        var clickedAt = +new Date;
        // During tests on 3g/3gs this timeout fires immediately if less than 500ms.
        setTimeout(function(){
            // To avoid failing on return to MobileSafari, ensure freshness!
            if (+new Date - clickedAt < 2000){
                window.location = fail;
            }
        }, 500);    
    };
}

document.getElementById("applink1").onclick = applink(appstorefail);
document.getElementById("applink2").onclick = applink(appstorefail);

</script>
</body>
</html>

Zobacz demo na żywo tutaj.

 94
Author: jb.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:24

W przypadku urządzeń z systemem iOS 6 istnieje opcja: promowanie aplikacji za pomocą banerów Smart App

 26
Author: ohho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-15 09:49:20

Stwierdziłem, że wybrana odpowiedź działa dla aplikacji przeglądarki, ale miałem problemy z kodem działającym w aplikacjach innych niż przeglądarki, które implementują UIWebView.

Problem dla mnie był użytkownik w aplikacji Twitter kliknąć link, który przeniesie je do mojej strony przez UIWebView w aplikacji Twitter. Następnie, gdy kliknęli przycisk z mojej strony, Twitter stara się być fantazyjny i wypełnić window.location, jeśli strona jest osiągalna. Więc to, co się dzieje, to UIAlertView wyskakuje z informacją, czy na pewno chcesz Kontynuuj, a następnie natychmiast przekierowuje do App Store bez drugiego wyskakującego okienka.

Moje rozwiązanie obejmuje iframes. Pozwala to uniknąć prezentacji UIAlertView, co pozwala na proste i eleganckie wrażenia użytkownika.

JQuery

var redirect = function (location) {
    $('body').append($('<iframe></iframe>').attr('src', location).css({
        width: 1,
        height: 1,
        position: 'absolute',
        top: 0,
        left: 0
    }));
};

setTimeout(function () {
    redirect('http://itunes.apple.com/app/id');
}, 25);

redirect('custom-uri://');

Javascript

var redirect = function (location) {
    var iframe = document.createElement('iframe');
    iframe.setAttribute('src', location);
    iframe.setAttribute('width', '1px');
    iframe.setAttribute('height', '1px');
    iframe.setAttribute('position', 'absolute');
    iframe.setAttribute('top', '0');
    iframe.setAttribute('left', '0');
    document.documentElement.appendChild(iframe);
    iframe.parentNode.removeChild(iframe);
    iframe = null;
};

setTimeout(function () {
    redirect('http://itunes.apple.com/app/id');
}, 25);

redirect('custom-uri://');

EDIT:

Dodaj pozycję absolutną do ramki iframe, aby po wstawieniu nie było przypadkowego bitu białej spacji na dole strony.

Należy również pamiętać, że nie znalazłem potrzeby takiego podejścia z Androidem. Używanie window.location.href powinno działać dobrze.

 23
Author: cnotethegr8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-23 19:00:49

W iOS9 Apple wprowadziło wreszcie możliwość zarejestrowania aplikacji w celu obsługi określonych adresów URL http://: Universal Links.

Bardzo szorstkie wyjaśnienie, jak to działa:

  • deklarujesz zainteresowanie otwieraniem adresów URL http:// dla określonych domen (adresów internetowych) w Twojej aplikacji.
  • na serwerze określonych domen musisz wskazać, które adresy URL otworzyć w której aplikacji, która zadeklarowała zainteresowanie otwieraniem adresów URL z domeny serwera.
  • Ładowanie adresu URL iOS usługa sprawdza wszystkie próby otwarcia adresów URL http:// dla konfiguracji, jak wyjaśniono powyżej i automatycznie otwiera odpowiednią aplikację po zainstalowaniu; bez przechodzenia najpierw przez Safari...
Jest to najczystszy sposób na głębokie łączenie na iOS, niestety działa tylko w iOS9 i nowszych...
 20
Author: severin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-04 10:39:27

Znowu budujemy na odpowiedzi Nathana i JB:

Jak uruchomić aplikację z adresu url bez dodatkowego kliknięcia Jeśli wolisz rozwiązanie, które nie obejmuje tymczasowego kroku kliknięcia łącza, możesz użyć następujących opcji. Dzięki temu javascript, byłem w stanie zwrócić obiekt Httpresponse z Django/Python, który pomyślnie uruchamia aplikację, jeśli jest zainstalowana lub alternatywnie uruchamia app store w przypadku przerwy czasowej. Uwaga musiałem również dostosować czas oczekiwania z 500 do 100 w zamów, aby to działało na iPhone 4S. Przetestuj i dostosuj, aby dopasować go do swojej sytuacji.

<html>
<head>
   <meta name="viewport" content="width=device-width" />
</head>
<body>

<script type="text/javascript">

// To avoid the "protocol not supported" alert, fail must open another app.
var appstorefail = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";

var loadedAt = +new Date;
setTimeout(
  function(){
    if (+new Date - loadedAt < 2000){
      window.location = appstorefail;
    }
  }
,100);

function LaunchApp(){
  window.open("unknown://nowhere","_self");
};
LaunchApp()
</script>
</body>
</html>
 9
Author: BFar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-29 17:26:36
window.location = appurl;// fb://method/call..
!window.document.webkitHidden && setTimeout(function () {
    setTimeout(function () {
    window.location = weburl; // http://itunes.apple.com/..
    }, 100);
}, 600);

document.webkitHidden jest wykrycie, czy Twoja aplikacja jest już wywołana, a bieżąca karta safari przechodzi do tła, ten kod jest z www.baidu.com

 9
Author: zyanlu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-29 15:26:53

Jeśli dodasz iframena swojej stronie internetowej z src ustawionym na niestandardowy schemat dla Twojej aplikacji, iOS automatycznie przekieruje do tej lokalizacji w aplikacji. Jeśli aplikacja nie zostanie zainstalowana, nic się nie stanie. Umożliwia to Głębokie łącze do aplikacji, jeśli jest zainstalowana, lub przekierowanie do sklepu z aplikacjami, Jeśli nie jest zainstalowana.

Na przykład, jeśli masz zainstalowaną aplikację twitter i przejdź do strony internetowej zawierającej następujące znaczniki, zostaniesz natychmiast przekierowany do app.

<!DOCTYPE html>
<html>
    <head>
    <title>iOS Automatic Deep Linking</title>
    </head>
    <body>
        <iframe src="twitter://" width="0" height="0"></iframe>
        <p>Website content.</p>
    </body>
</html>
[4]} Oto bardziej dokładny przykład, który przekierowuje do App store, jeśli aplikacja nie jest zainstalowana:
<!DOCTYPE html>
<html>
    <head>
    <title>iOS Automatic Deep Linking</title>
    <script src='//code.jquery.com/jquery-1.11.2.min.js'></script>
    <script src='//mobileesp.googlecode.com/svn/JavaScript/mdetect.js'></script>
    <script>
      (function ($, MobileEsp) {
        // On document ready, redirect to the App on the App store.
        $(function () {
          if (typeof MobileEsp.DetectIos !== 'undefined' && MobileEsp.DetectIos()) {
            // Add an iframe to twitter://, and then an iframe for the app store
            // link. If the first fails to redirect to the Twitter app, the
            // second will redirect to the app on the App Store. We use jQuery
            // to add this after the document is fully loaded, so if the user
            // comes back to the browser, they see the content they expect.
            $('body').append('<iframe class="twitter-detect" src="twitter://" />')
              .append('<iframe class="twitter-detect" src="itms-apps://itunes.com/apps/twitter" />');
          }
        });
      })(jQuery, MobileEsp);
    </script>
    <style type="text/css">
      .twitter-detect {
        display: none;
      }
    </style>
    </head>
    <body>
    <p>Website content.</p>
    </body>
</html>
 5
Author: q0rban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-09 10:52:57

Nie możesz, o ile wiem, sprawić, że cały system operacyjny zrozumie http: + adres URL domeny. Możesz rejestrować tylko nowe schematy (używam x-darkslide: w mojej aplikacji). Jeśli aplikacja jest zainstalowana, aplikacja Mobile Safari uruchomi ją poprawnie.

Jednak, musiałbyś zająć się sprawą, w której aplikacja nie jest zainstalowana z " Still here? Kliknij ten link, aby pobrać aplikację z iTunes."na twojej stronie.

 2
Author: Fraser Speirs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-10 11:18:55

Oto rozwiązanie.

Konfiguracja sitiacji logicznej za pomocą rozmycia i Ostrości

//see if our window is active
window.isActive = true;
$(window).focus(function() { this.isActive = true; });
$(window).blur(function() { this.isActive = false; });

Połącz swój link za pomocą jQuery click handler, który wywołuje coś takiego.

function startMyApp(){
  document.location = 'fb://';

  setTimeout( function(){
    if (window.isActive) {
        document.location = 'http://facebook.com';
    }
  }, 1000);
}

Jeśli aplikacja się otworzy, stracimy skupienie na oknie i zegar się skończy. w przeciwnym razie nic nie dostajemy i ładujemy zwykły adres URL facebook.

 2
Author: Dane Macaulay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-31 04:40:37

Sprawdź User-Agent i jeśli jest Mobilne Safari, otwórz myprotocol:// Adres URL do (próby) otwarcia iPhone ' a aplikacji i mieć go otworzyć mobilny iTunes do pobieranie aplikacji w przypadku, gdy próba nie powiodła się

Brzmi to rozsądnie, ale nie sądzę, że będziesz w stanie go otworzyć mobilny itunes jako drugi Ośrodek. Myślę, że będziesz musiał wybrać jeden lub drugi-albo przekierować do aplikacji lub do itunes.

Tzn. jeśli przekierujesz na myprotocol://, a aplikacji nie ma w telefonie, nie dostaniesz drugiej szansy na przekierowanie do itunes.

Możesz najpierw przekierować na stronę docelową (zoptymalizowaną dla iphone ' a) i dać użytkownikowi opcję kliknięcia na Twoją aplikację lub na itunes, aby uzyskać aplikację, jeśli jej nie ma? Ale będziesz polegał na tym, że użytkownik postąpi właściwie. (Edit: chociaż można ustawić ciasteczko tak, że jest to tylko po raz pierwszy?)

 0
Author: frankodwyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-10 11:25:51

Szukając rozwiązania problemu pop-up, odkryłem, że Apple ma sposób na obejście tego problemu.

Rzeczywiście, po kliknięciu na ten link , jeśli zainstalowałeś aplikację, zostanie ona przekierowana do niej; w przeciwnym razie zostaniesz przekierowany na stronę internetową, bez żadnego wyskakującego okienka.

 0
Author: Titignes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 15:30:16