React-Native中如何处理expo-barcode-scanner扫描到的Wi-Fi类型QR码
React Native处理WiFi类非链接二维码的实现方案
React Native 本身没有内置专门处理非链接格式二维码的API,这类自定义格式的二维码都需要你先手动解析协议内容,再调用对应原生能力实现需求,具体实现步骤如下:
步骤1:解析WiFi二维码的标准格式
你扫描得到的WiFi二维码内容遵循ZXing定义的标准WiFi二维码协议,结构为:WIFI:T:[加密类型];S:[WiFi名称];P:[WiFi密码];H:[是否为隐藏网络];;,你可以写个简单的解析函数提取字段:
// 输入扫描得到的原始data字符串,返回解析后的WiFi信息对象 const parseWifiQrData = (rawData) => { const wifiInfo = {}; if (!rawData.startsWith('WIFI:')) return null; // 移除前缀和结尾的多余分号 const content = rawData.slice(5).replace(/;+$/, ''); const keyValuePairs = content.split(';'); keyValuePairs.forEach(item => { const [key, value] = item.split(':'); switch(key) { case 'T': wifiInfo.security = value; break; case 'S': wifiInfo.ssid = value; break; case 'P': wifiInfo.password = value; break; case 'H': wifiInfo.isHidden = value === 'true'; break; } }); return wifiInfo.ssid ? wifiInfo : null; }
步骤2:调用WiFi连接能力实现自动连接
因为你使用的是Expo生态,推荐直接用适配Expo的expo-wifi库实现WiFi连接,无需原生修改:
- 先安装依赖:
npx expo install expo-wifi - 在
app.json中配置对应权限:
安卓端添加ACCESS_FINE_LOCATION、CHANGE_WIFI_STATE权限,iOS端添加NSLocalNetworkUsageDescription权限说明 - 连接逻辑示例:
import * as Wifi from 'expo-wifi'; // 扫描成功后的处理逻辑 const handleBarCodeScanned = async ({ type, data }) => { if (type !== 'org.iso.QRCode') return; // 先判断是不是WiFi格式二维码 if (data.startsWith('WIFI:')) { const wifiInfo = parseWifiQrData(data); if (!wifiInfo) return; try { await Wifi.connectAsync(wifiInfo.ssid, { password: wifiInfo.password, type: wifiInfo.security === 'WPA' ? Wifi.WiFiSecurityType.WPA : Wifi.WiFiSecurityType.WEP, isHidden: wifiInfo.isHidden || false }); console.log('WiFi连接成功'); } catch (error) { console.log('WiFi连接失败:', error.message); } } else { // 其他类型二维码的处理逻辑 Linking.openURL(data).catch(err => console.log('非链接格式二维码', err)); } };
注意事项
- 安卓10及以上版本需要用户授予位置权限才能调用WiFi连接接口
- iOS端需要在开发者账号中开启Access WiFi Information能力才能正常调用连接方法
内容的提问来源于stack exchange,提问作者Jose Bernardo
相关产品推荐
相关产品推荐

