Android深层链接不遵循路径前缀

时间:2015-12-14 21:07:54

标签: android deep-linking

我能找到的最接近的是这个问题here。但它并没有完全覆盖我的问题。

我的应用设置中有深层链接,使用/ app作为路径前缀。我遇到的问题是像http://example.com/upgrade这样的链接也试图在我的应用中打开,即使它在网址中的任何地方都没有/ app。我知道你不能排除前缀指定的网址,但不是路径前缀的整个点只包括那些网址吗?

基本上我希望像这样的链接深层链接:

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

但不是这样的链接:

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

这就是我的清单中的内容:

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

修改1

也找到了this link,但我没有任何空的前缀,只有一个只有斜杠&#34; /&#34;

修改2

触发它的网址是http://example.com/upgrade.php?app=1&method=1&uid=1,我不确定应用之后的应用是什么?也会触发它所以我将前缀更改为/ application但是它也没有工作,它仍然会触发它们。

编辑3

清单中的其他深层链接数据标记:

个人资料活动

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

登录/注册活动

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

主要活动

<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

如果我从活动中删除myapp作为方案的数据标记(或者如果我从前缀为&#34; /&#34;的所有内容中删除pathPrefix),这会变得越来越混乱。更长的时间会触发来自网址的深层链接,即使它们中包含/ app。

3 个答案:

答案 0 :(得分:10)

我想通了,似乎数据标签彼此流血,所以&#34; /&#34;的前缀有关方案的数据&#34;示例&#34;也适用于其他数据标签中的所有方案。我只需要为我的自定义方案深层链接和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://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>

答案 1 :(得分:2)

正如here所述,您的属性会合并:

  

虽然可以在同一个过滤器中包含多个<data>元素,但是当您打算声明唯一的网址(例如特定组合)时,创建单独的过滤器非常重要方案和主机),因为同一个意图过滤器中的多个<data>元素实际上合并在一起,以说明其组合属性的所有变体。

将它们放入<intent-filter>的单独实例中可以解决您的问题。

答案 2 :(得分:1)

我自己运行一些测试我认为你自己已经创建了这个问题,然后再继续测试应用程序中的任何更深层链接

设置 - &gt;您的应用名称 - &gt;默认启动并选择清除默认值

然后导航回您的应用清单,并为每个网址的“活动”添加意图过滤器:

在你的例子中,你要求

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

我将假设您有一个Activity,它将针对上面给出的URI启动其中的每一个。

表示清单中的HomeActivity:

<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/homeadb shell am start -W -a android.intent.action.VIEW -d example.com/app/home从您的终端进行测试

然后是您的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>

使用adb shell am start -W -a android.intent.action.VIEW -d http://example.com/app/specialsadb shell am start -W -a android.intent.action.VIEW -d example.com/app/specials从您的终端进行测试

这几乎是它的工作原理,如果您将应用设置为处理http://example.com/网址并默认选择选择,那么它将尝试使用您的应用打开http://example.com/{anything}

所以简而言之,当你指定你的pathPrefix时,请确保你包含你真正想拦截的内容,如果你测试的链接不应该打开你的应用,请不要选择你的应用,调整您的pathPrefix,以便它不会被您的应用触发。

例如,赢得打开

以上的网址
http://example.com/app

因为我们尚未定义<data />标记来处理此问题。

<强>更新 并且在使用\或*:

时直接从文档中添加
  

因为从XML读取字符串(在将其解析为模式之前)时'\'用作转义字符,所以您需要双重转义:例如,文字'*'将写为'\\*',文字'\'将写为'\\\\'。这与在Java代码中构造字符串时需要编写的内容基本相同。

祝你好运,编码愉快!