一、手機電量獲取,方法二需要匯入標頭檔案#import<objc/runtime.h>
方法一、獲取電池電量(一般用百分數表示,大家自行處理就好)
-(CGFloat)getBatteryQuantity
{
return [[UIDevice currentDevice] batteryLevel];
}
方法二、
- (int)getCurrentBatteryLevel
{
UIApplication *app = [UIApplication sharedApplication];
if (app.applicationState == UIApplicationStateActive||
app.applicationState==UIApplicationStateInactive)
{
Ivar ivar= class_getInstanceVariable([app class],"_statusBar");
id status = object_getIvar(app, ivar);
for (id aview in [status subviews])
{
int batteryLevel = ;
for (id bview in [aview subviews])
{
if ([NSStringFromClass([bview class]) caseInsensitiveCompare:@"UIStatusBarBatteryItemView"]
== NSOrderedSame&&[[[UIDevice currentDevice] systemVersion] floatValue] >=6.0)
{ Ivar ivar = class_getInstanceVariable([bview class],"_capacity");
if(ivar)
{
batteryLevel = ((int (*)(id, Ivar))object_getIvar)(bview, ivar);
//這種方式也可以
/*ptrdiff_t offset = ivar_getOffset(ivar);
unsigned char *stuffBytes = (unsigned char *)(__bridge void *)bview;
batteryLevel = * ((int *)(stuffBytes + offset));*/
if (batteryLevel > && batteryLevel <= ){
return batteryLevel;
}
else{
return ;
}
}
}
}
}
}
return ;
}
二、獲取手機電池狀態(UIDeviceBatteryState為列舉型別)
// UIDeviceBatteryStateUnknown:無法取得充電狀態情況
// UIDeviceBatteryStateUnplugged:非充電狀態
// UIDeviceBatteryStateCharging:充電狀態
// UIDeviceBatteryStateFull:充滿狀態(連線充電器充滿狀態) -(UIDeviceBatteryState)getBatteryStauts
{
UIDevice *device = [UIDevice currentDevice];
device.batteryMonitoringEnabled = YES;
return device.batteryState;
}
三、獲取手機總執行記憶體大小
//3.獲取總記憶體大小
-(NSString *)getTotalMemorySize
{
return [self fileSizeToString:[NSProcessInfo processInfo].physicalMemory];
} -(NSString *)fileSizeToString:(unsigned long long)fileSize
{
NSInteger KB = ;
NSInteger MB = KB*KB;
NSInteger GB = MB*KB; if (fileSize < ) {
return @"0 B";
}else if (fileSize < KB) {
return @"< 1 KB";
}else if (fileSize < MB) {
return [NSString stringWithFormat:@"%.1f KB",((CGFloat)fileSize)/KB];
}else if (fileSize < GB) {
return [NSString stringWithFormat:@"%.1f MB",((CGFloat)fileSize)/MB];
}else {
return [NSString stringWithFormat:@"%.1f GB",((CGFloat)fileSize)/GB];
}
}
四、獲取當前剩餘記憶體和已用記憶體,需要新增標頭檔案#import <sys/sysctl.h> 和#import <mach/mach.h>
// 獲取當前裝置可用記憶體(單位:MB)
- (double)availableMemory
{
vm_statistics_data_t vmStats;
mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
kern_return_t kernReturn = host_statistics(mach_host_self(),
HOST_VM_INFO,
(host_info_t)&vmStats,
&infoCount); if (kernReturn != KERN_SUCCESS) {
return NSNotFound;
} return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;
} // 獲取當前任務所佔用的記憶體(單位:MB)
- (double)usedMemory
{
task_basic_info_data_t taskInfo;
mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;
kern_return_t kernReturn = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&taskInfo,
&infoCount); if (kernReturn != KERN_SUCCESS
) {
return NSNotFound;
} return taskInfo.resident_size / 1024.0 / 1024.0;
}
五、獲取手機型號,需要新增標頭檔案#import<sys/utsname.h>
+ (NSString *)getCurrentiPhoneType
{
struct utsname systemInfo;
uname(&systemInfo);
NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding]; if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4"; if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4"; if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5"; if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c"; if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c"; if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s"; if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s"; if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus"; if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6"; if ([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6s"; if ([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus"; if([platform isEqualToString:@"iPhone8,4"]) return@"iPhone SE"; if([platform isEqualToString:@"iPhone9,1"]) return@"iPhone 7"; if([platform isEqualToString:@"iPhone9,2"]) return@"iPhone 7 Plus"; if([platform isEqualToString:@"iPhone10,1"]) return@"iPhone 8"; if([platform isEqualToString:@"iPhone10,4"]) return@"iPhone 8"; if([platform isEqualToString:@"iPhone10,2"]) return@"iPhone 8 Plus"; if([platform isEqualToString:@"iPhone10,5"]) return@"iPhone 8 Plus"; if([platform isEqualToString:@"iPhone10,3"]) return@"iPhone X"; if([platform isEqualToString:@"iPhone10,6"]) return@"iPhone X"; if([platform isEqualToString:@"iPod1,1"]) return@"iPod Touch 1G"; if([platform isEqualToString:@"iPod2,1"]) return@"iPod Touch 2G"; if([platform isEqualToString:@"iPod3,1"]) return@"iPod Touch 3G"; if([platform isEqualToString:@"iPod4,1"]) return@"iPod Touch 4G"; if([platform isEqualToString:@"iPod5,1"]) return@"iPod Touch 5G"; if([platform isEqualToString:@"iPad1,1"]) return@"iPad 1G"; if([platform isEqualToString:@"iPad2,1"]) return@"iPad 2"; if([platform isEqualToString:@"iPad2,2"]) return@"iPad 2"; if([platform isEqualToString:@"iPad2,3"]) return@"iPad 2"; if([platform isEqualToString:@"iPad2,4"]) return@"iPad 2"; if([platform isEqualToString:@"iPad2,5"]) return@"iPad Mini 1G"; if([platform isEqualToString:@"iPad2,6"]) return@"iPad Mini 1G"; if([platform isEqualToString:@"iPad2,7"]) return@"iPad Mini 1G"; if([platform isEqualToString:@"iPad3,1"]) return@"iPad 3"; if([platform isEqualToString:@"iPad3,2"]) return@"iPad 3"; if([platform isEqualToString:@"iPad3,3"]) return@"iPad 3"; if([platform isEqualToString:@"iPad3,4"]) return@"iPad 4"; if([platform isEqualToString:@"iPad3,5"]) return@"iPad 4"; if([platform isEqualToString:@"iPad3,6"]) return@"iPad 4"; if([platform isEqualToString:@"iPad4,1"]) return@"iPad Air"; if([platform isEqualToString:@"iPad4,2"]) return@"iPad Air"; if([platform isEqualToString:@"iPad4,3"]) return@"iPad Air"; if([platform isEqualToString:@"iPad4,4"]) return@"iPad Mini 2G"; if([platform isEqualToString:@"iPad4,5"]) return@"iPad Mini 2G"; if([platform isEqualToString:@"iPad4,6"]) return@"iPad Mini 2G"; if([platform isEqualToString:@"iPad4,7"]) return@"iPad Mini 3"; if([platform isEqualToString:@"iPad4,8"]) return@"iPad Mini 3"; if([platform isEqualToString:@"iPad4,9"]) return@"iPad Mini 3"; if([platform isEqualToString:@"iPad5,1"]) return@"iPad Mini 4"; if([platform isEqualToString:@"iPad5,2"]) return@"iPad Mini 4"; if([platform isEqualToString:@"iPad5,3"]) return@"iPad Air 2"; if([platform isEqualToString:@"iPad5,4"]) return@"iPad Air 2"; if([platform isEqualToString:@"iPad6,3"]) return@"iPad Pro 9.7"; if([platform isEqualToString:@"iPad6,4"]) return@"iPad Pro 9.7"; if([platform isEqualToString:@"iPad6,7"]) return@"iPad Pro 12.9"; if([platform isEqualToString:@"iPad6,8"]) return@"iPad Pro 12.9"; if([platform isEqualToString:@"i386"]) return@"iPhone Simulator"; if([platform isEqualToString:@"x86_64"]) return@"iPhone Simulator"; return platform;
}
六、IP地址獲取,只適用於WiFi網路需要新增以下標頭檔案和巨集定義
#import <ifaddrs.h> //ip
#import <arpa/inet.h>
#import <net/if.h>
#import <__clang_cuda_runtime_wrapper.h> #define IOS_CELLULAR @"pdp_ip0"
#define IOS_WIFI @"en0"
#define IOS_VPN @"utun0"
#define IP_ADDR_IPv4 @"ipv4"
#define IP_ADDR_IPv6 @"ipv6"
方法一、
- (NSString *)deviceIPAdress {
NSString *address = @"an error occurred when obtaining ip address";
struct ifaddrs *interfaces = NULL;
struct ifaddrs *temp_addr = NULL;
int success = ; success = getifaddrs(&interfaces);
if (success == ) // 0 表示獲取成功
{
temp_addr = interfaces;
while (temp_addr != NULL) {
if( temp_addr->ifa_addr->sa_family == AF_INET) {
// Check if interface is en0 which is the wifi connection on the iPhone
if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
// Get NSString from C String
address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
}
} temp_addr = temp_addr->ifa_next;
}
}
freeifaddrs(interfaces);
return address;
}
方法二、獲取裝置當前網路IP地址 (WiFi 手機流量通用)
//獲取IPV4地址
+ (NSString *)getDevicesIPV4Address
{
return [self getDevicesIPAddress:YES];
} //獲取IPV6地址
+ (NSString *)getDevicesIPV6Address
{
return [self getDevicesIPAddress:NO];
}
+ (NSString *)getDevicesIPAddress:(BOOL)preferIPv4
{
NSArray *searchArray = preferIPv4 ? @[IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] : @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;
NSDictionary *addresses = [self getIPAddresses];
__block NSString *address;
[searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)
{
address = addresses[key];
//篩選出IP地址格式
if([self isValidatIP:address isIpV4:preferIPv4]) *stop = YES;
} ];
return address ? address : @"0.0.0.0";
} + (BOOL)isValidatIP:(NSString *)ipAddress isIpV4:(BOOL)ipv4 {
if (ipAddress.length == ) {
return NO;
}
NSString *urlRegEx;
if (ipv4)
{
urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
}
else
{
urlRegEx = @"^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$";
} NSError *error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options: error:&error]; if (regex != nil) {
NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options: range:NSMakeRange(, [ipAddress length])];
if (firstMatch) {
// NSRange resultRange = [firstMatch rangeAtIndex:0];
// NSString *result=[ipAddress substringWithRange:resultRange];
return YES;
}
}
return NO;
} + (NSDictionary *)getIPAddresses
{
NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:]; // retrieve the current interfaces - returns 0 on success
struct ifaddrs *interfaces;
if(!getifaddrs(&interfaces)) {
// Loop through linked list of interfaces
struct ifaddrs *interface;
for(interface=interfaces; interface; interface=interface->ifa_next) {
if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
continue; // deeply nested code harder to read
}
const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
NSString *type;
if(addr->sin_family == AF_INET) {
if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
type = IP_ADDR_IPv4;
}
} else {
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
type = IP_ADDR_IPv6;
}
}
if(type) {
NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
addresses[key] = [NSString stringWithUTF8String:addrBuf];
}
}
}
// Free memory
freeifaddrs(interfaces);
}
return [addresses count] ? addresses : nil;
}
還需要用到另一個輔助類IPAddressConfig
IPAddressConfig.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/sockio.h>
#include <net/if.h>
#include <errno.h>
#include <net/if_dl.h>
#include <net/ethernet.h>
#include <ifaddrs.h>
#include <arpa/inet.h> #define BUFFERSIZE 4000
#define MAXADDRS 32
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b)) @interface IPAddressConfig : NSObject // extern
extern char *if_names[MAXADDRS];
extern char *ip_names[MAXADDRS];
extern char *hw_addrs[MAXADDRS];
extern unsigned long ip_addrs[MAXADDRS]; // Function prototypes
void InitAddresses(void);
void FreeAddresses(void);
void GetIPAddresses(void);
void GetHWAddresses(void); @end
IPAddressConfig.m
@implementation IPAddressConfig char *if_names[MAXADDRS];
char *ip_names[MAXADDRS];
char *hw_addrs[MAXADDRS];
unsigned long ip_addrs[MAXADDRS]; static int nextAddr = ; void InitAddresses()
{
int i;
for (i=; i<MAXADDRS; ++i)
{
if_names[i] = ip_names[i] = hw_addrs[i] = NULL;
ip_addrs[i] = ;
}
} void FreeAddresses()
{
int i;
for (i=; i<MAXADDRS; ++i)
{
if (if_names[i] != ) free(if_names[i]);
if (ip_names[i] != ) free(ip_names[i]);
if (hw_addrs[i] != ) free(hw_addrs[i]);
ip_addrs[i] = ;
}
InitAddresses();
} void GetIPAddresses()
{
int i, len, flags;
char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
struct ifconf ifc;
struct ifreq *ifr, ifrcopy;
struct sockaddr_in *sin; char temp[]; int sockfd; for (i=; i<MAXADDRS; ++i)
{
if_names[i] = ip_names[i] = NULL;
ip_addrs[i] = ;
} sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < )
{
perror("socket failed");
return;
} ifc.ifc_len = BUFFERSIZE;
ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, &ifc) < )
{
perror("ioctl error");
return;
} lastname[] = ; for (ptr = buffer; ptr < buffer + ifc.ifc_len; )
{
ifr = (struct ifreq *)ptr;
len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);
ptr += sizeof(ifr->ifr_name) + len; // for next one in buffer if (ifr->ifr_addr.sa_family != AF_INET)
{
continue; // ignore if not desired address family
} if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL)
{
*cptr = ; // replace colon will null
} if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == )
{
continue; /* already processed this interface */
} memcpy(lastname, ifr->ifr_name, IFNAMSIZ); ifrcopy = *ifr;
ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
flags = ifrcopy.ifr_flags;
if ((flags & IFF_UP) == )
{
continue; // ignore if interface not up
} if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+);
if (if_names[nextAddr] == NULL)
{
return;
}
strcpy(if_names[nextAddr], ifr->ifr_name); sin = (struct sockaddr_in *)&ifr->ifr_addr;
strcpy(temp, inet_ntoa(sin->sin_addr)); ip_names[nextAddr] = (char *)malloc(strlen(temp)+);
if (ip_names[nextAddr] == NULL)
{
return;
}
strcpy(ip_names[nextAddr], temp); ip_addrs[nextAddr] = sin->sin_addr.s_addr; ++nextAddr;
} close(sockfd);
} void GetHWAddresses()
{
struct ifconf ifc;
struct ifreq *ifr;
int i, sockfd;
char buffer[BUFFERSIZE], *cp, *cplim;
char temp[]; for (i=; i<MAXADDRS; ++i)
{
hw_addrs[i] = NULL;
} sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < )
{
perror("socket failed");
return;
} ifc.ifc_len = BUFFERSIZE;
ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < )
{
perror("ioctl error");
close(sockfd);
return;
} ifr = ifc.ifc_req; cplim = buffer + ifc.ifc_len; for (cp=buffer; cp < cplim; )
{
ifr = (struct ifreq *)cp;
if (ifr->ifr_addr.sa_family == AF_LINK)
{
struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;
int a,b,c,d,e,f;
int i; strcpy(temp, (char *)ether_ntoa((const struct ether_addr *)LLADDR(sdl)));
sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f); for (i=; i<MAXADDRS; ++i)
{
if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name, if_names[i]) == ))
{
if (hw_addrs[i] == NULL)
{
hw_addrs[i] = (char *)malloc(strlen(temp)+);
strcpy(hw_addrs[i], temp);
break;
}
}
}
}
cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);
}
close(sockfd);
} @end
七、獲取手機當前連線的WiFi名稱
- (NSString *)getWifiName
{
NSString *wifiName = nil; CFArrayRef wifiInterfaces = CNCopySupportedInterfaces();
if (!wifiInterfaces) {
return nil;
} NSArray *interfaces = (__bridge NSArray *)wifiInterfaces; for (NSString *interfaceName in interfaces) {
CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName)); if (dictRef) {
NSDictionary *networkInfo = (__bridge NSDictionary *)dictRef; wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID]; CFRelease(dictRef);
}
} CFRelease(wifiInterfaces);
return wifiName;
}