是否可以在不使用私有库的情况下获取iPhone上所有可用SSID 的列表?
我在没有私有库的情况下阅读iPhone获取SSID,这是关于获取有关当前网络的详细信息.
这个答案提到:
如果您越狱设备,您可以使用Apple80211私有框架查找可用的Wi-Fi网络及其信号强度.但这也意味着您的应用会被拒绝.
Apple拥有CaptiveNetwork API,但似乎没有一个解决方案来获取所有可用网络的列表.似乎只能通过使用Apple80211私有库或连接到所有这些库来实现.
我错过了什么,或者没有解决方案?
这就是问题所在,但这里有一个长版本:我正在研究一个需要模仿 Belkin Wemo 连接工作流程的项目。WeMo 是一个物理开关,可以通过 iOS 应用程序进行控制。

这是设置的工作原理:
这让我想到:WeMo 应用程序如何检查可用网络——也就是,是否有用于扫描可用网络、显示它们并使用它们的 iOS API?
我已经这样做了。
1.在Apple Developer页面添加IOS证书。
2. 在 Apple Developer 页面中添加启用 Network Extension 的标识符 App ID。
3. 在 Apple Developer 页面中添加配置文件。
4. 创建 Xcode 项目并输入在苹果开发者页面上制作的正确包 ID。并签下合适的球队。
5. 添加能力和库(网络扩展框架)。
6. 5后,在我的Xcode项目中自动生成Entitlement文件。
7.上次我写的代码是这样的。
NSLog(@"List Scan START");
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@"Try Here" forKey:kNEHotspotHelperOptionDisplayName];
dispatch_queue_t queue = dispatch_queue_create("com.miro.wifilist", 0);
BOOL isAvailable = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList ) {
for (NEHotspotNetwork* network in cmd.networkList) {
NSLog(@"%@", network.SSID);
}
} else {
NSLog(@"there …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试构建概念验证的iOS应用,以检查我们是否能够在不部署信标或任何其他硬件的情况下实现某种室内定位功能。
我们有什么
有一个数据库,其中包含我们建筑物中所有已注册的访问点,包括其X坐标和Y坐标。坐标被映射到横跨整个建筑物的定制网格。
该应用程序将使用我们的企业版发行,因此没有任何有关Apple Store要求的限制。该应用将仅在使用证书自动连接到正确的WiFi的设备上运行。
我们想要建造什么
为了提高应用程序的可用性,我们想向用户显示他当前的位置。使用Apple的本机CLLocation服务不够准确,因为我们在建筑物内运营。基本思想是获取所有附近的接入点(包括其BSSID和信号强度),并使用信号强度和接入点的位置数据库来计算或多或少的准确位置(请参见上文)。
到目前为止我尝试过的
使用SystemConfiguration.CaptiveNetwork获得BSSID
import SystemConfiguration.CaptiveNetwork
func getCurrentBSSID() -> String {
guard let currentInterfaces = CNCopySupportedInterfaces() as? [String] else { return "" }
for interface in currentInterfaces {
print("Looking up BSSID info for \(interface)") // en0
let SSIDDict = CNCopyCurrentNetworkInfo(interface as CFString) as! [String : AnyObject]
return SSIDDict[kCNNetworkInfoKeyBSSID as String] as! String
}
return ""
}
Run Code Online (Sandbox Code Playgroud)
此解决方案有效(在设置了适当的权利之后),但是我只能读取当前连接的接入点的BSSID 。
使用UIStatusBarDataNetworkItemView于读出信号强度
private func wifiStrength() -> Int? {
let app …Run Code Online (Sandbox Code Playgroud) 我们尝试了新的NetworkExtension API.我们成功地重新创建了应用程序中的所有步骤.但是,我们有一个问题,我们仍然没有在Wifi设置屏幕中看到SSID名称下面的自定义注释.我们在ios 9 Beta 3,xcode 7 beta 3上.
我们已成功完成这些步骤:
@note 1应用程序的Info.plist必须包含一个包含'network-authentication'的UIBackgroundModes数组*.
@note 2*应用程序必须将'com.apple.developer.networking.HotspotHelper'*设置为其权利之一.权利的值是布尔值*值true.
这是我们在App中的代码.我们试图通过文本"试试这里"以"Internet"的名称来注释SSID.我们得到了为SSID"Internet"调用setConfidence方法的日志.但是,我们在Wifi选择屏幕中看不到实际的注释.
我们还试图为选项对象传递'nil',该对象承诺将App名称显示为默认注释.但我们也没有看到.我们得到方法registerWithOptions()的调用返回'true',当我们打开wifi设置屏幕时我们得到回调
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@"Try Here" forKey:kNEHotspotHelperOptionDisplayName];
dispatch_queue_t queue = dispatch_queue_create("com.myapp.ex", 0);
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue
handler: ^(NEHotspotHelperCommand * cmd) {
if(cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList ) {
for (NEHotspotNetwork* network in cmd.networkList) {
if ([network.SSID isEqualToString:@"Internet"]){
[network setConfidence:kNEHotspotHelperConfidenceHigh];
NSLog(@"Confidance set to high for ssid:%@",network.SSID);
}
}
}
}];
Run Code Online (Sandbox Code Playgroud)
=========================
请帮助我们了解我们缺少的是什么?