iPhone设备当前IP和SSID的获取
#import <Foundation/Foundation.h>
typedef void(^Complation)(NSString *res);
@interface WIFIManager : NSObject
+ (WIFIManager* )shareSington ;
- (void)localWIFIName:(Complation) complation;
- (void)localWiFiIPAddress:(Complation) complation;
@end
// 实现
#import "WIFIManager.h"
#import <SystemConfiguration/CaptiveNetwork.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <net/if.h>
#include <ifaddrs.h>
#import <dlfcn.h>
@implementation WIFIManager
+ (WIFIManager *)sharedInstance
{
static WIFIManager* manager = nil;
static dispatch_once_t once ;
dispatch_once(&once, ^{
manager = [[WIFIManager alloc] init];
});
return manager ;
}
- (void)localWIFIName:(Complation)complation
{
dispatch_queue_t queue=dispatch_queue_create("WIFI_NAME", NULL);
dispatch_async(queue, ^{
id obj = [self fetchSSIDInfo];
dispatch_async(dispatch_get_main_queue(), ^{
if ([obj isKindOfClass:[NSDictionary class]]) {
NSDictionary *dic = obj;
complation([dic objectForKey:@"SSID"]);
}else
{
complation(nil);
}
});
});
}
- (void)localWiFiIPAddress:(Complation)complation
{
dispatch_queue_t queue=dispatch_queue_create("WIFI_IP", NULL);
dispatch_async(queue, ^{
NSString *ip = [self localWiFiIPAddress];
dispatch_async(dispatch_get_main_queue(), ^{
complation(ip);
});
});
}
- (NSString *)localWiFiIPAddress
{
BOOL success;
struct ifaddrs * addrs;
const struct ifaddrs * cursor;
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != NULL) {
if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0)
{
NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
if ([name isEqualToString:@"en0"]) // Wi-Fi adapter
return [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return nil;
}
- (id)fetchSSIDInfo {
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
id info = nil;
for (NSString *ifnam in ifs) {
info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info && [info count]) { break; }
}
return info;
}
@end