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

此篇文章讲述iOS中的状态栏

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 - WIFItypedef 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

四、获取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还可以获取到其他的有用信息,这里就不一一列举了,只列举了常用的。

最后欢迎大家关注文明的iOS开发公众号:
方式1、搜索:“iOS开发by文明”
方式2、扫描下方二维码


另外博主维护一个iOS开发技术支持群:479259423,进群必须改名,群名片格式:城市-iOS-名字,例如广州-iOS-文明。手机可以加,电脑加不了。

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

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

    iOS开发中对状态栏的操作比较少,因为状态栏是系统级别的View,是受苹果保护的,不可以随便更改,不可以随便遮挡住.如果违反这些苹果的规范,那么APP将有可能上不了架.笔者就曾写过一个APP,因状态栏 ...

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

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

  3. Android 获取wifi信号强度

    先来了解下Android如何获取wifi的信息: WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); Wif ...

  4. Android获取Wifi信号强度方法总结

    直接封装了一个工具类,获取WIFI信号强度直接调用该工具类的getCurrentNetworkRssi方法即可. public class WifiUtils {// 获取当前热点最新的信号强度pub ...

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

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

  6. Android获取本机电话号码及运营商信息

    电话管理器TelephonyManager可访问电话服务信息,包括电话号码.运营商信息.wifi状态等.一些电话信息需要相应的权限,具体可以看API文件中TelephonyManager方法的说明. ...

  7. 网络劫持运营商劫持解决办法

    怎么检测自己的网站是不是有劫持的情况? iis7网站监控 网站打开速度查询.DNS污染.地区电信劫持等问题检测. 网络劫持最主要的就是运营商层面的劫持.可以说,我们每个人随时随地都在与它打交道. 而运 ...

  8. android 获取wifi信号强度,获取wifi当前手机连接的wifi信息以及信号强度

    1.获得WifiManager对象WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIF ...

  9. android获取wifi信号强度,Native.js 获取当前wifi信号强度

    使用Native.js获取当前WiFi的信号强度: //获取当前WiFi信号强度 function checkWifiSignal() { var Signal = null; var Context ...

最新文章

  1. spring mvc 控制器方法传递一些经验对象的数组
  2. 面试题mysql环境搭建_Linux运维必会的100道MySql面试题之(四)
  3. We can all choose freedom over a job
  4. msys2 config.guess: unable to guess system type
  5. cordova打开文件_Cordova开发App入门(四)打开及下载第三方App
  6. 一个老外如何丑化中国程序员
  7. Java怎么样?学完后前途怎么样?
  8. python内置json模块的作用_python详解json模块
  9. css3-自定义字体
  10. python learning2.py
  11. pkcs1与pkcs8格式RSA私钥互相转换
  12. multisim页面不够大_multisim小常识
  13. Trafodion建表之使用多温度特性
  14. 《理财市场情绪监测系统》代码实现【1】之行业词库
  15. 收集的省市区下拉数据源
  16. easyboot的一个严重不足
  17. Tomcat启动,提示 The JRE_HOME environment variable is not defined correctly 问题。
  18. 谷歌为iPhone推新版本语音电话软件 北京网游分级制度今年启动(每日关注2010.1.27)
  19. ppt编辑器android,ppt编辑器
  20. node项目部署https服务

热门文章

  1. c语言作业冰雹猜想,C语言编程实现冰雹猜想的算法,并测算各个自然数到达4-2-1谷底(即N等于4,2,1结束后)所经过的变换次数。...
  2. 华南虎事件中,钉在耻辱柱上的知识分子
  3. laravel修改数据库配置文件
  4. frostmourne
  5. ABB机器人——实时监测各个轴的扭矩
  6. LCD屏与FSMC外设
  7. Web Components
  8. 13篇基于Anchor free的目标检测方法
  9. 21,spark sql 测试 : 1.4G 文件实战,测试耗时多少,先分区,再在分区内计算,用列内容分区( 这是一个很魔幻的问题 ),自定义分区
  10. WSL 0x80070003错误处理