Stellen Sie fest, ob eine App vorhanden ist, und starten Sie diese App unter iOS


74

Gibt es eine Möglichkeit, iOS zu überprüfen, ob eine andere App installiert und dann gestartet wurde? Wenn mir das Gedächtnis dient, war dies in früheren Versionen nicht möglich, aber wurde dies geändert?


1
Ich denke, das muss irgendwie möglich sein - ich sage das, weil die Facebook SDK-Implementierung die Facebook-App startet, wenn sie installiert wird, sonst wird sie auf Safari zurückgreifen. Sie müssen einige Informationen über die andere App kennen, da Sie bei Facebook einige Registrierungsinformationen zu Ihrer eigenen App hinzufügen müssen.
Tomas McGuinness

Ja, ich denke, wenn Sie die App-ID kennen, können Sie sie überprüfen und irgendwie starten. Aber ich kann keinen Hinweis darauf finden. Ich hatte gehofft, jemand hat das versucht.
Rob

5
Einfach genug, zB: NSURL * urlApp = [NSURL URLWithString: @ "fb: //"]; BOOL canOpenFBApp = [[UIApplication sharedApplication] canOpenURL: urlApp]; printf ("\ n canOpenFBApp:% i \ n", canOpenFBApp);
Dijipiji

Antworten:


66

Machbar, aber knifflig.

Das Starten installierter Apps wie der FB- oder Twitter-Apps erfolgt über das benutzerdefinierte URL-Schema. Diese können sowohl in anderen Apps als auch auf Websites verwendet werden.

Hier ist ein Artikel darüber, wie Sie dies mit Ihrer eigenen App tun können .

Es kann jedoch schwierig sein, festzustellen, ob die URL vorhanden ist. Ein gutes Beispiel für eine App, die installierte Apps erkennt, ist Boxcar . Die Sache hier ist, dass Boxcar fortgeschrittene Kenntnisse der benutzerdefinierten URLs hat. Ich bin mir ziemlich sicher (99%), dass es eine canOpenURL:gibt. Wenn Sie also das benutzerdefinierte Schema der App kennen, auf die Sie im Voraus abzielen möchten, ist dies einfach zu implementieren.

Hier ist eine unvollständige Liste einiger der beliebtesten URLs, anhand derer Sie überprüfen können.

Es gibt eine Möglichkeit, die URL der benutzerdefinierten App herauszufinden: https://www.amerhukic.com/finding-the-custom-url-scheme-of-an-ios-app

Wenn Sie jedoch nach Apps suchen und deren URLs ableiten möchten, ist dies auf einem Nicht-JB-Gerät nicht möglich.

Hier ist ein Blog-Beitrag darüber, wie die Leute bei Bump mit dem Problem umgegangen sind.


In iHasApps finden Sie eine Liste der Apps auf dem Benutzergerät.
1789040

Vielen Dank an Doug für die Bereitstellung dieser Links. Ich hatte eine ähnliche Frage zu diesem Beitrag. Ich habe Sie in meinem Beitrag erwähnt (bitte bearbeiten Sie ihn, wenn Sie dort nicht erwähnt werden möchten).
Silex

6
Links sind tot.
Greg Hilston


41

Es gibt ein Skript wie das folgende.

<script type="text/javascript">
function startMyApp()
{
  document.location = 'yourAppScheme://';
  setTimeout( function()
  {
      if( confirm( 'You do not seem to have Your App installed, do you want to go download it now?'))
      {
        document.location = 'http://itunes.apple.com/us/app/yourAppId';
      }
  }, 300);
 }
</script>

<a href="#" onclick="startMyApp()">Try to start MyApp</a>Wenn Sie dieses Skript über das Web ( ) aufrufen, können Sie feststellen, ob Ihre App mit dem Schema "yourAppScheme" auf dem Gerät installiert ist oder nicht.

Die App wird gestartet, wenn sie auf dem Gerät installiert ist und "yourAppScheme" darin registriert ist. Wenn die App nicht installiert ist, können Sie dem Benutzer vorschlagen, diese App über iTunes zu installieren.


22
Trotzdem wird die Fehlermeldung angezeigt, die von Safari kommt, wenn die App nicht vorhanden ist.
Shebelaw

9
Weiß jemand, wie man diese Fehlermeldung von Safari vermeidet, wenn die App nicht installiert ist?
Davidk

1
Ja das ist richtig, wie können wir diese Fehlermeldung "Seite kann nicht geöffnet werden" in Safari vermeiden, wenn die App nicht installiert ist?
Hardik Thakkar

3
Dies scheint ein Hack zu sein, und ein instabiler auch ... Nach dem redirect ( document.location) sollte JS die Ausführung beenden, daher sollte die Funktion in setTimeoutniemals ausgeführt werden. Nicht, dass ich einen besseren Weg kenne (es sei denn, iOS Smart App Banner reichen für Ihre Bedürfnisse aus). Würde gerne als falsch erwiesen werden.
Johndodo

2
@ Johndodo Genau das ist der Punkt. Wenn die Umleitung erfolgreich ist , stoppt keinen JavaScript ausführen, so dass der Timeout - Block zu vermeiden (es soll jedoch wirklich die aktuelle Zeit gegen die Beginnzeit überprüft werden , weil es wird die Ausführung fortgesetzt werden, wenn der Benutzer wieder in Safari geht später). Wenn die Umleitung fehlschlägt, sieht der Benutzer zwei Nachrichten: die erste hässliche, die von Safari bereits erwähnt wurde, aber eine zweite vom Benutzer bereitgestellte und etwas entschuldigende Nachricht, um die erste zu erklären. Es ist nicht ideal, aber zumindest nicht so verwirrend, als nur diesen ersten Fehler zu sehen.
devios1

