iOS状态栏操作之获取WiFi信号强度,网络类型,运营商,电池电量,系统时间等
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信号强度,网络类型,运营商,电池电量,系统时间等相关推荐
- iOS状态栏操作之获取WiFi信号强度,WiFi名字和IP,网络类型,运营商,电池电量,系统时间等...
iOS开发中对状态栏的操作比较少,因为状态栏是系统级别的View,是受苹果保护的,不可以随便更改,不可以随便遮挡住.如果违反这些苹果的规范,那么APP将有可能上不了架.笔者就曾写过一个APP,因状态栏 ...
- IOS——获取当前运营商(获取漫游接入网络的运营商)
这个问题坑了很久了,终于搞定了 -.-||| 如果使用CoreTelephony.framework 框架,获取的仅仅是Sim卡的运营商(而且还不成功!carrier.name属性为Carrier,坑 ...
- Android 获取wifi信号强度
先来了解下Android如何获取wifi的信息: WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); Wif ...
- Android获取Wifi信号强度方法总结
直接封装了一个工具类,获取WIFI信号强度直接调用该工具类的getCurrentNetworkRssi方法即可. public class WifiUtils {// 获取当前热点最新的信号强度pub ...
- iOS如何判断当前网络的运营商
2019独角兽企业重金招聘Python工程师标准>>> 在IOS上存在retain屏,经常需要在一些时刻用到高清图,有些时候也要到普通图. 在网络条件很爽的情况下,这当然不在话下.如 ...
- Android获取本机电话号码及运营商信息
电话管理器TelephonyManager可访问电话服务信息,包括电话号码.运营商信息.wifi状态等.一些电话信息需要相应的权限,具体可以看API文件中TelephonyManager方法的说明. ...
- 网络劫持运营商劫持解决办法
怎么检测自己的网站是不是有劫持的情况? iis7网站监控 网站打开速度查询.DNS污染.地区电信劫持等问题检测. 网络劫持最主要的就是运营商层面的劫持.可以说,我们每个人随时随地都在与它打交道. 而运 ...
- android 获取wifi信号强度,获取wifi当前手机连接的wifi信息以及信号强度
1.获得WifiManager对象WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIF ...
- android获取wifi信号强度,Native.js 获取当前wifi信号强度
使用Native.js获取当前WiFi的信号强度: //获取当前WiFi信号强度 function checkWifiSignal() { var Signal = null; var Context ...
最新文章
- spring mvc 控制器方法传递一些经验对象的数组
- 面试题mysql环境搭建_Linux运维必会的100道MySql面试题之(四)
- We can all choose freedom over a job
- msys2 config.guess: unable to guess system type
- cordova打开文件_Cordova开发App入门(四)打开及下载第三方App
- 一个老外如何丑化中国程序员
- Java怎么样?学完后前途怎么样?
- python内置json模块的作用_python详解json模块
- css3-自定义字体
- python learning2.py
- pkcs1与pkcs8格式RSA私钥互相转换
- multisim页面不够大_multisim小常识
- Trafodion建表之使用多温度特性
- 《理财市场情绪监测系统》代码实现【1】之行业词库
- 收集的省市区下拉数据源
- easyboot的一个严重不足
- Tomcat启动,提示 The JRE_HOME environment variable is not defined correctly 问题。
- 谷歌为iPhone推新版本语音电话软件 北京网游分级制度今年启动(每日关注2010.1.27)
- ppt编辑器android,ppt编辑器
- node项目部署https服务
热门文章
- c语言作业冰雹猜想,C语言编程实现冰雹猜想的算法,并测算各个自然数到达4-2-1谷底(即N等于4,2,1结束后)所经过的变换次数。...
- 华南虎事件中,钉在耻辱柱上的知识分子
- laravel修改数据库配置文件
- frostmourne
- ABB机器人——实时监测各个轴的扭矩
- LCD屏与FSMC外设
- Web Components
- 13篇基于Anchor free的目标检测方法
- 21,spark sql 测试 : 1.4G 文件实战,测试耗时多少,先分区,再在分区内计算,用列内容分区( 这是一个很魔幻的问题 ),自定义分区
- WSL 0x80070003错误处理