访问&使用MobileWiFi.framework

时间:2010-01-07 03:54:59

标签: iphone iphone-sdk-3.0

对于我的个人项目,我正在尝试检索iPhone WiFi信号强度。我完全清楚这是在无证善良的土地上,所以请不要回答“没有Appstore”的答案。 :)

Anywho,我一直在阅读以前的WiFi网络扫描仪应用程序(WiFi Stumbler),但我担心大多数(如果不是全部)反映过时的SDK文档。希望这个问题还能为最新的iPhone SDK 3.1.2提供一些集中/有见地的材料。

这是我不完整/不能正常工作的代码:

·H

 void *libHandle;
 void *airportHandle; 
 int (*open)(void *);
 int (*bind)(void *, NSString *);
 int (*close)(void *);
 int (*scan)(void *, NSArray **, void *);

的.m

libHandle = dlopen("/System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi",RTLD_LAZY);

open = dlsym(libHandle, "Apple80211Open");
bind = dlsym(libHandle, "Apple80211BindToInterface");
close = dlsym(libHandle, "Apple80211Close");
scan = dlsym(libHandle, "Apple80211Scan");

open(&airportHandle);
bind(airportHandle, @"en0");

NSLog(@"Result %@",libHandle);

在设备上执行时,它会产生我最喜欢的......

  

异常类型:EXC_BAD_ACCESS(SIGSEGV)

我在考虑动态加载调用,没有加载任何东西。目录: / System / Library / PrivateFrameworks / 仅列出没有二进制文件或别名的Info.plist文件。

可能做错了什么(错误的目录?)...感谢任何帮助!

另外,作为跟进。要提取WiFi信息,可以通过以下方式完成:

GetInfoCopy = dlsym(libHandle, "Apple80211GetInfoCopy");

我的问题是1)有人有运气吗? 2)你如何得到一个标题转储,就像我在Objective-C库中使用class-dump一样(因为MobileWifi在C中)?

4 个答案:

答案 0 :(得分:8)

对于任何偶然发现这个问题的人来说,这是我的图书馆访问802.11网络。虽然Apple声称拒绝任何使用私有框架的应用程序,但AppStore上有几个封闭源的WiFi应用程序。使用风险自负。

此库适用于iPhone SDK 3.1.2。

使用:

SOLStumbler *networksManager = [[SOLStumbler alloc] init];
[networksManager scanNetworks];

结果:

  

信息NSDictionary的网络NSDictionary。

使用CFShow探索包含信息的返回指针。或者调用示例输出的描述方法。

答案 1 :(得分:5)

截至2012年7月更新(iOS 5.0)

您尝试使用的代码非常陈旧。这些内容(例如 WiFiManager MobileWiFi )位于私有框架中。这意味着,如果从操作系统版本到版本,Apple可以而且经常会改变它或移动。

我在MobileWifi框架上运行nm,但没有看到任何这些函数名称。所以,我认为这就是你的代码失败的原因。

  

$ pwd   /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/PrivateFrameworks/MobileWiFi.framework

     

$ nm MobileWiFi | grep 80211

     

$

我想可能有必要在实际的设备框架上运行nm,但在看了之后我没有浪费时间:

Discussion of this framework, and follow-ons.

现在看来您可以在 IPConfiguration 框架中找到等效的(?)函数。试试这段代码:

libHandle = dlopen("/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration", RTLD_LAZY);

我在越狱的iOS 5.0.1手机上运行它并且它有效(加载了dylib并找到了一些Apple80211功能)。从我链接到的那个帖子中,看起来你可能需要在越狱手机上的 / Applications 中安装它,以便完全运行。或者,可能不得不将一些权利添加到您的沙盒应用程序中。

答案 2 :(得分:4)

这些Apple80211xxx功能在MobileWiFi.framework中不存在(您可以使用`nm'工具检查SDK二进制文件)。

(另外,从二进制文件转储C头是不可能的,因为在编译期间会删除所有类型信息。您需要自己进行逆向工程或等待某人这样做。)

答案 3 :(得分:2)

我不确定这是否有问题,但open / close / bind是已经在使用的名称(标准C库)。

二进制文件不存在,因为它存储在dyld shared_cache中(dlopen会成功,因为库在技术上是“加载的”。);但是,我注意到当你从dl *函数中检索它们时,你没有检查libHandle,open,close,bind或scan中的任何一个是否有效。