返回

在Android 13上实现无指定主机的深度链接:终极指南

Android

在Android 13上无指定主机的深度链接:终极指南

深度链接对于现代移动应用程序至关重要,它允许用户直接链接到应用程序内的特定内容。在Android 13及更早版本中,可以通过使用通配符主机在清单文件中指定深度链接。然而,对于目标版本为31或更高的应用,此方法已不再可行。

为什么传统的通配符主机方法失效了?

在Android 12及更早版本中,可以使用通配符主机(例如 *。example.com)来指定深度链接。这意味着该应用程序可以处理来自example.com域下的任何子域的深度链接。

然而,在Android 13中,出于安全考虑,谷歌引入了更严格的深度链接处理措施。对于目标版本为31或更高的应用程序,现在必须为每个子域指定一个单独的清单文件,以确保只有受信任的应用程序可以处理来自该子域的深度链接。

如何解决这个问题?

对于目标版本为31或更高的应用程序,可以通过创建单独的清单文件来解决无指定主机的深度链接问题,每个清单文件对应一个子域。以下步骤将指导你完成此过程:

  1. 创建清单文件: 为每个子域创建一个单独的清单文件。每个清单文件应包含以下内容:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    
    <application>
        <meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
        <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:host="client1.example.com" />
            <data android:scheme="http"/>
            <data android:scheme="https"/>
        </intent-filter>
    </application>
    
```
将client1.example.com替换为你的子域名称。
  1. 构建APK: 使用以下命令为每个清单文件构建APK:

    flutter build apk --target-platform android-arm,android-arm64
    
  2. 安装APK: 使用以下命令安装所有APK:

    flutter install
    

注意事项

  • 这种方法需要为每个子域创建和维护一个单独的清单文件。
  • 如果你的应用程序有许多子域,这可能会变得很繁琐。
  • 确保正确的清单文件与正确的APK关联。

常见问题解答

  1. 为什么Android 13改变了对深度链接的处理?

    • 为了提高安全性和防止恶意应用程序处理来自不受信任域的深度链接。
  2. 是否还有其他方法可以在不创建多个清单文件的情况下实现无指定主机的深度链接?

    • 目前还没有其他可行的解决方案。
  3. 我需要修改现有的应用程序吗?

    • 如果你的应用程序的目标版本低于31(Android 12),则无需进行任何更改。但是,对于目标版本为31或更高的应用程序,你需要创建单独的清单文件。
  4. 创建多个清单文件会影响应用程序性能吗?

    • 一般来说,不会。然而,如果你有大量的子域,这可能会略微影响启动时间。
  5. 如何测试无指定主机的深度链接?

    • 使用ADB命令 adb shell am start -W -a android.intent.action.VIEW -d "your://link" 来测试深度链接。

结论

在Android 13及更高版本中实现无指定主机的深度链接需要为每个子域创建单独的清单文件。虽然这可能是一种繁琐的过程,但它对于保持应用程序安全和遵守Google的政策至关重要。通过遵循本指南中的步骤,你可以确保你的应用程序可以成功处理深度链接,从而提升用户体验。