Flutter Web端如何获取物理设备具体型号?
Web端获取物理设备具体型号的可行性与实现方案
Web端可以有限度地获取物理设备的具体型号,但不同平台(iOS/Android)的支持情况差异较大,且存在一定限制:
iOS Web端
iOS的Safari及基于WebKit内核的浏览器,会在userAgent中包含设备的内部标识符(如iPhone11,8对应iPhone 11),可以通过解析该标识符并映射为具体型号:
- 需要维护一个设备标识符与型号的映射表(苹果会持续更新设备代码,需定期维护)
- 通过Flutter Web的
dart:html库获取userAgent,再做正则匹配和映射
Android Web端
Android平台的Web浏览器(如Chrome)通常不会在userAgent中暴露精准的设备型号,仅能获取品牌(如Samsung)或系统版本信息,大部分情况下无法直接拿到三星S22 Ultra这类具体型号,仅少数定制浏览器或厂商设备会特殊处理。
Flutter Web端修改示例代码
替换你当前的Web端设备类型判断逻辑,加入userAgent解析:
import 'dart:html' as html; // 解析Web端设备型号 String getWebDeviceModel() { final userAgent = html.window.navigator.userAgent.toLowerCase(); // 处理iOS设备 if (userAgent.contains('iphone')) { final deviceCodeMatch = RegExp(r'iphone(\d+,\d+)').firstMatch(userAgent); if (deviceCodeMatch != null) { final deviceCode = deviceCodeMatch.group(1); // 示例映射表,需根据实际需求补充完整 final iosModelMap = { '11,8': 'iPhone 11', '12,1': 'iPhone 11 Pro', '12,3': 'iPhone 11 Pro Max', '13,1': 'iPhone 12', '13,2': 'iPhone 12 Pro', }; return iosModelMap[deviceCode] ?? 'iOS Web'; } return 'iOS Web'; } else if (userAgent.contains('ipad')) { return 'iPad Web'; } else if (userAgent.contains('android')) { // 尝试提取Android设备品牌(型号大概率无法获取) final brandMatch = RegExp(r'(samsung|xiaomi|huawei|oneplus)').firstMatch(userAgent); if (brandMatch != null) { final brand = brandMatch.group(1)!.toUpperCase(); return '$brand Android Web'; } return 'Android Web'; } else { return 'Desktop Web'; } } // 原代码替换后的逻辑 deviceType: kIsWeb ? getWebDeviceModel() : Platform.isAndroid ? (await deviceInfo.androidInfo).model : (await deviceInfo.iosInfo).utsname.machine,
注意事项
- iOS设备的映射表需要自行维护,可根据苹果官方设备标识符信息更新
- Android Web端的型号获取可靠性极低,不要依赖该场景获取精准型号
- 部分浏览器的隐私保护设置可能会篡改
userAgent,导致信息不准确 - 不同浏览器的
userAgent格式存在差异,需做好兼容处理
内容的提问来源于stack exchange,提问作者Rami Dhouib
相关产品推荐
相关产品推荐

