You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Android应用无法调用已知mDNS端点的问题如何解决?

问题原因

Android 12以下系统原生不支持.local后缀的mDNS域名解析,所有走系统DNS解析的请求(包括系统浏览器、Axios等网络库)都会直接返回解析失败,而Windows/macOS自带Bonjour服务支持mDNS解析,所以可以正常访问。

解决方法

1. Android 12(API Level 31)及以上版本适配

  • 先在AndroidManifest.xml中申请必要权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
  • 配置网络安全规则,放行.local域名的明文HTTP请求(如果你的接口用的是HTTP而非HTTPS),配置方法参考下方的通用注意事项。
    完成以上配置后可以直接用http://mymdnstest.local/setSettings调用Axios。

2. Android 11及以下版本适配

该版本区间的Android系统没有内置mDNS解析能力,即便你已知mDNS域名,也需要先手动将域名解析为对应的IP,再发起请求:

  • 首先申请上一点提到的所有必要权限
  • 使用mDNS解析工具直接解析已知主机名,无需全网扫描,示例逻辑如下:
import Zeroconf from 'react-native-zeroconf';
const zeroconf = new Zeroconf();

// 解析指定mDNS域名
zeroconf.resolveHost('mymdnstest.local')
  .then(ip => {
    // 替换域名后发起Axios请求
    const requestUrl = `http://${ip}/setSettings`;
    // 在这里调用Axios访问requestUrl即可
  })
  .catch(err => {
    // 处理解析失败逻辑,比如设备离线、不在同一子网
  });
通用注意事项
  • 明文HTTP限制:Android 9及以上默认禁止所有明文HTTP请求,如果你没有给IoT设备配置HTTPS,需要添加网络安全配置,在android/app/src/main/res/xml下新建network_security_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">local</domain>
    </domain-config>
</network-security-config>

之后在AndroidManifest.xml的application标签中添加属性:android:networkSecurityConfig="@xml/network_security_config"

  • 网络环境要求:手机和IoT设备必须连接到同一个WiFi网络,且路由器未开启AP隔离、组播限制,否则mDNS解析会失败。

内容的提问来源于stack exchange,提问作者Varun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:15:02