
Hinter dem Code: App öffnen oder im Browser landen
Ein Code am Bushäuschen, und es passiert eines von drei Dingen. Die App öffnet genau den richtigen Bildschirm. Ein Browser öffnet die richtige Seite. Oder es erscheint die Meldung, die Adresse sei ungültig, und das Plakat hat seine einzige Gelegenheit bei Ihnen verspielt. Welcher der drei Fälle eintritt, entscheiden Sie beim Setzen des Ziels, und am dritten Fall hängt in Deutschland mehr als nur eine verlorene Gelegenheit.
Welches der drei Sie bekommen, hat fast nichts mit dem QR-Code zu tun und fast alles mit der URL, die darin gedruckt steht.
Der Code trägt nur eine URL
Zuerst zu klären: Ein QR-Symbol kodiert Text. Beginnt dieser Text mit einem erkannten Schema, behandelt die scannende App ihn als Link und übergibt ihn dem Betriebssystem. Es gibt kein Feld für "öffne meine App", kein Kennzeichen für "bevorzuge nativ", keinen Platz für einen Rückfallweg. Alles Folgende ist eine Entscheidung über das Ziel, getroffen, bevor Sie den Code erzeugen, und danach nur änderbar, wenn der Code auf eine Weiterleitung zeigt, die Sie kontrollieren.
Dieser letzte Punkt ist das praktische Argument, auf alles Gedruckte einen dynamischen Code zu setzen. Details der App-Zuordnung ändern sich. Domains ziehen um. Ein statischer Code friert die URL in Druckfarbe ein, und wenn die App-Übergabe falsch eingerichtet war, ist Nachdruck die einzige Abhilfe.
Eigene Schemata scheitern leise
Der älteste Weg zu einer App ist ein privates Schema: eine Adresse, die mit etwas wie myapp beginnt, gefolgt vom üblichen Doppelpunkt und den Schrägstrichen. Die App meldet das Schema an, das Betriebssystem leitet passende URLs an sie weiter, und die App zerlegt den Rest.
Das funktioniert, wenn die App installiert ist. Wenn nicht, ist das Scheitern auf besondere Weise schlecht. Unter dieser Adresse liegt keine Website, weil die Adresse gar keine Webadresse ist. Je nach Browser und Systemversion bekommen Sie eine Fehlerseite, gar nichts, oder einen Dialog, der stattdessen eine Suche anbietet. Das Verhalten unterscheidet sich zwischen Plattformen und sogar zwischen Versionen derselben Plattform, was eigene Schemata von Druckerzeugnissen fernhalten sollte.
Zwei weitere Schwächen. Schemanamen sind nirgends registriert und werden nicht geprüft, jede App kann also jedes Schema beanspruchen, und was passiert, wenn zwei Apps dasselbe beanspruchen, ist von keiner Plattform definiert. Und weil ein Schema keine Domain trägt, kann keine Plattform es an eine Website binden, deren Kontrolle Sie nachgewiesen haben.
Eigene Schemata haben weiterhin einen legitimen Platz: interne Navigation, eine Übergabe zwischen zwei Apps, die Ihnen gehören, ein Weiterleitungsziel, das von Ihrer eigenen Seite aus erreicht wird, nachdem Sie das Vorhandensein der App bereits bestätigt haben. Nicht die Eingangstür.
Universal Links und App Links sind gewöhnliche https-URLs
Beide Plattformen haben dasselbe Problem auf dieselbe Weise gelöst. Statt einen neuen Adressraum zu erfinden, lassen sie eine App eine Menge gewöhnlicher https-URLs beanspruchen, die zu einer Domain gehören, deren Kontrolle die Entwicklerin nachweisen kann.
Apple nennt seine Fassung Universal Links. Google nennt seine Fassung Android App Links. In beiden Fällen ist die Adresse in Ihrem QR-Code eine normale Webadresse, wie Sie sie in jeden Browser tippen könnten. Ist die App installiert und der Anspruch bestätigt, öffnet das System die App statt des Browsers. Fehlt die App, passiert nichts Besonderes und die Seite lädt als Webseite. Dieses sanfte Nachgeben ist der ganze Grund, warum diese Form hinter einen gedruckten Code gehört.
Die Zuordnungsdateien
Die Prüfung läuft über eine Datei auf Ihrem Webserver.
- iOS sucht eine JSON-Datei namens apple-app-site-association, über https aus dem well-known-Verzeichnis in Ihrer Domainwurzel ausgeliefert, die die App-Kennungen und die URL-Pfade auflistet, die jede beansprucht. Auf App-Seite braucht es die Fähigkeit für zugeordnete Domains, die dieselbe Domain nennt. Apple holt die Datei über eigene Infrastruktur, Änderungen wirken also nicht immer sofort.
- Android sucht assetlinks.json im selben well-known-Verzeichnis. Sie listet den Paketnamen der App und den SHA-256-Fingerabdruck des Zertifikats, mit dem die App signiert wurde, und genau das bindet den Anspruch an einen bestimmten Build statt an irgendetwas, das bloß behauptet, dieses Paket zu sein. Das Manifest der App meldet einen Intent-Filter für die Domain mit eingeschalteter automatischer Prüfung an.
Häufige Bruchstellen: die Datei wird über eine Weiterleitung ausgeliefert, eine CDN-Regel ändert ihren Inhaltstyp, ein veralteter Zertifikatsfingerabdruck nach dem Wechsel zur plattformverwalteten App-Signatur, oder ein Pfadmuster, das die URL nicht abdeckt, auf die Ihr Code tatsächlich zeigt. Alle scheitern von außen gleich: Der Link öffnet sich im Browser, und nirgends ist ein Fehler sichtbar.
Der Fingerabdruck verdient besondere Aufmerksamkeit, weil er lautlos und buildspezifisch ist. Er muss zum Zertifikat des Builds passen, den die Nutzerin installiert hat, nicht zu dem auf Ihrem Laptop.
Der Scanner dazwischen
Zwischen Kamera und Betriebssystem liegt ein Schritt, und er ist nicht einheitlich.
Eine Plattform-Kamera-App, die die URL ans System übergibt, gibt dem Zuordnungsmechanismus die beste Chance auszulösen. Ein Scanner in einer Social- oder Messaging-App öffnet den Link häufig stattdessen im eigenen eingebetteten Browser, und eingebettete Browser übergeben nicht verlässlich an eine native App. Ob Ihr Universal Link die App öffnet, hängt daher teilweise davon ab, welchen Scanner die Person zufällig benutzt hat. Manche Plattformen merken sich auch die frühere Entscheidung, für eine Domain im Browser zu bleiben, und halten sich später daran.
Gestalten Sie so, als könnte die Übergabe ausbleiben, denn manchmal bleibt sie aus. Zeigt die Webseite unter dieser URL denselben Inhalt wie der App-Bildschirm, ist eine verpasste Übergabe eine milde Enttäuschung statt einer Sackgasse.
Die Rückfallseite ist hier eine Pflichtseite
Fehlt die App, landet der Scan im Browser, und damit ist diese Seite ein geschäftsmäßig angebotener digitaler Dienst. Dazu gehört in Deutschland eine Anbieterkennzeichnung nach §5 DDG: leicht erkennbar, unmittelbar erreichbar und ständig verfügbar, mit Name und Anschrift, Kontaktdaten, Rechtsform und Vertretungsberechtigten sowie Registergericht und Registernummer, wenn das Unternehmen eingetragen ist. Eine nackte Weiterleitungsseite ohne Menü fällt dabei besonders leicht durchs Raster. Setzen Sie Impressum und Datenschutzerklärung als Links in den Fuß, auch wenn die Seite sonst nur aus einem Logo und einem Knopf besteht, denn ein deutscher Besucher sucht diese Links und wertet ihr Fehlen als Warnzeichen.
Der zweite Punkt betrifft die Messung. Auf dem Weg zur App darf kein Skript feuern, das für den Betrieb der Seite nicht unbedingt erforderlich ist, solange keine Einwilligung vorliegt. §25 TDDDG knüpft diese Regel an jeden Zugriff auf Informationen im Endgerät, also auch an ein Skript, das nur eine Kennung im lokalen Speicher ablegt, um eine spätere App-Installation zuzuordnen. Ob dabei personenbezogene Daten anfallen, ist dafür unerheblich. Halten Sie die Rückfallseite deshalb dünn: Erkennung, Weiterleitung, Fuß mit den Pflichtangaben, und die Zählung an der Weiterleitung im Server statt im Browser des Besuchers.
Die Rückfallkette, die sich zu bauen lohnt
Legen Sie für jeden gedruckten Code drei Ziele fest, in dieser Reihenfolge:
- Die App, auf dem richtigen Bildschirm. Vom Betriebssystem über die https-URL erledigt, ohne jedes JavaScript.
- Die Webseite, mit demselben Inhalt. Dieselbe URL, für einen Browser gerendert. Diese Schicht fängt jede Person ohne App und jeden Scanner, der die Übergabe geschluckt hat.
- Der Store, angeboten statt erzwungen. Setzen Sie einen klaren Installationslink auf die Seite. Direkt auf einen Store-Eintrag weiterzuleiten ist der Fehler, weil es alle strandet, die den Inhalt wollten und keinen Download.
Sparen Sie sich den alten Timer-Trick, per JavaScript ein eigenes Schema abzufeuern und nach ein, zwei Sekunden ohne Reaktion in einen Store weiterzuleiten. Er kämpft mit den Popup-Regeln der Browser, geht auf langsamen Geräten daneben und verhält sich über Systemversionen hinweg unterschiedlich. Chrome auf Android unterstützt zwar eine Intent-URL-Form mit deklariertem Browser-Rückfall, was wirklich nützlich ist, aber sie ist spezifisch für diesen Browser und nichts, worauf man sich überall verlassen kann.
Testen Sie den Druckabzug auf einem Gerät ohne die App, dann auf demselben Gerät mit installierter App, dann über mindestens einen Fremdscanner. Landet der erste Test auf einer funktionierenden Seite statt auf einem Fehler, ist der meiste Wert bereits gesichert. Wenn ein Code völlig woanders landet, arbeiten Sie die Checkliste für Scanfehler durch, bevor Sie die Zuordnungsdatei verdächtigen, und behalten Sie im Kopf, dass das Symbol selbst nichts weiter tut, als eine Zeichenkette zu übergeben.


