返回

Flutter Android 无法连接外部 URL API?解决方法来了!

Android

Flutter Android 应用无法连接外部 URL API,仅能连接本地内部 IP API,而 iOS 正常工作

Flutter 应用在 Android 上连接外部 URL API 失败,但可以连接本地内部 IP API,并在 iOS 上运行正常,这通常与 Android 的网络配置和安全策略有关。 本文将分析可能的原因,并提供相应的解决方案。

问题分析

错误信息 "network is unreachable, No address associated with hostname" 表明 Android 设备无法解析域名或者无法建立网络连接。尽管模拟器浏览器和物理设备可以访问 API URL,这并不排除应用本身存在配置问题。 测试代码中成功的域名解析和 Socket 连接进一步表明,网络连接本身没有问题,问题可能出在应用的网络安全配置上。

解决方案

1. 检查网络安全配置(Network Security Configuration)

Android 9.0 (API 级别 28) 及更高版本默认使用 HTTPS 连接。如果 API 使用 HTTP,应用需要在 AndroidManifest.xml 文件中声明 android:usesCleartextTraffic="true" 或者配置网络安全配置文件。 这允许应用使用明文 HTTP 进行通信。

操作步骤:

  1. 修改 AndroidManifest.xml<application> 标签内添加 android:usesCleartextTraffic="true"
<application
    ...
    android:usesCleartextTraffic="true">
    ...
</application>
  1. 创建网络安全配置文件: 这是一个更灵活且安全的解决方案。
  • android/app/src/main/res 目录下创建 xml 目录(如果不存在)。
  • xml 目录下创建名为 network_security_config.xml 的文件。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

  • AndroidManifest.xml<application> 标签内添加 android:networkSecurityConfig="@xml/network_security_config"
<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
    ...
</application>

原理: android:usesCleartextTraffic="true" 允许所有明文流量。网络安全配置文件提供了更精细的控制,可以指定允许哪些域名使用 HTTP 或 HTTPS。 建议使用网络安全配置文件,并只允许必要的域名使用 HTTP,以提高应用的安全性。

安全建议: 尽可能使用 HTTPS。 如果必须使用 HTTP,请限制允许使用 HTTP 的域名,并确保 API 提供商采取了必要的安全措施。

2. 检查 URL 格式

确保 URL 格式正确,特别是 URL 中的协议部分 ( 或 https://)。 如果代码中省略了协议,Android 系统可能无法正确解析 URL。

代码示例:

final url = Uri.parse('http://www.test.com/api/Values/'); // 确保包含 http:// 或 https://

原理: 明确指定协议可以避免 Android 系统的歧义,确保 URL 被正确解析。

3. 清理项目并重新构建

有时候,构建缓存可能会导致问题。 尝试清理项目并重新构建,以确保所有配置更改生效。

命令行指令:

flutter clean
flutter pub get
flutter run

原理: 清理项目会删除构建缓存,并强制重新构建应用,这有助于解决由缓存引起的问题。

4. 检查模拟器网络设置

虽然模拟器通常可以访问网络,但偶尔也会出现网络配置问题。 尝试重启模拟器或者检查模拟器的网络设置。

操作步骤: 在 Android Studio 中,找到 AVD Manager,选中使用的模拟器,点击 "Edit",然后在 "Advanced settings" 中检查网络配置。

通过以上步骤,应该可以解决 Flutter Android 应用无法连接外部 URL API 的问题。 如果问题仍然存在,建议检查服务器端 API 是否正常运行,并使用网络调试工具分析网络流量,以进一步排查问题。