ios开发之UIDevice使用总结

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

四、参考文章

  1. beginGeneratingDeviceOrientationNotifications How to work

  2. iOS获取正在运行应用

  3. iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)

  4. iOS传感器开发——距离传感器的应用

  5. iOS获取和监测设备基本信息——UIDevice的使用

  6. Is it possible to get information about all apps installed on iPhone?

  7. "performSelector may cause a leak because its selector is unknown"警告原因及其解决办法

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment