深度链接时出现奇怪的 Android intent-filter pathPattern 问题
Weird Android intent-filter pathPattern issue while 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
我查看了各种 Whosebug 的答案,none 其中有效。我知道 PatternMatcher.PATTERN_SIMPLE_GLOB 被 Android 用于匹配模式而不是正则表达式。
我的清单看起来像
<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_password
或 reset_password
不是 uri 路径的一部分。
uri 路径在 #
字符之前结束。这是一个特殊字符,用于分隔 query
和 hash
(或锚点)。
方案:https://
主持人:sample-app-123.appspot.com
路径:/backoffice/
片段 #/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
我想为这两个 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
我查看了各种 Whosebug 的答案,none 其中有效。我知道 PatternMatcher.PATTERN_SIMPLE_GLOB 被 Android 用于匹配模式而不是正则表达式。
我的清单看起来像
<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_password
或 reset_password
不是 uri 路径的一部分。
uri 路径在 #
字符之前结束。这是一个特殊字符,用于分隔 query
和 hash
(或锚点)。
方案:https://
主持人:sample-app-123.appspot.com
路径:/backoffice/
片段 #/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