Android 深层链接不遵循路径前缀
Android deep links not following path prefix
我能找到的最接近的是这个问题here。但它并没有完全涵盖我遇到的问题。
我的应用程序设置中有很深的 links 使用 /app 作为路径前缀。我遇到的问题是像 http://example.com/upgrade
这样的 link 也在尝试在我的应用程序中打开,即使它在 url 中的任何地方都没有 /app。我知道您不能排除前缀指定的 urls,但路径前缀的全部意义不是只包含那些 urls 吗?
基本上我想要 link 像这样深入 link:
http://example.com/app/home
http://example.com/app/specials
但不是像这样的 link:
http://exaple.com/
http://example.com/login
这是我清单中的内容:
<data android:scheme="http"
android:host="example.com"
android:pathPrefix="/app"/>
编辑 1
也找到了 但我没有任何空前缀,只有斜线“/”
编辑 2
触发它的 url 是 http://example.com/upgrade.php?app=1&method=1&uid=1
,我不确定应用程序是否在 ?也会触发它,所以我将前缀更改为 /application 但这也没有用,它仍然会触发它们。
编辑 3
这是清单中的其他深层 link 数据标签:
简介activity
<data android:scheme="myapp"
android:host="profile"
android:pathPrefix="/"/>
login/signup activity
<data android:scheme="myapp"
android:host="login"
android:pathPrefix="/signup"/>
主要activity
<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"/>
编辑 4
这变得越来越令人困惑,如果我从 activity 中删除带有 myapp 作为方案的数据标签(或者如果我从前缀为“/”的所有内容中删除 pathPrefix),它不会longer 触发来自网络 urls 的深层 links,即使它们中有 /app。
运行 我自己的一些测试我认为你自己造成了这个问题,在继续测试任何更深入的 links 之前从你的应用程序转到
设置 -> 您的应用程序名称 -> 默认启动 和 select 清除默认值
然后导航回您的应用清单并为每个 url:
添加意图过滤器到您的 Activity
在您的示例中,您要求
http://example.com/app/home
http://example.com/app/specials
我假设您有一个 Activity 可以为上面给出的 URI 启动其中的每一个。
对于家庭Activity 在清单中做:
<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>
使用 adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/home
和 adb shell am start -W -a android.intent.action.VIEW -d example.com/app/home
从您的终端进行测试
然后为您的特价商品Activity
<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>
使用 adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/specials
和 adb shell am start -W -a android.intent.action.VIEW -d example.com/app/specials
从您的终端进行测试
这就是它的工作原理,如果您将您的应用程序设置为处理 http://example.com/
url 和 select 默认选择,那么它将尝试打开 http://example.com/{anything}
使用您的应用程序
简而言之,当您指定 pathPrefix 时,请确保包含您真正想要拦截的内容,如果您测试不应打开您的应用程序的 link,请不要默认选择您的应用程序,只需调整您的 pathPrefix,这样它就不会被您的应用程序触发。
例如上面的网址不会打开
http://example.com/app
因为我们还没有定义一个 <data />
标签来处理这个。
更新
并在使用 \ 或 *:
时直接从文档中添加
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.
祝你好运,编码愉快!
我想通了,似乎数据标签有点相互渗透,所以带有方案“example”的数据上的“/”前缀也适用于其他数据中的所有方案标签。我只需要为我的自定义方案深层链接和 url 深层链接使用单独的 Intent 过滤器,如下所示:
<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://live.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>
如here所述,您的属性已合并:
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.
因此将它们放入 <intent-filter>
的单独实例中可以解决您的问题。
我能找到的最接近的是这个问题here。但它并没有完全涵盖我遇到的问题。
我的应用程序设置中有很深的 links 使用 /app 作为路径前缀。我遇到的问题是像 http://example.com/upgrade
这样的 link 也在尝试在我的应用程序中打开,即使它在 url 中的任何地方都没有 /app。我知道您不能排除前缀指定的 urls,但路径前缀的全部意义不是只包含那些 urls 吗?
基本上我想要 link 像这样深入 link:
http://example.com/app/home
http://example.com/app/specials
但不是像这样的 link:
http://exaple.com/
http://example.com/login
这是我清单中的内容:
<data android:scheme="http"
android:host="example.com"
android:pathPrefix="/app"/>
编辑 1
也找到了
编辑 2
触发它的 url 是 http://example.com/upgrade.php?app=1&method=1&uid=1
,我不确定应用程序是否在 ?也会触发它,所以我将前缀更改为 /application 但这也没有用,它仍然会触发它们。
编辑 3
这是清单中的其他深层 link 数据标签:
简介activity
<data android:scheme="myapp"
android:host="profile"
android:pathPrefix="/"/>
login/signup activity
<data android:scheme="myapp"
android:host="login"
android:pathPrefix="/signup"/>
主要activity
<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"/>
编辑 4
这变得越来越令人困惑,如果我从 activity 中删除带有 myapp 作为方案的数据标签(或者如果我从前缀为“/”的所有内容中删除 pathPrefix),它不会longer 触发来自网络 urls 的深层 links,即使它们中有 /app。
运行 我自己的一些测试我认为你自己造成了这个问题,在继续测试任何更深入的 links 之前从你的应用程序转到
设置 -> 您的应用程序名称 -> 默认启动 和 select 清除默认值
然后导航回您的应用清单并为每个 url:
添加意图过滤器到您的 Activity在您的示例中,您要求
http://example.com/app/home
http://example.com/app/specials
我假设您有一个 Activity 可以为上面给出的 URI 启动其中的每一个。
对于家庭Activity 在清单中做:
<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>
使用 adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/home
和 adb shell am start -W -a android.intent.action.VIEW -d example.com/app/home
从您的终端进行测试
然后为您的特价商品Activity
<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>
使用 adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/specials
和 adb shell am start -W -a android.intent.action.VIEW -d example.com/app/specials
从您的终端进行测试
这就是它的工作原理,如果您将您的应用程序设置为处理 http://example.com/
url 和 select 默认选择,那么它将尝试打开 http://example.com/{anything}
使用您的应用程序
简而言之,当您指定 pathPrefix 时,请确保包含您真正想要拦截的内容,如果您测试不应打开您的应用程序的 link,请不要默认选择您的应用程序,只需调整您的 pathPrefix,这样它就不会被您的应用程序触发。
例如上面的网址不会打开
http://example.com/app
因为我们还没有定义一个 <data />
标签来处理这个。
更新 并在使用 \ 或 *:
时直接从文档中添加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.
祝你好运,编码愉快!
我想通了,似乎数据标签有点相互渗透,所以带有方案“example”的数据上的“/”前缀也适用于其他数据中的所有方案标签。我只需要为我的自定义方案深层链接和 url 深层链接使用单独的 Intent 过滤器,如下所示:
<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://live.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>
如here所述,您的属性已合并:
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.
因此将它们放入 <intent-filter>
的单独实例中可以解决您的问题。