22

So überprüfen Sie, ob eine App installiert ist (z. B. Löschen):

BOOL installed = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"clearapp://"]];

So öffnen Sie diese App:

BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"clearapp://"]];

1
Genau das, wonach ich gesucht habe!
Jamal Zafar


Um die Benutzerdefinierung einer App zu finden: amerhukic.com/finding-the-custom-url-scheme-of-an-ios-app
Computingfreak

13

Blendet die Fehlermeldung aus, wenn die App nicht installiert ist

Bei Branch verwenden wir eine Form des folgenden Codes - beachten Sie, dass der Iframe in mehr Browsern funktioniert. Ersetzen Sie einfach den URI Ihrer App und Ihren App Store-Link.

<!DOCTYPE html>
<html>
    <body>
        <script type="text/javascript">
            window.onload = function() {
                // Deep link to your app goes here
                document.getElementById("l").src = "my_app://";

                setTimeout(function() {
                    // Link to the App Store should go here -- only fires if deep link fails                
                    window.location = "https://itunes.apple.com/us/app/my.app/id123456789?ls=1&mt=8";
                }, 500);
            };
        </script>
        <iframe id="l" width="1" height="1" style="visibility:hidden"></iframe>
    </body>
</html>

Es gibt eine zweite Möglichkeit, die sich zuerst auf Cookies stützt und die Javascript-Weiterleitung nur als Fallback. Hier ist die Logik:

Wenn ein Benutzer ohne App zum ersten Mal auf einen Link zu Ihrer App tippt, wird er direkt zum App Store weitergeleitet. Dies wird erreicht, indem ein Link zu Ihrer App tatsächlich eine dynamisch generierte Seite auf Ihren Servern mit der Umleitung ist. Sie erstellen ein Cookie und protokollieren einen "digitalen Fingerabdruck" von IP-Adresse, Betriebssystem, Betriebssystemversion usw. in Ihrem Backend.

Wenn der Benutzer die App installiert und öffnet, sammeln Sie einen weiteren "digitalen Fingerabdruck" und senden ihn an Ihr Backend. Jetzt weiß Ihr Backend, dass der Link installiert ist. Bei allen nachfolgenden Besuchen von Links, die Ihrer App zugeordnet sind, stellen Ihre Server sicher, dass die dynamisch generierte Weiterleitungsseite auf der Grundlage des mit der Anforderung gesendeten Cookies zur App und nicht zum App Store führt.

Dies vermeidet die hässliche Weiterleitung, erfordert jedoch eine Tonne mehr Arbeit.


1
Universal Links kommen :)
st.derrick

Ist die my_app hier die appnameoder die appID?
Nimsrules

2

Nach meinem Verständnis können Sie aus Datenschutzgründen nicht sehen, ob eine App auf dem Gerät installiert ist. Um dies zu umgehen, müssen Sie versuchen, die App zu starten. Wenn sie nicht gestartet wird, muss der Benutzer die Fallback-URL drücken. Um zu verhindern, dass der Fehler bei der mobilen Safari auftritt, habe ich festgestellt, dass das Platzieren in einem Iframe zur Behebung des Problems beiträgt.

Hier ist ein Codeausschnitt, den ich verwendet habe.

<form name="mobileForm" action="mobile_landing.php" method="post">
        <input type="hidden" name="url" value="<?=$web_client_url?>">
        <input type="hidden" name="mobile_app" value="<?=$mobile_app?>">
        <input type="hidden" name="device_os" value="<?=$device_os?>">
    </form>
<script type="text/javascript">
        var device_os = '<? echo $device_os; ?>'; 


        if (device_os == 'ios'){

        var now = new Date().valueOf(); 
        setTimeout(function () { 
            if (new Date().valueOf() - now > 100) 
                return;

        document.forms[0].submit(); }, 5); 


        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(){
            window.close()
            }, 150 );

        redirect("AppScheme");

1

Ich hatte kürzlich Probleme damit, und hier ist die Lösung, die ich gefunden habe. Beachten Sie, dass es immer noch keine todsichere Möglichkeit gibt, festzustellen, ob die App gestartet wurde oder nicht.

Ich stelle eine Seite von meinem Server bereit, die beim Erkennen des User-Agent zu einer iPhone-spezifischen Variante umleitet. Links zu dieser Seite können nur per E-Mail / SMS oder Facebook geteilt werden.

Die Seite rendert eine minimale Version des Dokuments, auf das verwiesen wird, versucht dann jedoch automatisch, die App zu öffnen, sobald sie geladen wird, und verwendet dabei einen versteckten <iframe> (AJAX schlägt in dieser Situation immer fehl - Sie können dafür weder jQuery noch XMLHttpRequest verwenden ).

Wenn das URL-Schema registriert ist, wird die App geöffnet und der Benutzer kann alles tun, was er benötigt. In beiden Fällen wird auf der Seite unten die folgende Meldung angezeigt: "Wurde die App gestartet? Wenn nicht, haben Sie sie wahrscheinlich noch nicht installiert ..." mit einem Link zum Store.


1
Dies zeigt immer noch die hässliche Meldung "Safari kann die Seite nicht öffnen, weil die Adresse ungültig ist." - Warnung, wenn die App nicht installiert ist, oder? Ich möchte wirklich eine Methode finden, um diese Warnung zu bestehen. Die Lösungen, die eine automatische Umleitung nach einem kurzen Intervall oder die Anzeige einer Bestätigung vorschlagen, sind für mein Projekt nicht gut genug.
Gustav
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.