IOS零碎技术整理(3)-获取wifi列表
1.?? 該功能實現基于MobileApple80211框架來進行開發,而目前該框架成為了私有框架,其中的API均為私有API。
如果使用這些API可能導致應用不能上app store或者ios版本升級過程中,可能對私有api不兼容,導致程序莫名的掛掉或數據獲取失敗
2.?? 終端必須越獄,且必須把程序部署到終端的/Applications目錄下取得超級用戶權限才能獲得wifi的訪問權限
代碼
#import <Foundation/Foundation.h>
#import <CoreFoundation/CoreFoundation.h>
#include <dlfcn.h>
@interface SOLStumbler : NSObject {
??? NSMutableDictionary *networks; //Key: MAC Address (BSSID)
???
??? void *libHandle;
??? void *airportHandle;
??? int (*apple80211Open)(void *);
??? int (*apple80211Bind)(void *, NSString *);
??? int (*apple80211Close)(void *);
??? int (*associate)(void *, NSDictionary*, NSString*);
??? int (*apple80211Scan)(void *, NSArray **, void *);
}
- (NSDictionary *)networks;???????????????????????????????????????????????????????????? //returns all 802.11 scanned network(s)
- (NSDictionary *)network:(NSString *) BSSID;?????????????????? //return specific 802.11 network by BSSID (MAC Address)
- (void)scanNetworks;
- (int)numberOfNetworks;
@end
?
#import "SOLStumbler.h"
?
@implementation SOLStumbler
?
- (id)init
{
??? self = [super init];
???
??? networks = [[NSMutableDictionary alloc] init];
??? libHandle = dlopen("/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration", RTLD_LAZY);
??? char *error;
??? if (libHandle == NULL && (error = dlerror()) != NULL)? {
?????? NSLog(@">>>? error %s",error);
?????? exit(1);
??? }
??? apple80211Open = dlsym(libHandle, "Apple80211Open");
??? apple80211Bind = dlsym(libHandle, "Apple80211BindToInterface");
??? apple80211Close = dlsym(libHandle, "Apple80211Close");
??? apple80211Scan = dlsym(libHandle, "Apple80211Scan");
??? apple80211Open(&airportHandle);
??? apple80211Bind(airportHandle, @"en0");
??? return self;
}
?
- (NSDictionary *)network:(NSString *) BSSID
{
??? return [networks objectForKey:@"BSSID"];
}
?
- (NSDictionary *)networks
{
??? return networks;
}
?
- (void)scanNetworks
{
??? NSLog(@"Scanning WiFi Channels...");
???
??? NSDictionary *parameters = [[NSDictionary alloc] init];
??? NSArray *scan_networks; //is a CFArrayRef of CFDictionaryRef(s) containing key/value data on each discovered network
??? apple80211Scan(airportHandle, &scan_networks, parameters);
??? NSLog(@"===-scan_networks-======%@",scan_networks);
??? for (int i = 0; i < [scan_networks count]; i++) {
?????? [networks setObject:[scan_networks objectAtIndex: i] forKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]];
??? }
??? NSLog(@"Scanning WiFi Channels Finished.");
}
?
- (int)numberOfNetworks
{
??? return [networks count];
}
?
- ( NSString * ) description {
??? NSMutableString *result = [[NSMutableString alloc] initWithString:@"Networks State: \n"];
??? for (id key in networks){
?????? [result appendString:[NSString stringWithFormat:@"%@ (MAC: %@), RSSI: %@, Channel: %@ \n",
????????????????????????? ? [[networks objectForKey: key] objectForKey:@"SSID_STR"], //Station Name
????????????????????????? ? key, //Station BBSID (MAC Address)
????????????????????????? ? [[networks objectForKey: key] objectForKey:@"RSSI"], //Signal Strength
????????????????????????? ? [[networks objectForKey: key] objectForKey:@"CHANNEL"]? //Operating Channel
????????????????????????? ? ]];
??? }
??? return [NSString stringWithString:result];
}
?
- (void) dealloc {
??? apple80211Close(airportHandle);
??? [super dealloc];
}
@end
轉載于:https://www.cnblogs.com/v-jing/p/3302887.html
總結
以上是生活随笔為你收集整理的IOS零碎技术整理(3)-获取wifi列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android开发------Activ
- 下一篇: 在Eclipse中导入dtd和xsd文件