android:autoVerify="true" 的 Intent Filter - 安装时从未验证,默认应用程序链接不起作用
Intent Filter with android:autoVerify="true" - never verified at installation, default app links don't work
我在我的 Android 应用程序中使用 branch.io SDK,并希望我的应用程序成为 Android 6 上分支 links 的默认处理程序,如所述here(Android guide) and here(Branch.io指南)
这是我的activity在AndroidManifest.xml中的声明:
<activity android:name="com.mypackage.MyActivity"
android:launchMode="singleTask">
<intent-filter tools:node="merge" android:autoVerify="true">
<data android:scheme="@string/url_scheme" android:host="open"/>
<data android:scheme="https"
android:host="@string/branch_io_host"
android:pathPrefix="@string/branch_io_path_prefix"/>
<data android:scheme="http"
android:host="@string/branch_io_host"
android:pathPrefix="@string/branch_io_path_prefix"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
然而,当我在我的设备上安装构建时,当我单击具有正确主机和路径的 link 时,我仍然会看到选择器对话框。读完这篇 extensive guide on app linking 之后,我相信这是因为我的设备从不验证我的应用程序的 intent 过滤器。例如。当我从 Play 商店安装 Twitter 应用程序时,我在 LogCat:
中看到这些消息
03-24 15:04:27.231: D/IntentFilterVerificationReceiver(16965): Received ACTION_INTENT_FILTER_NEEDS_VERIFICATION.
03-24 15:04:27.248: I/IntentFilterIntentService(16965): Verifying IntentFilter. verificationId:2 scheme:"https" hosts:"twitter.com www.twitter.com ads.twitter.com" package:"com.twitter.android".
03-24 15:04:30.134: I/IntentFilterIntentService(16965): Verification 2 complete. Success:true. Failed hosts:.
但是我在安装我的应用程序时没有看到这样的消息。我尝试了发布和调试版本,尝试将其上传到 Play 商店的 Alpha 测试并从那里安装,结果相同。为什么 Android 不验证我的 Intent 过滤器?
通过将此数据标记移动到单独的 intent 过滤器中解决了此问题:
<data android:scheme="@string/url_scheme" android:host="open"/>
这是 AndroidManifest 现在的样子:
<activity android:name="com.mypackage.MyActivity"
android:launchMode="singleTask">
<intent-filter tools:node="merge" android:autoVerify="true">
<data android:scheme="https"
android:host="@string/branch_io_host"
android:pathPrefix="@string/branch_io_path_prefix"/>
<data android:scheme="http"
android:host="@string/branch_io_host"
android:pathPrefix="@string/branch_io_path_prefix"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<data android:scheme="@string/url_scheme" android:host="open"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
来自 IntentFilter 的消息现在按预期显示在日志中。
对于可能像我一样粗心的人,根据 https://developer.android.com/training/app-links:
Android App Links on Android 6.0 (API level 23) and higher allow an app to designate itself as the default handler of a given type of link.
我碰巧在 Android 5.1 设备上随机测试过 Android 6,intent 过滤器可以工作,但 android:autoVerify="true"
不会。您将不会在 adb logcat
中看到 IntentFilterIntentSvc
日志,这意味着不会进行 url 验证。在这种情况下,Android 将打开默认的应用程序选择面板。
Deeplink无需用户提示即可工作
假设您的应用程序清单声明了多个主机,例如 myhost1.com、myhost2.com 和 myhost3.com、
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="myhost1.com"
android:pathPrefix="/start" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="myhost2.com"
android:pathPrefix="/start" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="myhost3.com"
android:pathPrefix="/start" />
</intent-filter>
并为每个部署 assetlinks.json
https://myhost1.com/.well-known/assetlinks.json
https://myhost2.com/.well-known/assetlinks.json
https://myhost3.com/.well-known/assetlinks.json
从 ADB 安装应用程序时 或 Google Play 商店继续检查您的 Logcat IntentFilterIntentOp 标签,如下所示
I/IntentFilterIntentOp:正在验证 IntentFilter。 verificationId:9 方案:“https” 主机:“myhost1.com myhost2.com myhost3.com” 包:“com.mydeeplink.app”。 [上下文 service_id=244 ]
安装时,如果 任何一个 主机失败,您的 DIRECT 打开深度 link 将无法工作,将验证清单声明。失败意味着系统将提示用户选择您的应用程序或浏览器。
NOTE NOTE NOTE: 如果您在清单中声明任何测试环境,这些环境将在未来被删除。它会导致您的应用 IntentFilterIntentOp FAILURE。直接开深会断link.
对于稍后将被删除的测试环境,请勿使用 android:autoVerify="true"。否则,您的生产应用深度 link 直接打开可能无法用于新安装。
我在我的 Android 应用程序中使用 branch.io SDK,并希望我的应用程序成为 Android 6 上分支 links 的默认处理程序,如所述here(Android guide) and here(Branch.io指南)
这是我的activity在AndroidManifest.xml中的声明:
<activity android:name="com.mypackage.MyActivity"
android:launchMode="singleTask">
<intent-filter tools:node="merge" android:autoVerify="true">
<data android:scheme="@string/url_scheme" android:host="open"/>
<data android:scheme="https"
android:host="@string/branch_io_host"
android:pathPrefix="@string/branch_io_path_prefix"/>
<data android:scheme="http"
android:host="@string/branch_io_host"
android:pathPrefix="@string/branch_io_path_prefix"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
然而,当我在我的设备上安装构建时,当我单击具有正确主机和路径的 link 时,我仍然会看到选择器对话框。读完这篇 extensive guide on app linking 之后,我相信这是因为我的设备从不验证我的应用程序的 intent 过滤器。例如。当我从 Play 商店安装 Twitter 应用程序时,我在 LogCat:
中看到这些消息03-24 15:04:27.231: D/IntentFilterVerificationReceiver(16965): Received ACTION_INTENT_FILTER_NEEDS_VERIFICATION.
03-24 15:04:27.248: I/IntentFilterIntentService(16965): Verifying IntentFilter. verificationId:2 scheme:"https" hosts:"twitter.com www.twitter.com ads.twitter.com" package:"com.twitter.android".
03-24 15:04:30.134: I/IntentFilterIntentService(16965): Verification 2 complete. Success:true. Failed hosts:.
但是我在安装我的应用程序时没有看到这样的消息。我尝试了发布和调试版本,尝试将其上传到 Play 商店的 Alpha 测试并从那里安装,结果相同。为什么 Android 不验证我的 Intent 过滤器?
通过将此数据标记移动到单独的 intent 过滤器中解决了此问题:
<data android:scheme="@string/url_scheme" android:host="open"/>
这是 AndroidManifest 现在的样子:
<activity android:name="com.mypackage.MyActivity"
android:launchMode="singleTask">
<intent-filter tools:node="merge" android:autoVerify="true">
<data android:scheme="https"
android:host="@string/branch_io_host"
android:pathPrefix="@string/branch_io_path_prefix"/>
<data android:scheme="http"
android:host="@string/branch_io_host"
android:pathPrefix="@string/branch_io_path_prefix"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<data android:scheme="@string/url_scheme" android:host="open"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
来自 IntentFilter 的消息现在按预期显示在日志中。
对于可能像我一样粗心的人,根据 https://developer.android.com/training/app-links:
Android App Links on Android 6.0 (API level 23) and higher allow an app to designate itself as the default handler of a given type of link.
我碰巧在 Android 5.1 设备上随机测试过 Android 6,intent 过滤器可以工作,但 android:autoVerify="true"
不会。您将不会在 adb logcat
中看到 IntentFilterIntentSvc
日志,这意味着不会进行 url 验证。在这种情况下,Android 将打开默认的应用程序选择面板。
Deeplink无需用户提示即可工作
假设您的应用程序清单声明了多个主机,例如 myhost1.com、myhost2.com 和 myhost3.com、
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="myhost1.com"
android:pathPrefix="/start" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="myhost2.com"
android:pathPrefix="/start" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="myhost3.com"
android:pathPrefix="/start" />
</intent-filter>
并为每个部署 assetlinks.json
https://myhost1.com/.well-known/assetlinks.json
https://myhost2.com/.well-known/assetlinks.json
https://myhost3.com/.well-known/assetlinks.json
从 ADB 安装应用程序时 或 Google Play 商店继续检查您的 Logcat IntentFilterIntentOp 标签,如下所示
I/IntentFilterIntentOp:正在验证 IntentFilter。 verificationId:9 方案:“https” 主机:“myhost1.com myhost2.com myhost3.com” 包:“com.mydeeplink.app”。 [上下文 service_id=244 ]
安装时,如果 任何一个 主机失败,您的 DIRECT 打开深度 link 将无法工作,将验证清单声明。失败意味着系统将提示用户选择您的应用程序或浏览器。
NOTE NOTE NOTE: 如果您在清单中声明任何测试环境,这些环境将在未来被删除。它会导致您的应用 IntentFilterIntentOp FAILURE。直接开深会断link.
对于稍后将被删除的测试环境,请勿使用 android:autoVerify="true"。否则,您的生产应用深度 link 直接打开可能无法用于新安装。