iOS开发中对状态栏的操作比较少,因为状态栏是系统级别的View,是受苹果保护的,不可以随便更改,不可以随便遮挡住。如果违反这些苹果的规范,那么APP将有可能上不了架。笔者就曾写过一个APP,因状态栏被提示框遮挡而杯具(被拒)了。 一、操作状态栏的样式 iOS开发中最常见的对状态栏的操作就是设置状态栏的样式,比如:

//此样式的状态栏中的字为白色,所以用在导航栏为深色的情况下,例如黑色或者红色的导航栏
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//此样式的状态栏中的字为黑色色,所以用在导航栏为浅色色的情况下,比如白色的导航栏
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleDefault];复制代码

如果你设置了,发现状态栏没反应,那么你要去info.plist中加一个key,这个key为View controller-based status bar appearance,对应的value为NO。这样每个vc中就可以随便设置状态栏的样式了。

二、操作状态栏的大小、背景颜色、位置 那么实际上我们可以拿到状态栏这个UIView对象。为了不让苹果看到我们用了某某私有API,我们这样做:

- (UIView*)statusBarView;{ UIView *statusBar = nil; NSData *data = [NSData dataWithBytes:(unsigned char []){0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9];NSString *key = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; id object = [UIApplication sharedApplication]; if ([object respondsToSelector:NSSelectorFromString(key)]) statusBar = [object valueForKey:key]; return statusBar;
}
复制代码

调用这个方法就可以拿到系统的状态栏对象,是个UIView类型的对象,那么UIView我们最熟悉了,我们可以改变状态栏的颜色,背景颜色(backgroundColor)、大小位置(frame)等等。

三、操作状态栏,得到网络类型、运营商、电池电量等 定义一个工具类StatusBarTool,用来获取网络类型,运营商,电池电量,显示的系统时间等信息。那么直接看代码: .h文件

#import < Foundation/Foundation.h >#import < UIKit/UIKit.h >
//0 - 无网络 ; 1 - 2G ; 2 - 3G ; 3 - 4G ; 5 - WIFI
typedef NS_ENUM(NSUInteger, NetWorkType) {  NetWorkTypeNone=0, NetWorkType2G=1, NetWorkType3G=2, NetWorkType4G=3, NetWorkTypeWiFI=5,
};
@interface StatusBarTool : NSObject
/** * * *  @return 当前网络类型 */
+(NetWorkType )currentNetworkType;
/** * * *  @return SIM卡所属的运营商(公司) */
+(NSString *)serviceCompany;
/** * * *  @return 当前电池电量百分比 */
+(NSString *)currentBatteryPercent;
/** * * *  @return 当前时间显示的字符串 */
+(NSString *)currentTimeString;@end
复制代码

.m实现文件(很重要)

#import "StatusBarTool.h"@ implementation StatusBarTool+(NSString *)currentBatteryPercent{NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@”statusBar”] valueForKeyPath:@”foregroundView”] subviews];for (id info in infoArray){if ([info isKindOfClass:NSClassFromString(@"UIStatusBarBatteryPercentItemView")]){NSString *percentString = [info valueForKeyPath:@"percentString"];NSLog(@"电量为:%@",percentString);return percentString;}}return @"";
}
+(NetWorkType )currentNetworkType{NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];NetWorkType type;for (id info in infoArray){if ([info isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {type = [[info valueForKeyPath:@"dataNetworkType"] integerValue];NSLog(@"----%lu", (unsigned long)type);return (NetWorkType)type;}}return NetWorkTypeNone;
}
+(NSString *)currentTimeString{NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@”statusBar”] valueForKeyPath:@”foregroundView”] subviews];for (id info in infoArray){if ([info isKindOfClass:NSClassFromString(@"UIStatusBarTimeItemView")]){NSString *timeString = [info valueForKeyPath:@"timeString"];NSLog(@"当前显示时间为:%@",timeString);return timeString;}}return @"";
}+(NSString *)serviceCompany{NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@”statusBar”] valueForKeyPath:@”foregroundView”] subviews];for (id info in infoArray){if ([info isKindOfClass:NSClassFromString(@"UIStatusBarServiceItemView")]){NSString *serviceString = [info valueForKeyPath:@"serviceString"];NSLog(@"公司为:%@",serviceString);return serviceString;}}return @"";
}
@end//用StatusBarTool这个类的时候NSString *company = [StatusBarTool serviceCompany];
NSLog(@”company = %@”,company);
company = 中国移动
NetWorkType type = [StatusBarTool currentNetworkType];
NSLog(@”type = %ld”,type);
type = 5(5代表Wi-Fi)
/*typedef NS_ENUM(NSUInteger, NetWorkType) {NetWorkTypeNone=0,NetWorkType2G=1,NetWorkType3G=2,NetWorkType4G=3,NetWorkTypeWiFI=5,
};*/
NSString *batteryPercent = [StatusBarTool currentBatteryPercent];
NSLog(@”batteryPercent = %@”,batteryPercent);
batteryPercent  = 96%NSString *timeString = [StatusBarTool currentTimeString];
NSLog(@”timeString = %@”,timeString);
timeString = 12:57#import "StatusBarTool.h"@ implementation StatusBarTool+(NSString *)currentBatteryPercent{NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@”statusBar”] valueForKeyPath:@”foregroundView”] subviews];for (id info in infoArray){if ([info isKindOfClass:NSClassFromString(@"UIStatusBarBatteryPercentItemView")]){NSString *percentString = [info valueForKeyPath:@"percentString"];NSLog(@"电量为:%@",percentString);return percentString;}}return @"";
}
+(NetWorkType )currentNetworkType{NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];NetWorkType type;for (id info in infoArray){if ([info isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {type = [[info valueForKeyPath:@"dataNetworkType"] integerValue];NSLog(@"----%lu", (unsigned long)type);return (NetWorkType)type;}}return NetWorkTypeNone;
}
+(NSString *)currentTimeString{NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@”statusBar”] valueForKeyPath:@”foregroundView”] subviews];for (id info in infoArray){if ([info isKindOfClass:NSClassFromString(@"UIStatusBarTimeItemView")]){NSString *timeString = [info valueForKeyPath:@"timeString"];NSLog(@"当前显示时间为:%@",timeString);return timeString;}}return @"";
}+(NSString *)serviceCompany{NSArray *infoArray = [[[[UIApplication sharedApplication] valueForKeyPath:@”statusBar”] valueForKeyPath:@”foregroundView”] subviews];for (id info in infoArray){if ([info isKindOfClass:NSClassFromString(@"UIStatusBarServiceItemView")]){NSString *serviceString = [info valueForKeyPath:@"serviceString"];NSLog(@"公司为:%@",serviceString);return serviceString;}}return @"";
}
@end//用StatusBarTool这个类的时候NSString *company = [StatusBarTool serviceCompany];
NSLog(@”company = %@”,company);
company = 中国移动
NetWorkType type = [StatusBarTool currentNetworkType];
NSLog(@”type = %ld”,type);
type = 5(5代表Wi-Fi)
/*typedef NS_ENUM(NSUInteger, NetWorkType) {NetWorkTypeNone=0,NetWorkType2G=1,NetWorkType3G=2,NetWorkType4G=3,NetWorkTypeWiFI=5,
};*/
NSString *batteryPercent = [StatusBarTool currentBatteryPercent];
NSLog(@”batteryPercent = %@”,batteryPercent);
batteryPercent  = 96%NSString *timeString = [StatusBarTool currentTimeString];
NSLog(@”timeString = %@”,timeString);
timeString = 12:57
复制代码

