我正在Android上实现应用程序链接。我们的服务器团队在我们的开发端点assetlinks.json
上托管了/.well-known/assetlinks.json
。
在我的应用清单中,我已经按照官方文档编写了意图过滤器,如下所示:
<!-- Intent filter for supporting deep linking (referred to as magic login links) -->
<intent-filter
android:autoVerify="true"
tools:ignore="UnusedAttribute">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="@string/app_link_login_host"
android:scheme="https" />
<data
android:host="@string/app_link_login_host"
android:scheme="http" />
</intent-filter>
现在,据我所知,当首次运行该应用程序时,Android OS将在清单中搜索所有意图过滤器,这些过滤器包含一个主机/方案对,其中autoVerify=true
和VIEW
操作以及DEFAULT
和BROWSABLE
类别。然后它将转到主机URL,并从assetlinks.json
路径请求/.well-known/
文件,并使用此json文件中的SHA哈希和程序包名称来验证该应用程序是否允许接受来自给定主机。如果成功,则应将应用程序相对于意图过滤器中主机提供的链接标记为status: always
。如果失败,则该应用将被标记为主机的status: never
。
但是,我们的服务器团队已为登台设置了新的端点,并且尚未将assetlinks.json
文件上传到/.well-known/
路径(实际上他们根本没有托管该文件)。但是,该应用程序仍已挂接,以接受来自清单中指定的主机的链接(当由于端点上没有assetlinks
文件而导致应用程序验证失败时。)
这是在我意识到也许也没有使用dev端点assetlinks.json
文件来验证应用程序的时候,我才注意到,因为深层链接仍然在登台环境中有效(当它应该没有)。
这是Android OS的错误吗(换句话说,它根本不进行资产链接检查?)。是的,我在安装指向暂存的版本之前先卸载了指向开发服务器的旧应用程序。
这是官方文档:
https://developer.android.com/training/app-links/
这是我的问题的根源所在的段落(因为它明确指出,如果任何主机都不能在assetlinks.json
路径下解析/.well-known/
文件(包括验证对于客户端应用程序检索到的assetlinks.json
文件),则该应用程序将不会被挂钩以接受链接(即status: none
)。
When android:autoVerify="true" is present on any one of your intent filters, installing your app on devices with Android 6.0 and higher causes the system to attempt to verify all hosts associated with the URLs in any of your app's intent filters. Verification involves the following:
The system inspects all intent filters that include:
Action: android.intent.action.VIEW
Categories: android.intent.category.BROWSABLE and android.intent.category.DEFAULT
Data scheme: http or https
For each unique host name found in the above intent filters, Android queries the corresponding websites for the Digital Asset Links file at https://hostname/.well-known/assetlinks.json.
Only if the system finds a matching Digital Asset Links file for all hosts in the manifest does it then establish your app as the default handler for the specified URL patterns.