4

是否可以通过在 iOS 7 越狱设备上使用私有 API 来获取周围网络的 SSID 列表?

我知道MobileWiFi.framework 在 iOS 上管理 WiFi 功能的 MobileWiFi.framework(它取代了过时的 Apple80211 框架。)

这是 4 岁的答案如何使用它:Accessing & Using the MobileWiFi.framework

我尝试在 iOS 7 上使用这些方法,但没有运气。

在此解决方案作者的评论之一中,我收到了以下答案:

scanNetworks失败,因为该代码现在已有 4 年历史。正如我在回答中所描述的,您必须使用新框架来获得等效功能(至少从 iOS 5 开始您就必须这样做)。如果您尝试使用 iOS 7 执行此操作,我建议您发布一个新问题

ps

它不是Get SSID's in range iOS 7的副本。我询问这些功能的越狱方法。


升级版:

上面的链接和creker的答案中有工作代码。但它需要通过沙盒限制。所以,正确的问题是:有没有办法用普通的 iOS 应用程序做到这一点?

4

1 回答 1

1

这是我在 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。

于 2014-06-20T10:10:42.167 回答