列出/扫描可用的Wi-Fi网络 iPhone

5
我正在寻找一种在iPhone应用程序中呈现可用WiFi的方法。到目前为止,我的研究结果如下:
  • 实现此功能的应用已从AppStore中删除(这对我来说是可以接受的,因为你无法通过AppStore部署该应用)
  • 苹果隐藏了扫描所需的功能,并且你找不到任何关于“如何使用”的解释/注释/示例
  • http://code.google.com/p/iphone-wireless 似乎是最有前途的。无论如何,我无法弄清楚如何将提供的源代码包含在我的代码中,以便在设备上运行

即使是提到的适应性 htt ://code.google.com/p/iphone-wireless/issues/detail?id=26 也没有给我想要的结果。最大的进展是在设备(iPhone 3GS; iOS 3.1.3)上启动应用程序后出现以下信息:

dlopen错误:dlopen(/System/Library/SystemConfiguration/Aeropuerto.bundle/Aeropuerto, 1):未找到图像 失败:__Apple80211Associate

产生错误的源代码在此处:

NSMutableDictionary *networks;
bool scanning;
void *libHandle;
void *airportHandle;
int (*open)(void *);
int (*bind)(void *, NSString *);
int (*close)(void *);
int (*scan)(void *, NSArray **, void *);

networks = [[NSMutableDictionary alloc] init];
// libHandle = dlopen("/System/Library/Frameworks/Preferences.framework/Preferences", RTLD_LAZY);
// libHandle = dlopen("/System/Library/PrivateFrameworks/Apple80211.framework/Preferences", RTLD_LAZY);
libHandle = dlopen("/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager", RTLD_LAZY);

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

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

NSLog(@"Scanning...");
scanning = true;
NSArray *scan_networks;
NSDictionary *parameters = [[NSDictionary alloc] init];
scan(airportHandle, &scan_networks, parameters);
bool changed;
for (int i = 0; i < [scan_networks count]; i++) {
    if([networks objectForKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]] != nil 
       && ![[networks objectForKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]] isEqualToDictionary:[scan_networks objectAtIndex: i]])
        changed = true;
    [networks setObject:[scan_networks objectAtIndex: i] forKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]];
}
if(changed) {
    NSLog(@"NetworksUpdated");
}
scanning = false;
NSLog(@"Scan Finished...");
NSLog(@"Found %i networks: %@", [networks count], networks);

即使尝试其他已注释的行,它仍然无法运行: 程序收到EXC_BAD_ACCESS和几个警告: 检查check_safe_call:无法恢复当前帧 警告:无法恢复先前选择的帧。
我正在寻找如何在我的项目中包含iphone-wireless以及如何修改给定的代码的提示? 另一种选择是提示如何扫描您环境中的Wi-Fi。
如果有人能帮忙就太好了。

刚试了一下:尽管代码在运行时给我警告,但它还是打印出了发现的 Wi-Fi。肯定有比这个有漏洞的方法更好的吧?至少应该正确地打开和关闭 WiFi 硬件的访问权限(似乎上面的代码无法工作)。0o - m Jae
1个回答

1

在3.X及以上版本中,路径已经发生了变化,从:

/System/Library/SystemConfiguration/Aeropuerto.bundle/Aeropuerto

to:

/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfifuration

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