我应该去哪里找到iOS Obj-C代码来扫描和连接WiFi(私有API)?

7

我需要一个扫描并连接WiFi的Obj-C示例代码。私有API也可以,因为我不打算将应用程序发布到AppStore。 我在Cydia中找到了一个名为“WiFiFoFum”的应用程序,可以进行扫描和连接,但不幸的是我找不到该应用程序的源代码。 有人知道我可以在哪里找到那个代码吗? 谢谢。


1
iOS 8有任何更新吗? 我尝试了https://github.com/devinshively/wifiAssociate,但它在iOS 8上不起作用。 - divyum
不,我没有在iOS 8上测试过它。 - almas
2个回答

8

这里找到了答案:http://code.google.com/p/iphone-wireless/issues/detail?id=20

在我的iPhone 4 v5.1.1上可以完美地使用。我能够扫描并连接到网络。 您可以在此处下载项目:https://github.com/devinshively/wifiAssociate

这是一个引用:

Apple80211Associate仍然有效(至少在3.1.2上有效)。在iPhone OS 2和3之间,框架的名称已更改,因此您应该按以下方式绑定函数:

void *airportHandle;
int     (*Apple80211Open)(void *);
int     (*Apple80211BindToInterface)(void *, NSString *);
int     (*Apple80211Close)(void *);
int     (*Apple80211Info)(void *, NSDictionary**);
int     (*Apple80211Associate)(void *, NSDictionary*, void *);
int     (*Apple80211Scan)(void *, NSArray **, void *);

libHandle       = dlopen("/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager", RTLD_LAZY);
Apple80211Open                          = dlsym(libHandle, "Apple80211Open");
Apple80211BindToInterface       = dlsym(libHandle, "Apple80211BindToInterface");
Apple80211Scan                          = dlsym(libHandle, "Apple80211Scan");
Apple80211Close                         = dlsym(libHandle, "Apple80211Close");
Apple80211Info                          = dlsym(libHandle, "Apple80211GetInfoCopy");
Apple80211Associate                     = dlsym(libHandle, "Apple80211Associate");

从v2到v3最显著的变化是SCAN_RSSI_THRESHOLD参数(用于扫描功能)。它以前需要一个正数,远离物理分贝,现在它需要信号的分贝数。如果您使用它,可以将其设置为-100:以下是代码片段(从我的代码中挑选,因此未经测试):
void *airportHandle;

NSArray *keys = [NSArray arrayWithObjects:@"SCAN_RSSI_THRESHOLD", @"SSID_STR", nil];
NSArray *objects = [NSArray arrayWithObjects:[NSNumber numberWithInt:-100], ssid, nil];

NSDictionary *params = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
NSArray *found;


int openResult = Apple80211Open(&airportHandle);
NSLog(@"Openning wifi interface %@", (openResult == 0?@"succeeded":@"failed"));

int bindResult = Apple80211BindToInterface(airportHandle, @IF_NAME);

int scanResult = Apple80211Scan(airportHandle, &found, params);

NSDictionary *network;

// get the first network found
network = [found objectAtIndex:0];
int associateResult = Apple80211Associate(airportHandle, network,NULL);

Apple80211Close(airportHandle);

1

Objective-C是编译型语言,因此您不能像脚本语言那样获取程序的源代码。您可以检查“WiFiFoFum”是否是开源的,也许可以从作者的Github上下载源代码。否则,您可以查看/System/Library/PrivateFrameworks目录中的私有框架,并使用class-dump-z将它们的头文件转储出来,就像这样:

$ class-dump-z -H <private framework>

当然不包括尖括号。

编辑:

刚刚检查了一下,看起来它不是开源的。


我不太擅长逆向工程,所以即使我得到了头文件(它们可以下载),我也不知道如何使用它们。这些方法需要一些参数(结构体),而我不知道它们是什么。这就是为什么我想要一个现成的 obj-c 代码示例。 - almas
好的,你无法看到方法的实现,它们被称为私有的(并且没有文档)是有原因的。名称和参数通常是函数功能的良好指示器。查找任何您不确定的结构,并且如果确实需要,您可以使用移动基座编写一个扩展程序来挂钩这些方法并查找更多有关传递给它们的信息以及它们返回的信息。 - John Corbett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接