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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:22:39