我正在做一些不需要在 App Store 上的东西,所以我不介意使用私有(private) API 来满足我的需求
我正在尝试使用 MobileWiFi。读取手机当前连接的无线网络的 RSSI 值的框架。我已经包含了
https://github.com/Cykey/ios-reversed-headers/tree/c613e45f3ee5ad9f85ec7d43906cf69ee812ec6a/MobileWiFi ` header 并使用桥接 header 将它们包含在我的 swift 项目中,并编写如下代码。请原谅,我是新手。
import SystemConfiguration.CaptiveNetwork
typealias _WiFiManagerClientCreate = @convention(c) (CFAllocator, CInt) -> UnsafeRawPointer
typealias _WiFiManagerClientCopyDevices = @convention(c) (UnsafeRawPointer) -> CFArray
typealias _WiFiDeviceClientCopyProperty = @convention(c) (UnsafeRawPointer, CFString) -> CFPropertyList
if let libHandle = dlopen (Paths.ipConfiguration, RTLD_LAZY) {
result = libHandle.debugDescription
let _createManagerPtr = dlsym(libHandle, "WiFiManagerClientCreate")
let _clientCopyDevicesPtr = dlsym(libHandle, "WiFiManagerClientCopyDevices")
let _clientCopyPropertyPtr = dlsym(libHandle, "WiFiDeviceClientCopyProperty")
if (_createManagerPtr != nil) && (_clientCopyDevicesPtr != nil) && (_clientCopyPropertyPtr != nil) {
let _createManager = unsafeBitCast(_createManagerPtr, to: _WiFiManagerClientCreate.self)
let _clientCopyDevices = unsafeBitCast(_clientCopyDevicesPtr, to: _WiFiManagerClientCopyDevices.self)
let _clientCopyProperty = unsafeBitCast(_clientCopyPropertyPtr, to: _WiFiDeviceClientCopyProperty.self)
let manager = _createManager(kCFAllocatorDefault, 0)
let devices = _clientCopyDevices(manager)
let client = CFArrayGetValueAtIndex(devices, 0)
let data = _clientCopyProperty(client!, "RSSI" as CFString)
let rssi = CFDictionaryGetValue(data as! CFDictionary, "RSSI_CTL_AGR")
NSLog("RSSI: \(rssi)")
}
dlclose(libHandle)
}
这会产生错误fatal error: unwrappedly found nil while unwrapping an Optional value which stems from trying to call _createManager
最佳答案
我最终使用了这个解决方法:
+ (int) wifiStrength {
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
NSString *dataNetworkItemView = nil;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
dataNetworkItemView = subview;
break;
}
}
return[[dataNetworkItemView valueForKey:@"wifiStrengthRaw"] intValue];
}
无需任何权利或越狱即可工作
关于ios - 使用私有(private) API 读取 WiFi RSSI 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44167577/