Android 深层链接 pathPrefix 属性被忽略
Android Deeplink pathPrefix Attribute Is Being Ignored
我在清单文件中为我的 Android 应用程序定义了一个深层链接:
<activity android:name="com.example.DeeplinkActivity"
android:screenOrientation="portrait"
android:theme="@style/MyBaseTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with "example://shelf” -->
<!-- Currently handles Ads deeplink structure (iPhone structure) -->
<data
android:host="shelf"
android:pathPrefix=""
android:scheme="example" />
<!-- Accepts URIs that begin with "example://com” -->
<data
android:host="com"
android:pathPrefix=""
android:scheme="example" />
<!-- Accepts URIs that begin with http://www.example.com/some/sample/page.htm” -->
<data
android:host="www.example.com"
android:pathPrefix="/some/sample/page.htm"
android:scheme="http" />
</intent-filter>
</activity>
我的应用程序中也有一些看起来相似但不应被视为深层链接的链接。他们确实以 http://www.example.com but they have a completly different prefix. For example: http://www.example.com/other/not/deep/link.htm .
开头
由于某些原因,为 DeeplinkActivity 定义的意图过滤器被触发,即使它是用前缀“/some/sample/page.htm”定义的。
前缀是否被忽略?如果不是,为什么在定义深层链接意图过滤器时应该使用 pathPrefix 属性?
显然,其他一些数据标签中的空 android:pathPrefix 属性会导致特定数据标签(上述问题中的最后一个数据标签)忽略其自身的路径前缀,即使它已明确定义!
所以这个清单声明修复了最后一个数据标签以正常运行:
<activity android:name="com.example.DeeplinkActivity"
android:screenOrientation="portrait"
android:theme="@style/MyBaseTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with "example://shelf” -->
<!-- Currently handles Ads deeplink structure (iPhone structure) -->
<data
android:host="shelf"
android:scheme="example" />
<!-- Accepts URIs that begin with "example://com” -->
<data
android:host="com"
android:scheme="example" />
<!-- Accepts URIs that begin with http://www.example.com/some/sample/page.htm” -->
<data
android:host="www.example.com"
android:pathPrefix="/some/sample/page.htm"
android:scheme="http" />
</intent-filter>
</activity>
删除 pathPrefix 并没有解决我的问题,我要么以所有 http deep link 工作结束,要么 none 工作,无论前缀如何。似乎前缀、主机和方案都相互渗透,因此对于您的示例 example://www.example.com/
可能还会触发深度 link,即使单个数据元素的 none 定义了它。我最终发现你可以将它们分成不同的意图过滤器,它们不会混合。
所以在你的情况下你可以使用:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with "example://shelf” -->
<!-- Currently handles Ads deeplink structure (iPhone structure) -->
<data
android:host="shelf"
android:pathPrefix=""
android:scheme="example" />
<!-- Accepts URIs that begin with "example://com” -->
<data
android:host="com"
android:pathPrefix=""
android:scheme="example" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with http://www.example.com/some/sample/page.htm” -->
<data
android:host="www.example.com"
android:pathPrefix="/some/sample/page.htm"
android:scheme="http" />
</intent-filter>
这将只接受以 http://www.example.com/some/sample/page.htm
开头的 http URI 或以 example://com
或 example://shelf
开头的 URI
所以在你原来的问题中,http://www.example.com/other/not/deep/link.htm
不会触发深度 link。
我在清单文件中为我的 Android 应用程序定义了一个深层链接:
<activity android:name="com.example.DeeplinkActivity"
android:screenOrientation="portrait"
android:theme="@style/MyBaseTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with "example://shelf” -->
<!-- Currently handles Ads deeplink structure (iPhone structure) -->
<data
android:host="shelf"
android:pathPrefix=""
android:scheme="example" />
<!-- Accepts URIs that begin with "example://com” -->
<data
android:host="com"
android:pathPrefix=""
android:scheme="example" />
<!-- Accepts URIs that begin with http://www.example.com/some/sample/page.htm” -->
<data
android:host="www.example.com"
android:pathPrefix="/some/sample/page.htm"
android:scheme="http" />
</intent-filter>
</activity>
我的应用程序中也有一些看起来相似但不应被视为深层链接的链接。他们确实以 http://www.example.com but they have a completly different prefix. For example: http://www.example.com/other/not/deep/link.htm .
开头由于某些原因,为 DeeplinkActivity 定义的意图过滤器被触发,即使它是用前缀“/some/sample/page.htm”定义的。
前缀是否被忽略?如果不是,为什么在定义深层链接意图过滤器时应该使用 pathPrefix 属性?
显然,其他一些数据标签中的空 android:pathPrefix 属性会导致特定数据标签(上述问题中的最后一个数据标签)忽略其自身的路径前缀,即使它已明确定义!
所以这个清单声明修复了最后一个数据标签以正常运行:
<activity android:name="com.example.DeeplinkActivity"
android:screenOrientation="portrait"
android:theme="@style/MyBaseTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with "example://shelf” -->
<!-- Currently handles Ads deeplink structure (iPhone structure) -->
<data
android:host="shelf"
android:scheme="example" />
<!-- Accepts URIs that begin with "example://com” -->
<data
android:host="com"
android:scheme="example" />
<!-- Accepts URIs that begin with http://www.example.com/some/sample/page.htm” -->
<data
android:host="www.example.com"
android:pathPrefix="/some/sample/page.htm"
android:scheme="http" />
</intent-filter>
</activity>
删除 pathPrefix 并没有解决我的问题,我要么以所有 http deep link 工作结束,要么 none 工作,无论前缀如何。似乎前缀、主机和方案都相互渗透,因此对于您的示例 example://www.example.com/
可能还会触发深度 link,即使单个数据元素的 none 定义了它。我最终发现你可以将它们分成不同的意图过滤器,它们不会混合。
所以在你的情况下你可以使用:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with "example://shelf” -->
<!-- Currently handles Ads deeplink structure (iPhone structure) -->
<data
android:host="shelf"
android:pathPrefix=""
android:scheme="example" />
<!-- Accepts URIs that begin with "example://com” -->
<data
android:host="com"
android:pathPrefix=""
android:scheme="example" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with http://www.example.com/some/sample/page.htm” -->
<data
android:host="www.example.com"
android:pathPrefix="/some/sample/page.htm"
android:scheme="http" />
</intent-filter>
这将只接受以 http://www.example.com/some/sample/page.htm
开头的 http URI 或以 example://com
或 example://shelf
所以在你原来的问题中,http://www.example.com/other/not/deep/link.htm
不会触发深度 link。