这是我在 iOS5-7 上使用的
void* library = dlopen("/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration", RTLD_LAZY);
int (*apple80211Open)(void*) = (int(*)(void*))dlsym(library, "Apple80211Open");
int (*apple80211Bind)(void*, NSString*) = (int(*)(void*, NSString*))dlsym(library, "Apple80211BindToInterface");
int (*apple80211Close)(void*) = (int(*)(void*))dlsym(library, "Apple80211Close");
int (*apple80211Scan)(void*, NSArray**, void*) = (int(*)(void*, NSArray**, void*))dlsym(library, "Apple80211Scan");
void *airport = NULL;
apple80211Open(&airport);
apple80211Bind(airport, @"en0");
NSArray* networks = nil;
apple80211Scan(airport, &networks, [NSDictionary dictionary]);
//"networks" is an array of NSDictionary objects for all the visible Wi-Fi networks
apple80211Close(airport);
dlclose(library);
IPConfiguration
不是胖二进制文件。它仅包含一种与设备匹配的架构。因此,如果您计划支持 arm64 设备,您还必须为 arm64 编译代码 - 32 位应用程序无法加载 64 位 dylib。armv7 和 arm64 足以满足所有现代设备的需求。
更新
不幸的是,即使在越狱设备上,此代码也无法在常规 iOS 应用程序中运行。越狱不会关闭沙箱,这就是代码不起作用的原因。要使此代码正常工作,您需要将应用程序放在/var/mobile/Applications
不应用沙盒限制的目录之外。它可以是/Applications
目录中的守护进程、tweak 或 GUI 应用程序。默认情况下,该目录中的应用程序没有任何限制,可以访问任何私有 API。