android - 深度链接时奇怪的 Android intent-filter pathPattern 问题

标签 android pattern-matching deep-linking

我想为这两个 http url 创建深层链接

https://sample-app-123.appspot.com/backoffice/#/user_reset_password?email=abc@gmail.com https://sample-app-123.appspot.com/backoffice/#/user_create_password?email=abc@gmail.com

我浏览了各种 StackOverflow 答案,但没有一个有效。我了解到 PatternMatcher.PATTERN_SIMPLE_GLOB 被 Android 用于匹配模式而不是正则表达式。

我的 list 看起来像

<activity android:name=".CreateActivity"
    android:label="Create Password"
    >
    <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"></category>
    <category android:name="android.intent.category.BROWSABLE"></category>
    <data
        android:host="sample-app-123.appspot.com"
        android:scheme="https"
        android:pathPattern=".*create_password.*"
        />
    </intent-filter>

</activity>
<activity android:name=".ResetActivity"
    android:label="Reset Password"
    >
    <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"></category>
    <category android:name="android.intent.category.BROWSABLE"></category>
    <data
        android:host="sample-app-123.appspot.com"
        android:scheme="https"
        android:pathPattern=".*reset_password.*"
        />
    </intent-filter>
</activity>

我已经创建了几个测试来检查 PatternMatcher.PATTERN_SIMPLE_GLOB,所有测试都通过了,我不知道为什么它不起作用

public void testPatternMatcher() throws Exception {
    PatternMatcher mPatternMatcher;

    mPatternMatcher = new PatternMatcher("https://sample-app-123.appspot.com/backoffice\\/#\\/user_create_password.*", PatternMatcher.PATTERN_SIMPLE_GLOB);
    assertTrue(mPatternMatcher.match("https://sample-app-123.appspot.com/backoffice/#/user_create_password?email=abc@gmail.com"));
    assertFalse(mPatternMatcher.match("https://sample-app-123.appspot.com/backoffice/#/user_reset_password?email=abc@gmail.com"));

    mPatternMatcher = new PatternMatcher(".*user_create_password.*", PatternMatcher.PATTERN_SIMPLE_GLOB);
    assertTrue(mPatternMatcher.match("https://sample-app-123.appspot.com/backoffice/#/user_create_password?email=abc@gmail.com"));
    assertFalse(mPatternMatcher.match("https://sample-app-123.appspot.com/backoffice/#/user_reset_password?email=abc@gmail.com"));

    mPatternMatcher = new PatternMatcher(".*user_reset_password.*", PatternMatcher.PATTERN_SIMPLE_GLOB);
    assertFalse(mPatternMatcher.match("/backoffice/#/user_create_password?email=abc@gmail.com"));
    assertTrue(mPatternMatcher.match("/backoffice/#/user_reset_password?email=abc@gmail.com"));
}

最佳答案

create_passwordreset_password 不是 uri 路径的一部分。
uri 路径恰好在 # 字符之前结束。这是一个特殊字符,用于将 queryhash(或 anchor )分隔开。

方案:https://
主机:sample-app-123.appspot.com
路径:/backoffice/
fragment #/user_reset_password?email=abc@gmail.com

您应该改用 url,例如:

https://sample-app-123.appspot.com/backoffice/user_reset_password?email=abc@gmail.com
https://sample-app-123.appspot.com/backoffice/user_create_password?email=abc@gmail.com

这将按预期工作。

方案:https://
主机:sample-app-123.appspot.com
路径:/backoffice/user_create_password
查询:email=abc@gmail.com

关于android - 深度链接时奇怪的 Android intent-filter pathPattern 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35198475/

相关文章:

flash - Google 如何读取 SWFAddress 深层路径?

java - MainAcitivity 即使是 SingleTask 也不会进入 onNewIntent 方法并再次调用 onCreate

java - 如何在 Android 中获取儒略日(或类似日期)?

c - 是否有用于 POSIX 文件名匹配 (fnmatch) 的已知 O(nm)-time/O(1)-space 算法?

android - Google 发布前报告 - 多个项目具有相同的描述

scala - Scala 中的类型推断和模式匹配

java - 模式匹配出了什么问题?

c# - 如何使用.NET框架将没有.json扩展名的上传到服务器的文件设置为内​​容类型 "application/json"

android - 按下硬件音量按钮时如何在 flutter 应用程序中隐藏系统音量条?

java - LinkedList.peek() 导致空指针异常