Android Deep Links Not Following Path Prefix
Solution 1:
I figured it out, It seems like the data tags sort of bleed into one another, so the prefix of "/" on the data with scheme "example" was also applying to all of the schemes in the other data tags. I just had to use separate Intent filters for my custom scheme deep links and the url deep links like so:
<activityandroid:name=".MainActivity"><intent-filter><actionandroid:name="android.intent.action.VIEW" /><categoryandroid:name="android.intent.category.DEFAULT" /><categoryandroid: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 --><dataandroid:scheme="http"android:host="test.example.com"android:pathPrefix="/app"/><!-- must start with http://live.example.com/app --><dataandroid:scheme="http"android:host="live.example.com"android:pathPrefix="/app"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.VIEW" /><categoryandroid:name="android.intent.category.DEFAULT" /><categoryandroid: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 --><dataandroid:scheme="example"android:host="main"android:pathPrefix="/"/></intent-filter></activity>
Solution 2:
As explained here, your attributes get merged:
Although it's possible to include multiple
<data>
elements in the same filter, it's important that you create separate filters when your intention is to declare unique URLs (such as a specific combination of scheme and host), because multiple<data>
elements in the same intent filter are actually merged together to account for all variations of their combined attributes.
Putting them into separate instances of <intent-filter>
therefore fixes your problem.
Solution 3:
Running a few tests on my own I think you have created this problem yourself, before continuing to test any more deep links from your app go to
Settings -> Your App Name -> Launch by Default and select Clear defaults
Then navigate back to your app manifest and add the intent filter to your Activity for each url:
In your example you ask for
http://example.com/app/home
http://example.com/app/specials
I am going to assume you have an Activity that would launch each one of these for the URI given above.
for HomeActivity in manifest do:
<activityandroid:name=".HomeActivity"><intent-filter><actionandroid:name="android.intent.action.VIEW" /><categoryandroid:name="android.intent.category.DEFAULT" /><categoryandroid:name="android.intent.category.BROWSABLE" /><!-- http://example.com/app/home --><dataandroid:scheme="http"android:host="example.com"android:pathPrefix="/app/home"/><!-- https://example.com/app/home --><dataandroid:scheme="https"android:host="example.com"android:pathPrefix="/app/home"/><!-- custom url scheme example://app/home --><dataandroid:scheme="example"android:host="app"android:pathPrefix="/home"/></intent-filter></activity>
Test with adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/home
and adb shell am start -W -a android.intent.action.VIEW -d example.com/app/home
From your terminal
then for your SpecialsActivity
<activityandroid:name=".SpecialsActivity"><intent-filter><actionandroid:name="android.intent.action.VIEW" /><categoryandroid:name="android.intent.category.DEFAULT" /><categoryandroid:name="android.intent.category.BROWSABLE" /><!-- http://example.com/app/specials --><dataandroid:scheme="http"android:host="example.com"android:pathPrefix="/app/specials"/><!-- https://example.com/app/specials --><dataandroid:scheme="https"android:host="example.com"android:pathPrefix="/app/specials"/><!-- custom url scheme example://app/specials --><dataandroid:scheme="example"android:host="app"android:pathPrefix="/specials"/></intent-filter></activity>
Test with adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/specials
and adb shell am start -W -a android.intent.action.VIEW -d example.com/app/specials
From your terminal
this is pretty much how it works, if you set your app to handle a http://example.com/
url and select choose by default then, well its going to try to open http://example.com/{anything}
using your app
So in short, when you specify your pathPrefix, make sure you include what you really want to intercept and don't choose your app by default if you test a link that shouldn't open your app, just adjust your pathPrefix so it won't be triggered by your app.
For example the URLS above won't open
http://example.com/app
because we haven't defined a <data />
tag to handle this.
UPDATE And to add straight from the docs when using \ or *:
Because
'\'
is used as an escape character when the string is read from XML (before it is parsed as a pattern), you will need to double-escape: For example, a literal'*'
would be written as'\\*'
and a literal'\'
would be written as'\\\\'
. This is basically the same as what you would need to write if constructing the string in Java code.
Good luck and happy coding!
Post a Comment for "Android Deep Links Not Following Path Prefix"