四、获取WiFi信号强度

虽然各种直接获取信号强度的api都被封杀了。但是还有一个另类的黑魔法可以获取到。那就是遍历UIStatusBar了(注意:Wi-Fi列表和列表中的Wi-Fi信号强度是获取不到的,只能得到自己当前iPhone链接的Wi-Fi的名字和对应的Wi-Fi信号强度。) 另外:不要留言说,1、博主,我想问一下,人家万能钥匙怎么实现的呢? 2、不对,博主,AppStore上面很多app都可以获取到WiFi列表。请问怎么实现的? 看下面的代码

- (int )getSignalStrength{UIApplication *app = [UIApplication sharedApplication];NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];UIView *dataNetworkItemView = nil;for (UIView * subview in subviews) {if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {dataNetworkItemView = subview;break;}}int signalStrength = [[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue];NSLog(@"signal %d", signalStrength);return signalStrength;
}
复制代码

五、获取WiFi的名称,IP地址 WiFi的名称就是WiFi的SSID,也就是我们看到列表中的WiFi的名字。 首先我们要导入三个相关的头文件,代码如下:

#import <SystemConfiguration/CaptiveNetwork.h>
#import <ifaddrs.h>
#import <arpa/inet.h>- (NSString *)getIPAddress{NSString *address = @"error";struct ifaddrs *interfaces = NULL;struct ifaddrs *temp_addr = NULL;int success = 0;// retrieve the current interfaces - returns 0 on successsuccess = getifaddrs(&interfaces);if (success == 0) {// Loop through linked list of interfacestemp_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 iPhoneif ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {// Get NSString from C Stringaddress = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];}}temp_addr = temp_addr->ifa_next;}}// Free memoryfreeifaddrs(interfaces);return address;
}
-(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;NSLog(@"network info -> %@", networkInfo);wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID];CFRelease(dictRef);}}CFRelease(wifiInterfaces);return wifiName;
}
复制代码

好了,至此我们已经拿到了网络状态,WiFi信号强度,WiFi名字和IP地址,运营商,电池电量百分比,时间显示等信息了。其实遍历UIStatusBar还可以获取到其他的有用信息,这里就不一一列举了,只列举了常用的。

