UIDevice是一个IOS获取设备信息的类,可以通过该类获得ios设备的各项信息。
一、UIDevice的使用
1、直接使用的方法
使用的时候需要导入
#import <UIKit/UIKit.h>
使用
[UIDevice currentDevice]
即可获得单例,比如这样
NSLog(@"%@",[UIDevice currentDevice].name);
以下就是可以使用该单例获取的各类信息
//获取当前设备单例 + (UIDevice *)currentDevice; //获取当前设备名称 @property(nonatomic,readonly,strong) NSString *name; // e.g. "My iPhone" //获取当前设备模式 @property(nonatomic,readonly,strong) NSString *model; // e.g. @"iPhone", @"iPod touch" //获取本地化的当前设备模式 @property(nonatomic,readonly,strong) NSString *localizedModel; // localized version of model //获取系统名称 @property(nonatomic,readonly,strong) NSString *systemName; // e.g. @"iOS" //获取系统版本 @property(nonatomic,readonly,strong) NSString *systemVersion; // e.g. @"4.0" //获取设备方向 @property(nonatomic,readonly) UIDeviceOrientation orientation; //获取设备UUID对象 @property(nullable, nonatomic,readonly,strong) NSUUID *identifierForVendor; //是否开启监测电池状态 开启后 才可以正常获取电池状态 @property(nonatomic,getter=isBatteryMonitoringEnabled) BOOL batteryMonitoringEnabled NS_AVAILABLE_IOS(3_0); // default is NO //获取电池状态 @property(nonatomic,readonly) UIDeviceBatteryState batteryState NS_AVAILABLE_IOS(3_0); //获取电量 @property(nonatomic,readonly) float batteryLevel NS_AVAILABLE_IOS(3_0);
获取的设备方向的类型
typedef NS_ENUM(NSInteger, UIDeviceOrientation) { UIDeviceOrientationUnknown, UIDeviceOrientationPortrait, // home键在下 UIDeviceOrientationPortraitUpsideDown, // home键在上 UIDeviceOrientationLandscapeLeft, // home键在右 UIDeviceOrientationLandscapeRight, // home键在左 UIDeviceOrientationFaceUp, // 屏幕朝上 UIDeviceOrientationFaceDown // 屏幕朝下 };
电池状态的类型枚举
typedef NS_ENUM(NSInteger, UIDeviceBatteryState) { UIDeviceBatteryStateUnknown, UIDeviceBatteryStateUnplugged, // 放电状态 UIDeviceBatteryStateCharging, // 充电未充满状态 UIDeviceBatteryStateFull, // 充电已充满 };
获取电池状态的时候,需要先把监视电池的功能打开,然后再开始检查状态,比如这样
[UIDevice currentDevice].batteryMonitoringEnabled = YES; NSLog(@"%f",[UIDevice currentDevice].batteryLevel);
2、需要函数调用的枚举
这个类型中还有这几个状态的枚举
//设备方向改变时发送的通知 UIKIT_EXTERN NSString *const UIDeviceOrientationDidChangeNotification; //电池状态改变时发送的通知 UIKIT_EXTERN NSString *const UIDeviceBatteryStateDidChangeNotification NS_AVAILABLE_IOS(3_0); //电量改变时发送的通知 UIKIT_EXTERN NSString *const UIDeviceBatteryLevelDidChangeNotification NS_AVAILABLE_IOS(3_0); //距离传感器状态改变时发送的通知 UIKIT_EXTERN NSString *const UIDeviceProximityStateDidChangeNotification NS_AVAILABLE_IOS(3_0);
这几个状态添加通知使用,比如设备方向变得时候,这样调用
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(change) name:UIDeviceOrientationDidChangeNotification object:nil]; -(void)change{ NSLog(@"change"); }
这样当设备方向变的时候会发通知。这样的话只要设备的方向改变就会发送这个通知。
当然还有这两个函数可以控制检查设备的方向的时机,如果不用时时刻刻监视屏幕旋转方向,可以合理使用这两个函数,省电省内存
- (void)beginGeneratingDeviceOrientationNotifications __TVOS_PROHIBITED; // nestable - (void)endGeneratingDeviceOrientationNotifications __TVOS_PROHIBITED;
当需要监视的时候,调用打开,不需要监视的时候关闭,比如这样用
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(change) name:UIDeviceOrientationDidChangeNotification object:nil]; -(void)change{ NSLog(@"change"); [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; }
这样当关闭监视的时候,就不会再调用change函数了,这个测试了下,会打印两次change,应该是横竖屏各切换一次之后不调用。
可以用这个函数来判断监视是否打开了,返回的是bool值
[UIDevice currentDevice].generatesDeviceOrientationNotifications
3、手机距离传感器的使用
手机距离传感器的作用就像比如接电话的时候靠近耳朵的话,手机熄灭屏幕等。
可以这么使用,首先需要打开手机距离传感器
[UIDevice currentDevice].proximityMonitoringEnabled=YES;
然后添加当距离开始变化的时候的通知和函数调用即可
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notice) name:UIDeviceProximityStateDidChangeNotification object:nil]; -(void)notice{ if ([UIDevice currentDevice].proximityState) { NSLog(@"近距离"); }else{ NSLog(@"远距离"); } }
二、iOS获取正在运行应用和已安装的程序
1、是否安装某款软件
这个你需要知道该软件的URL Schemes,《IOS的软件之间的调用(URL Schemes)》,知道软件的URL Schemes可以使用openUrl来获取ios是否安装了某款软件,比如这样,会返回一个bool值。
[[UIApplication sharedApplication] canOpenURL:@"damon://"];
2、正在运行的应用,包括后台的,在ios9.0以上的版本手机上面失效
今天又在网上看到了一个使用UIDevice获取设备上所有在运行的应用的程序,使用了一下,会列举出来所有正在运行的程序,包括后台的。这里也备忘一下,文件名分别是ssss.h和ssss.m,但是这个方法在真机调试的时候,发现原来在IOS9上面已经失效了,只能在ios9以下版本才可以使用
ssss.h文件内容
#import <UIKit/UIKit.h> @interface UIDevice(ProcessesAdditions) - (NSArray *)runningProcesses; @end
ssss.m文件内容
#import "ssss.h" #import <sys/sysctl.h> @implementation UIDevice (ProcessesAdditions) - (NSArray *)runningProcesses { int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0}; size_t miblen = 4; size_t size; int st = sysctl(mib, miblen, NULL, &size, NULL, 0); struct kinfo_proc * process = NULL; struct kinfo_proc * newprocess = NULL; do { size += size / 10; newprocess = realloc(process, size); if (!newprocess){ if (process){ free(process); } return nil; } process = newprocess; st = sysctl(mib, miblen, process, &size, NULL, 0); } while (st == -1 && errno == ENOMEM); if (st == 0){ if (size % sizeof(struct kinfo_proc) == 0){ int nprocess = size / sizeof(struct kinfo_proc); if (nprocess){ NSMutableArray * array = [[NSMutableArray alloc] init]; for (int i = nprocess - 1; i >= 0; i--){ NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid]; NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm]; NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil] forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName", nil]]; // [processID release]; // [processName release]; [array addObject:dict]; // [dict release]; } free(process); // return [array autorelease]; return array; } } } return nil; } @end
在想使用的地方,导入ssss.h头文件之后,可以这样使用
NSArray * processes = [[UIDevice currentDevice] runningProcesses]; for (NSDictionary * dict in processes){ NSLog(@"%@ - %@", [dict objectForKey:@"ProcessID"], [dict objectForKey:@"ProcessName"]); }
这样就打印传来了所有运行中的软件
3、该手机所有已经安装的软件,非越狱机也可使用
//这个头文件记得包含,不然有可能会报objc_getClass没定义的错误 #include <objc/runtime.h> Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace"); SEL selector=NSSelectorFromString(@"defaultWorkspace"); NSObject* workspace = [LSApplicationWorkspace_class performSelector:selector]; SEL selectorALL = NSSelectorFromString(@"allApplications"); NSLog(@"apps: %@", [workspace performSelector:selectorALL]);
调用该函数即可打印出来所有已经安装的软件的bundle id。
三、获取其他信息
1、NSBundle类
bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBundle.一个应用程序看上去和其他文件没有什么区别. 但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录. 我们把这个目录叫做程序的main bundle。通过这个路径可以获取到应用的信息,例如应用名、版本号等。
通过NSBundle可以获得这几个信息
//app应用相关信息的获取 NSDictionary *dicInfo = [[NSBundle mainBundle] infoDictionary]; // CFShow(dicInfo); NSString *strAppName = [dicInfo objectForKey:@"CFBundleDisplayName"]; NSLog(@"App应用名称:%@", strAppName); NSString *strAppVersion = [dicInfo objectForKey:@"CFBundleShortVersionString"]; NSLog(@"App应用版本:%@", strAppVersion); NSString *strAppBuild = [dicInfo objectForKey:@"CFBundleVersion"]; NSLog(@"App应用Build版本:%@", strAppBuild);
2、NSLocale类
NSLocale可以获取用户的本地化信息设置,例如货币类型,国家,语言,数字,日期格式的格式化,提供正确的地理位置显示等等。下面的代码获取机器当前语言和国家代码。
通过NSLocale可以这样使用
NSArray *languageArray = [NSLocale preferredLanguages]; NSString *language = [languageArray objectAtIndex:0]; NSLog(@"语言:%@", language);//en NSLocale *locale = [NSLocale currentLocale]; NSString *country = [locale localeIdentifier]; NSLog(@"国家:%@", country); //en_US
四、参考文章
Is it possible to get information about all apps installed on iPhone?
"performSelector may cause a leak because its selector is unknown"警告原因及其解决办法
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/338.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!