我目前正在尝试构建概念验证的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 ""
}
此解决方案有效(在设置了适当的权利之后),但是我只能读取当前连接接入点的BSSID。
使用UIStatusBarDataNetworkItemView
读取信号强度
private func wifiStrength() -> Int? {
let app = UIApplication.shared
var rssi: Int?
guard let statusBar = app.value(forKey: "statusBar") as? UIView, let foregroundView = statusBar.value(forKey: "foregroundView") as? UIView else {
return rssi
}
for view in foregroundView.subviews {
if let statusBarDataNetworkItemView = NSClassFromString("UIStatusBarDataNetworkItemView"), view .isKind(of: statusBarDataNetworkItemView) {
if let val = view.value(forKey: "wifiStrengthRaw") as? Int {
rssi = val
break
}
}
}
return rssi
}
这很明显,它只读取连接的WiFi网络的信号强度,而不读取特定于接入点的信号强度。
问题
有没有办法读取可用接入点(不是 WiFi网络)的列表,包括其BSSID和信号强度?由于设备处于设备管理之下,因此我们无法越狱。
也许有一些方法可以使用MobileWiFi.framework
(请参阅this link),但是我无法全神贯注地在Swift中进行开发(这是iOS开发的初学者) )。
答案 0 :(得分:4)
恐怕无法在未越狱的设备上实施此操作。
我为此找到了some code,但是已经过时了。我认为您不会在iOS 3/4设备上使用它。
NEHotspotHelper
仅在“设置”->“ Wifi”页面处于活动状态时有效。您可以在那里获得信号强度,但是我不确定它将如何工作。
MobileWiFi.framework
需要授权,而没有jailbreak则无法设置。
有用的链接:
Technical Q&A QA1942
可能只有iBeacons或QR(AR)。
答案 1 :(得分:1)
您可以在建筑物内使用可移动的Differential GPS参考站,将准确度提高到1-3厘米,然后依靠手机内置的GPS。
答案 2 :(得分:0)
尽管许多资源都说,在使用苹果公司的“ 官方”框架时,您只能获得iPhone目前所连接的网络的SSID。解决方法如下:
您可以使用NEHotspotConfigurationManager类,但首先必须在Xcode中启用Hotspot Configuration Entitlement(属性列表键)。
您还可以使用NEHotspotHelper类(尽管需要 Apple的许可)。为此,您需要申请Network Extension授权,然后修改您的Provisioning Profile以及一些其他操作。请查看this SO post了解更多详细信息。