原文转自:http://blog.csdn.net/wenmingzheng/article/details/50475671

iOS状态栏操作之获取WiFi信号强度,WiFi名字和IP,网络类型,运营商,电池电量,系统时间等...相关推荐

  1. iOS状态栏操作之获取WiFi信号强度,网络类型,运营商,电池电量,系统时间等

    iOS状态栏操作之获取WiFi信号强度,WiFi名字和IP,网络类型,运营商,电池电量,系统时间等 此篇文章讲述iOS中的状态栏 iOS开发中对状态栏的操作比较少,因为状态栏是系统级别的View,是受 ...

  2. IOS——获取当前运营商(获取漫游接入网络的运营商)

    这个问题坑了很久了,终于搞定了 -.-||| 如果使用CoreTelephony.framework 框架,获取的仅仅是Sim卡的运营商(而且还不成功!carrier.name属性为Carrier,坑 ...

  3. iOS如何判断当前网络的运营商

    2019独角兽企业重金招聘Python工程师标准>>> 在IOS上存在retain屏,经常需要在一些时刻用到高清图,有些时候也要到普通图. 在网络条件很爽的情况下,这当然不在话下.如 ...

  4. iOS 手机网络类型和运营商怎么获取

    Reachability 只能判断是WiFi还是蜂窝网络,无法获取到具体的类型是3G还是4G,现在获取手机网络类型可以直接使用苹果原生API了: 首先我们导入库  CoreTelephony.fram ...

  5. wifi信息修改插件ios_iOS免越狱修改运营商信息/修改“应用图标标记”颜色

    iOS免越狱修改运营商信息捷径/workflow规则 地址: https://www.icloud.com/shortcuts/cc295815769b44f7a711dab6910e1be8 iOS ...

  6. golang 获取公网ip 内网ip 检测ip类型 校验ip区间 ip地址string和int转换 判断ip地区国家运营商

    目录 简要简介net包 什么是外网IP和内网IP? 获取公网ip 获取本地ip 判断是否是公网ip ip地址string转int ip地址int转string 判断ip地址区间 通过淘宝接口根据公网i ...

  7. iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

    iOS应用(包括移动应用)的网络分析,一般采用将移动设备上的流量导入到PC机上,利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法. 总的来说,有以下三种方法: 一.在PC上设置网 ...

  8. ios如何看idfv_ios获取手机状态 idfa   idfv   网络类型   分辨率   获取运营商

    标签:ios //idfa [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; //idfv [[[UI ...

  9. 商业WiFi真正的阻力是电信运营商吗?

    有的人在抱怨电信运营商制造过高的门槛,阻挡WiFi的商业化,有的人又在积极拥抱电信运营商,联手做本地化市场.没有宽带就没有WiFi的市场现状,让电信运营商成为WiFi快速发展最大的阻力.你怎么看这样的 ...

最新文章

  1. MySQL数据库开发规范-EC
  2. 【新周报(051)】Datawhale组队学习
  3. producer send源码_Kafka源码深度剖析系列(七)——Producer核心流程初探
  4. Android BLE新手进入
  5. Android重力感应示例
  6. Windows10下python3.5的sklearn库安装
  7. mybatis if where标签怎么使用?
  8. MindManager的例图资源
  9. 从零开始实现Adam优化算法
  10. Douphp cms通杀漏洞(小宇特详解)
  11. LaTeX及TeXstudio下载地址
  12. 【渝粤题库】广东开放大学物业管理基本制度与政策 形成性考核
  13. 计算机教师的人生格言,教师人生格言大全
  14. java工程师视频教程,mysql数据库引擎面试
  15. Error response from daemon: conflict: unable to delete a9ac6b268134 (must be forced) - image is bein
  16. 不一定是黑客,也可以是守护神《运用Python成为顶级黑客》
  17. NYOJ_1273_宣传墙
  18. 华为用户的福利!1分钱就可以坐公交车,操作方法教程
  19. gsoap使用方法及心得
  20. Java毕设项目-OA办公系统

热门文章

  1. Linux 路由表详解及 route 命令详解
  2. SpringMVC producesheadersconsumes
  3. SSH远程连接linux虚拟机详细步骤(超详细)
  4. 计算机专业预见未来,预见未来 | 计算机图形学:虚拟和现实世界的融合
  5. C 盘空间越来越小,怎么扩大下c盘空间呢?
  6. STM32---程序如何在内部运行寄存器编程的理解
  7. 简单理解viterbi算法
  8. 学会linux需要哪些技术,运维安全需要掌握哪些技术呢?linux基础知识学习
  9. 计算机网络在结构上可分为什么不同,计算机等级考试三级网络精选习题及详细解答(一)...
  10. 集成显卡常见故障大全