2015-12-14 9 views
8

Die nächste, die ich finden konnte, war diese Frage here. aber es deckt nicht das Problem, das ich habe.Android Deep Links folgen nicht Pfadpräfix

Ich habe tiefe Links in meinem App-Setup, um/app als Pfadpräfix zu verwenden. Das Problem, das ich habe, ist, dass Links wie http://example.com/upgrade auch versuchen, in meiner App zu öffnen, obwohl es nicht/app irgendwo in der URL hat. Ich verstehe, dass Sie URLs, die durch das Präfix angegeben sind, nicht ausschließen können, aber ist nicht der ganze Punkt des Pfadpräfixes, um nur diese URLs einzuschließen?

im Grunde möchte ich Links wie diese tiefe Verbindung:

http://example.com/app/home 
http://example.com/app/specials 

aber keine Links wie diese:

http://exaple.com/ 
http://example.com/login 

und hier ist das, was ich in meinem Manifest haben:

<data android:scheme="http" 
    android:host="example.com" 
    android:pathPrefix="/app"/> 

Bearbeiten 1

fand auch this link aber ich habe nicht alle leeren Präfixe haben, nur diejenigen mit nur einem Schrägstrich „/“

Edit 2

Die URL, es war http://example.com/upgrade.php?app=1&method=1&uid=1 wurde Auslösung, war ich nicht sicher, ob App nach dem? würde es auch auslösen, also habe ich das Präfix zu/application geändert, aber das hat auch nicht funktioniert, es löst sie immer noch aus.

bearbeiten 3

hier sind die anderen Deep-Link Daten-Tags im Manifest:

Profil Aktivität

<data android:scheme="myapp" 
    android:host="profile" 
    android:pathPrefix="/"/> 

Anmeldung/Registrierung Aktivität

<data android:scheme="myapp" 
    android:host="login" 
    android:pathPrefix="/signup"/> 

Haupttätigkeit

<data android:scheme="myapp" 
    android:host="main" 
    android:pathPrefix="/"/> 

<data android:scheme="http" 
    android:host="test.example.com" 
    android:pathPrefix="/app"/> 

<data android:scheme="http" 
    android:host="live.example.com" 
    android:pathPrefix="/app"/> 

bearbeiten 4

Dies wird mehr und mehr verwirrend immer, wenn ich den Daten-Tag mit myapp als das Schema aus der Tätigkeit entfernen (oder wenn ich entfernen Sie die PATHPREFIX von allem, was mit dem Präfix "/") Es löst nicht länger die Deep-Links von den Web-URLs aus, selbst wenn sie/app in ihnen haben.

+0

Ist das das einzige '' Tag in Ihrem Manifest? –

+0

Ich habe 3 für diese Aktivität, und zwei andere Aktivitäten haben jeweils eine. – JStephen

+0

das ist das einzige, das example.com verwendet, aber die anderen meinen App-Namen als Schema verwenden, einige verwenden "/" als Präfix, aber alle, die http-Schemas verwenden, haben ein definiertes Präfix von "/ app" – JStephen

Antwort

1

ein paar Tests auf meinem eigenen Rennen denke ich, dieses Problem selbst erstellt haben, bevor weitere Deep-Links von Ihrer App gehen zu

Einstellungen testen Fortsetzung -> Ihre App Name -> Standardmäßig starten und wählen Sie löschen defaults

Dann zurück zu Ihrer App navigieren manifestieren und fügen Sie die Intent-Filter auf Ihre Aktivität für jede uRL:

In Ihrem Beispiel Sie für

fragen

Ich gehe davon aus, dass Sie eine Aktivität haben, die jede dieser für die oben angegebene URI starten würde.

für HomeActivity in manifest tun:

<activity android:name=".HomeActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 

     <!-- http://example.com/app/home --> 
     <data android:scheme="http" 
      android:host="example.com" 
      android:pathPrefix="/app/home"/> 

     <!-- https://example.com/app/home --> 
     <data android:scheme="https" 
      android:host="example.com" 
      android:pathPrefix="/app/home"/> 

     <!-- custom url scheme example://app/home --> 
     <data android:scheme="example" 
      android:host="app" 
      android:pathPrefix="/home"/> 
    </intent-filter> 
</activity> 

-Test mit adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/home und adb shell am start -W -a android.intent.action.VIEW -d example.com/app/home Von Ihrem Terminal

dann für Ihre SpecialsActivity

