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
相关产品推荐
相关产品推荐

