情况:
- 您有一个内容广泛的移动网站 m.somewhere.com
- 在 Google Play 上,您有一个 Android 应用程序,它复制了 m.somewhere.com 的主要功能,但不是全部。
- 您的客户/雇主/投资者要求您为应用程序可以处理的那些网址实现深度链接。
TL;DR - 你如何实现这个?
到目前为止我的方法:
第一直觉:仅匹配某些 url 并启动它们。问题:AndroidManifest 意图过滤器中的表达式缺乏会阻止这种情况发生(例如http://weiyang.wordpress.ncsu.edu/2013/04/11/a-limitation-in-intent-filter-of-android-application/ http://weiyang.wordpress.ncsu.edu/2013/04/11/a-limitation-in-intent-filter-of-android-application/).
作为问题的一个子集,假设 m.somewhere.com 的服务器知道任何以数字结尾的 url 都会转到网站上的某个页面,并且营销人员不断地进行搜索引擎优化,因此例如
我想启动该应用程序:
http://m.somewhere.com/find/abc-12345
https://m.somewhere.com/shop/xyz-45678928492
但不是为了
http://m.somewhere.com/find/abc-12345-xyz
https://m.somewhere.com/about-us
path、pathPrefix 或 pathPattern 的组合无法处理此问题。
stackoverflow 上的最佳实践(将 URI 与 AndroidManifest 中的 相匹配,例如 http://example.com/something https://stackoverflow.com/questions/24876676/match-uris-with-data-like-http-example-com-something-in-androidmanifest) 似乎是捕获所有内容,然后在到达 onCreate() 时处理这种情况,并意识到您不应该处理这个特定的 url:
安卓清单:
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"
android:host="m.somewhere.com"
android:pathPattern=".*"/>
</intent-filter>
...
活动 onCreate():
Intent i = getIntent()
String action = i.getAction();
Uri uri = i.getData();
if (Intent.ACTION_VIEW.equals(action) && cantHandleUrl(uri)) {
// TODO - fallback to browser.
}
我编写了与上面类似的程序,该程序正在运行,但它会导致非常糟糕的最终用户体验:
- 浏览 m.somewhere.com 时,每次点击 url 时都会出现卡顿
当应用程序启动然后回退时。
- 有一个令人讨厌的习惯,即每次点击 m.somewhere.com 链接时都会弹出选择器屏幕,询问用户他们想要使用哪个(Android 应用程序与浏览器一起列出,但点击 Android 应用程序)应用程序只是再次启动选择器屏幕)。如果我不小心,我的应用程序就会陷入无限重新启动循环(如果用户选择“始终”),即使我很小心,用户也会觉得他们的“始终”选择被忽略了。
可以做什么?
(编辑:在应用程序的 Web 视图中显示未处理页面的站点不是一个选项)。