<activity android:name=".SpecialsActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 

     <!-- http://example.com/app/specials --> 
     <data android:scheme="http" 
      android:host="example.com" 
      android:pathPrefix="/app/specials"/> 

     <!-- https://example.com/app/specials --> 
     <data android:scheme="https" 
      android:host="example.com" 
      android:pathPrefix="/app/specials"/> 

     <!-- custom url scheme example://app/specials --> 
     <data android:scheme="example" 
      android:host="app" 
      android:pathPrefix="/specials"/> 
    </intent-filter> 
</activity> 

-Test mit adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/specials und adb shell am start -W -a android.intent.action.VIEW -d example.com/app/specials Von Ihrem Terminal

diese

ist so ziemlich wie es funktioniert, wenn Sie setzen Ihre App eine http://example.com/ URL und wählen Sie wählen standardmäßig dann zu handhaben, und seine versuchen gehen http://example.com/{anything} zu öffnen Ihre App

Also kurz gesagt verwenden, wenn Sie angeben, Ihre pathPrefix, stellen Sie sicher, dass Sie das einschließen, was Sie wirklich abfangen möchten, und wählen Sie Ihre App nicht standardmäßig aus. Wenn Sie einen Link testen, der Ihre App nicht öffnen soll, passen Sie Ihren pathPrefix so an, dass er nicht von Ihrer App ausgelöst wird.

Zum Beispiel die URLS oben wird nicht offen

http://example.com/app 

denn wir haben keine <data /> Tag definiert, dies zu umgehen.

UPDATE Und gerade aus der Dokumentation hinzuzufügen, wenn \ verwenden oder *:

Da '\' wird als Escape-Zeichen verwendet, wenn die Zeichenfolge von XML gelesen wird (bevor es als ein Muster analysiert wird), müssen Sie doppelt entkommen: Zum Beispiel würde ein Literal '*' als '\\*' geschrieben werden und ein Literal '\' würde als '\\\\' geschrieben werden. Dies ist im Grunde das Gleiche wie das, was Sie schreiben müssten, wenn Sie die Zeichenkette im Java-Code konstruieren.

Viel Glück und gute Programmierung!

+0

Dies würde wahrscheinlich funktionieren, außer ich habe auch einige bestehende Deep-Links, die das benutzerdefinierte Schema ohne Präfix, wie 'Beispiel verwenden : // main/'das geht einfach zur Hauptseite, dann einige, die bestimmte Fragmente in der Hauptaktivität öffnen wie' beispiel: // main/settings' Es hört sich so an, als müsste ich die erste loswerden und einfach haben Präfixe für immer alles. Aber das erfordert, dass ich meine tiefen Verbindungen ändere, was leichter gesagt als getan ist, sobald sie da draußen sind. – JStephen

8

Ich fand es heraus, es scheint, als ob die Datentags in einander bluten, so dass das Präfix von "/" auf den Daten mit Schema "Beispiel" auch für alle Schemata in den anderen Datentags galt .Ich hatte gerade getrennte Intent-Filter für meine benutzerdefiniertes Schema Deep-Links und die URL Deep-Links zu verwenden, etwa so:

<activity android:name=".MainActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 

     <!-- must start with http://test.example.com/app --> 
     <!-- http://test.example.com/ won't work since prefix/is in a different intent-filter --> 
     <data android:scheme="http" 
      android:host="test.example.com" 
      android:pathPrefix="/app"/> 

     <!-- must start with http://test.example.com/app --> 
     <data android:scheme="http" 
      android:host="live.example.com" 
      android:pathPrefix="/app"/> 

    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 

     <!-- must start with example://main/ --> 
     <!-- http://test.example.com/ won't work since http is in a different intent-filter --> 
     <data android:scheme="example" 
      android:host="main" 
      android:pathPrefix="/"/> 

    </intent-filter> 
</activity> 
0

Wie erklärt here, Ihre Attribute fusionierten erhalten:

Obwohl es möglich ist, mehrere einschließen Es ist wichtig, dass Sie separate Filter erstellen, wenn Sie eindeutige URLs deklarieren möchten (z. B. eine bestimmte Kombination aus Schema und Host), da mehrere <data> Elemente im selben Intent-Filter tatsächlich zusammengeführt werden, um dies zu berücksichtigen alle Variationen ihrer kombinierten Attribute.

Putting sie in separaten Instanzen von <intent-filter> daher behebt Ihr Problem.