Delphi 11.3 iOS16环境下获取Wi-Fi属性问题求助
Delphi 11.3 iOS获取Wi-Fi属性(SSID、IP等)解决方向
一、先搞定iOS权限配置
iOS对Wi-Fi信息获取的权限限制严格,必须在项目中配置以下权限:
- Wi-Fi权限:在
Info.plist.template.xml中添加NSWiFiUsageDescription键,说明App使用Wi-Fi信息的用途,示例:<key>NSWiFiUsageDescription</key> <string>获取Wi-Fi信息以提供网络适配服务</string> - 位置权限:iOS 13+要求获取SSID必须具备位置权限,需添加
NSLocationWhenInUseUsageDescription或NSLocationAlwaysAndWhenInUseUsageDescription,示例:<key>NSLocationWhenInUseUsageDescription</key> <string>需要位置权限以获取当前Wi-Fi网络信息</string> - 特殊Wi-Fi枚举权限:若需枚举所有可用Wi-Fi网络(而非仅当前连接的),需在开发者后台的App ID中开启
com.apple.developer.networking.wifi-info权限,并在项目的Entitlements.plist中添加对应配置:<key>com.apple.developer.networking.wifi-info</key> <true/>
二、调用iOS原生API实现
获取当前连接的SSID
使用CoreWLAN框架的CNCopyCurrentNetworkInfo函数,需注意iOS版本兼容性及权限前置:
uses iOSapi.CocoaTypes, iOSapi.CoreWLAN, iOSapi.Foundation, System.SysUtils; function GetCurrentWiFiSSID: string; var NetworkInfo: CFDictionaryRef; SSID: NSString; begin Result := ''; // iOS 13及以上版本可用该API if TOSVersion.Check(13) then begin NetworkInfo := CNCopyCurrentNetworkInfo(nil); if NetworkInfo <> nil then try SSID := TNSString.Wrap(CFDictionaryGetValue(NetworkInfo, kCNNetworkInfoKeySSID)); if SSID <> nil then Result := SSID.UTF8String; finally CFRelease(NetworkInfo); end; end; end;
注意:必须先申请并获得位置权限,否则
CNCopyCurrentNetworkInfo会返回nil。
获取Wi-Fi接口的IP地址
通过getifaddrs函数枚举网络接口,定位Wi-Fi对应的en0接口获取IP:
uses System.SysUtils, iOSapi.StdC, iOSapi.Network; function GetWiFiIPAddress: string; var ifaddrs: Pifaddrs; ifa: Pifaddrs; tmpAddr: in_addr; buf: array[0..INET_ADDRSTRLEN-1] of Char; begin Result := ''; if getifaddrs(@ifaddrs) = 0 then try ifa := ifaddrs; while ifa <> nil do begin // en0是iOS设备的Wi-Fi接口 if (ifa^.ifa_addr^.sa_family = AF_INET) and (Pos('en0', string(ifa^.ifa_name)) > 0) then begin tmpAddr := Pin_addr(ifa^.ifa_addr)^.sin_addr; if inet_ntop(AF_INET, @tmpAddr, buf, SizeOf(buf)) <> nil then begin Result := string(buf); Break; end; end; ifa := ifa^.ifa_next; end; finally freeifaddrs(ifaddrs); end; end;
三、Kastri库问题排查
若使用Kastri库未成功,需检查:
- 确保使用最新版本的Kastri库,旧版本可能未适配iOS 14+的权限变化
- 确认项目中已正确配置上述所有权限,Kastri的
TWiFiManager依赖这些权限才能正常工作 - 调用Kastri接口前,先通过系统API确认位置权限已获得
四、测试注意事项
- 必须使用真实iOS设备测试,模拟器无法获取真实Wi-Fi信息
- 测试时设备需连接Wi-Fi网络,飞行模式或未联网状态下无法获取数据
- 首次启动App时,务必允许系统弹出的位置权限和Wi-Fi权限请求
内容的提问来源于stack exchange,提问作者Claudemir Passoni
相关产品推荐
相关产品推荐

