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://comexample://shelf

开头的 URI

所以在你原来的问题中,http://www.example.com/other/not/deep/link.htm 不会触发深度 link。