iOS状态栏操作之获取WiFi信号强度,WiFi名字和IP,网络类型,运营商,电池电量,系统时间等...
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,网络类型,运营商,电池电量,系统时间等...相关推荐
- iOS状态栏操作之获取WiFi信号强度,网络类型,运营商,电池电量,系统时间等
iOS状态栏操作之获取WiFi信号强度,WiFi名字和IP,网络类型,运营商,电池电量,系统时间等 此篇文章讲述iOS中的状态栏 iOS开发中对状态栏的操作比较少,因为状态栏是系统级别的View,是受 ...
- IOS——获取当前运营商(获取漫游接入网络的运营商)
这个问题坑了很久了,终于搞定了 -.-||| 如果使用CoreTelephony.framework 框架,获取的仅仅是Sim卡的运营商(而且还不成功!carrier.name属性为Carrier,坑 ...
- iOS如何判断当前网络的运营商
2019独角兽企业重金招聘Python工程师标准>>> 在IOS上存在retain屏,经常需要在一些时刻用到高清图,有些时候也要到普通图. 在网络条件很爽的情况下,这当然不在话下.如 ...
- iOS 手机网络类型和运营商怎么获取
Reachability 只能判断是WiFi还是蜂窝网络,无法获取到具体的类型是3G还是4G,现在获取手机网络类型可以直接使用苹果原生API了: 首先我们导入库 CoreTelephony.fram ...
- wifi信息修改插件ios_iOS免越狱修改运营商信息/修改“应用图标标记”颜色
iOS免越狱修改运营商信息捷径/workflow规则 地址: https://www.icloud.com/shortcuts/cc295815769b44f7a711dab6910e1be8 iOS ...
- golang 获取公网ip 内网ip 检测ip类型 校验ip区间 ip地址string和int转换 判断ip地区国家运营商
目录 简要简介net包 什么是外网IP和内网IP? 获取公网ip 获取本地ip 判断是否是公网ip ip地址string转int ip地址int转string 判断ip地址区间 通过淘宝接口根据公网i ...
- iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)
iOS应用(包括移动应用)的网络分析,一般采用将移动设备上的流量导入到PC机上,利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法. 总的来说,有以下三种方法: 一.在PC上设置网 ...
- ios如何看idfv_ios获取手机状态 idfa idfv 网络类型 分辨率 获取运营商
标签:ios //idfa [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; //idfv [[[UI ...
- 商业WiFi真正的阻力是电信运营商吗?
有的人在抱怨电信运营商制造过高的门槛,阻挡WiFi的商业化,有的人又在积极拥抱电信运营商,联手做本地化市场.没有宽带就没有WiFi的市场现状,让电信运营商成为WiFi快速发展最大的阻力.你怎么看这样的 ...
最新文章
- MySQL数据库开发规范-EC
- 【新周报(051)】Datawhale组队学习
- producer send源码_Kafka源码深度剖析系列(七)——Producer核心流程初探
- Android BLE新手进入
- Android重力感应示例
- Windows10下python3.5的sklearn库安装
- mybatis if where标签怎么使用?
- MindManager的例图资源
- 从零开始实现Adam优化算法
- Douphp cms通杀漏洞(小宇特详解)
- LaTeX及TeXstudio下载地址
- 【渝粤题库】广东开放大学物业管理基本制度与政策 形成性考核
- 计算机教师的人生格言,教师人生格言大全
- java工程师视频教程,mysql数据库引擎面试
- Error response from daemon: conflict: unable to delete a9ac6b268134 (must be forced) - image is bein
- 不一定是黑客,也可以是守护神《运用Python成为顶级黑客》
- NYOJ_1273_宣传墙
- 华为用户的福利!1分钱就可以坐公交车,操作方法教程
- gsoap使用方法及心得
- Java毕设项目-OA办公系统
热门文章
- Linux 路由表详解及 route 命令详解
- SpringMVC producesheadersconsumes
- SSH远程连接linux虚拟机详细步骤(超详细)
- 计算机专业预见未来,预见未来 | 计算机图形学:虚拟和现实世界的融合
- C 盘空间越来越小,怎么扩大下c盘空间呢?
- STM32---程序如何在内部运行寄存器编程的理解
- 简单理解viterbi算法
- 学会linux需要哪些技术,运维安全需要掌握哪些技术呢?linux基础知识学习
- 计算机网络在结构上可分为什么不同,计算机等级考试三级网络精选习题及详细解答(一)...
- 集成显卡常见故障大全