匹配“/应用程序”,而不是“/ appinst”与Android:pathPattern(在意向过滤

2019-09-17 17:57发布

我试图使该过滤器的一些特定URL的意图。 我正在努力追赶的网址是:

  • http://host.com/app
  • http://host.com/app/
  • http://host.com/app ?...
  • http://host.com/app/ ?...

这可以这样做

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" android:host="host.com"
        android:pathPrefix="/app" android:pathPattern="[app.*]"/>
</intent-filter>

我的问题就来了,因为我已经有一个网址是:

  • http://host.com/appinstall

我不想尝试在URL打开应用程序。

我已经尝试

  • android:pathPattern="[app]
  • android:pathPattern="[app.*]
  • android:pathPattern="[app?.*]
  • android:pathPattern="[app\?.*]
  • android:pathPattern="[app\\?.*]
  • android:pathPattern="[app|app?.*]
  • android:pathPattern="[app|app\?.*]
  • android:pathPattern="[app|app\\?.*]
  • android:pathPattern="[nativeapp\z|nativeapp\?.*|nativeapp/.*]"
  • android:pathPattern="[nativeapp\\z|nativeapp\\?.*|nativeapp/.*]"

而他们没有一个人工作。 即使[app\\?.*]打开/ appinstall。

注:有人问了。 我有/ appinstall控制器,因为我工作的应用程序开始是和iPhone应用程序和appInstall URL有很多情况下治疗重定向到应用程序商店。

Answer 1:

您需要使用android:path ,而不是android:pathPrefixandroid:pathPattern ,因为这将匹配的路径/app恰好和/appinstall将被忽略。

<!-- Matches "http://host.com/app" exactly, note that querystring, fragment
    identifiers and the trailing slash are not considered part of the path and 
    are therefore ignored so URLs that will match:
       http://host.com/app
       http://host.com/app/
       http://host.com/app?some=value
       http://host.com/app/?some=value
       http://host.com/app#fragmentIdentifier
       http://host.com/app/#fragmentIdentifier
       http://host.com/app?some=value#fragmentIdentifier
       http://host.com/app/?some=value#fragmentIdentifier
    URLs that will NOT match
       http://host.com/app/index.htm
       http://host.com/appinstall
       http://host.com/appinstall/
       http://host.com/app/subdirectory
       http://host.com/app/subdirectory/
       http://host.com/apple.htm
 -->
<data android:scheme="http" android:host="host.com" android:path="/app" />

如果你也想匹配网站的根,那么你就需要添加额外的<data>元素:

<data android:scheme="http" android:host="host.com" android:path="/" />


Answer 2:

安卓:pathPattern是非常基本的,是不是一个真正的REG-EX,它只允许运营商“” 和 “*”。

你必须是为了实现自己的目标很聪明。 一种方式是...

<!-- Matches "http://host.com/app" exactly, URLs that will match:
       http://host.com/app
       http://host.com/app/
 -->
<data android:scheme="http" android:host="host.com" android:path="/" />

<!-- Matches URLs prefixed with "http://host.com/app/"
       http://host.com/app/
       http://host.com/app/?query=value
       http://host.com/app/somepage.htm
 -->
<data android:scheme="http" android:host="host.com" android:pathPrefix="/app/" />

<!-- Matches URLs prefixed with "http://host.com/app?"
       http://host.com/app?query=value
 -->
<data android:scheme="http" android:host="host.com" android:pathPrefix="/app?" />

编辑:

请忽略上面,我发现,由于“路径”你能来匹配不包括在内查询字符串或片段标识符部分或URL的斜杠,这是不正确。 我将提供一个秒另一个答案。



文章来源: Match “/app” and not “/appinst” with android:pathPattern (working on an intent-filter)