[程序员日记]又见UIDevice
上一篇文章介绍了UIApplication,这是控制应用的类。这篇文章看一个容易被忽略但却经常需要打交道的东西——UIDevice。
顾名思义,就是设备。我相信在我们日常的开发中或多或少都会接触到其中的东西,如做视频应用需要屏幕旋转,做意见反馈会增加系统版本、系统信息等等。以下内容多来自api文档,希望多多执教。
1.获取设备信息
打开UIDevice
就会看到以下几个属性。
@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"
[补充]
1.判断设备model
除了可以用mode
之外,还可以用UI_USER_INTERFACE_IDIOM()
,它其实就是一个UIUserInterfaceIdiom
,有几个值:
typedef NS_ENUM(NSInteger, UIUserInterfaceIdiom) {
UIUserInterfaceIdiomUnspecified = -1,
UIUserInterfaceIdiomPhone , // iPhone and iPod touch style UI
UIUserInterfaceIdiomPad , // iPad style UI
UIUserInterfaceIdiomTV , // Apple TV style UI
UIUserInterfaceIdiomCarPlay , // CarPlay style UI
};
2.获取设备名称使用sysctlbyname()
,sysctl()
标准unix
函数
- (NSString *) platformString
{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithUTF8String:machine];
free(machine);
if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
//…………
if ([platform isEqualToString:@"i386"]) return @"Simulator";
return @"";
}
3.在做意见反馈时经常会用到以上信息,但同时也会增加一些应用的信息。此时会用到另外一个重要的工具——NSBundle
(目录)。虽然主要说UIDevice
,但也想到相关的都介绍一下。
使用NSBundle
,我们可以通过相对路径去访问应用下的文件,为开发带来了便利。
而在NSBundle
中app应用相关信息的获取:
NSDictionary *dicInfo = [[NSBundle mainBundle] infoDictionary];
2.设备旋转
监听设备旋转时通知
UIDeviceOrientationDidChangeNotification
检测当前设备方向是否改变,YES 方向改变
@property(nonatomic,readonly,getter=isGeneratingDeviceOrientationNotifications) BOOL generatesDeviceOrientationNotifications ;
开始改变设备方向,如果需要在改变方向的时候处理一些事情可以重写这个方法
- (void)beginGeneratingDeviceOrientationNotifications;
结束改变设备方向,如果需要在改变方向的时候处理一些事情可以重写这个方法,同上
- (void)endGeneratingDeviceOrientationNotifications ;
UIDeviceOrientation有以下枚举类型:
typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
UIDeviceOrientationUnknown,
UIDeviceOrientationPortrait, // Device oriented vertically, home button on the bottom
UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top
UIDeviceOrientationLandscapeLeft, // Device oriented horizontally, home button on the right
UIDeviceOrientationLandscapeRight, // Device oriented horizontally, home button on the left
UIDeviceOrientationFaceUp, // Device oriented flat, face up
UIDeviceOrientationFaceDown // Device oriented flat, face down
} __TVOS_PROHIBITED;
针对以上类型,在后面[注]中补充。
[注]
这是我在项目中遇到的问题:在做直播功能模块,使用到 弹幕 的功能(弹幕使用第三方库BarrageRenderer
),弹幕为横屏自动开启,竖屏时关闭。在测试用发现弹幕有时开有时关,最终发现在屏幕横放时无法显示。原因是设置方法出现错误。
通过[UIDevice currentDevice].orientation
的状态判断横竖屏会出现错误,因为其枚举类型是UIDeviceOrientation
,在查看其枚举类型时会发现其除了Portrait LandscapeLeft
LandscapeRight
PortraitUpsideDown
外还有FaceUp
FaceDown
两个状态,忽略对其的设置会产生影响。
UIDeviceOrientation
枚举
typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
UIDeviceOrientationUnknown,
UIDeviceOrientationPortrait, // Device oriented vertically, home button on the bottom
UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top
UIDeviceOrientationLandscapeLeft, // Device oriented horizontally, home button on the right
UIDeviceOrientationLandscapeRight, // Device oriented horizontally, home button on the left
UIDeviceOrientationFaceUp, // Device oriented flat, face up
UIDeviceOrientationFaceDown // Device oriented flat, face down
} __TVOS_PROHIBITED;
在对其使用时还可以将其转换成UIInterfaceOrientation
,因为后者只有常见的几种类型。
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
UIInterfaceOrientation interfaceOrientation = (UIInterfaceOrientation)orientation;
UIInterfaceOrientation
枚举
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown,
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
} __TVOS_PROHIBITED;
另外在横竖屏切换时我们会对屏幕的状态做监听,通常监听的是UIDeviceOrientationDidChangeNotification
,监听得到的结果是UIDeviceOrientation
,也可以监听UIApplicationDidChangeStatusBarFrameNotification
,得到UIInterfaceOrientation
。当然UIApplicationDidChangeStatusBarFrameNotification
也可以监听热点等事件中出现的问题。
3.获取电量
@property(nonatomic,getter=isBatteryMonitoringEnabled) BOOL batteryMonitoringEnabled // 可以取得电池剩余量以及充电状态的信息,默认为NO
@property(nonatomic,readonly) UIDeviceBatteryState batteryState // 充电状态
@property(nonatomic,readonly) float batteryLevel // 0.0-1.0取得失败的适合为-1.0
注:
1.batteryLevel
返回的是0-1.0的百分比,若要
2.UIDeviceBatteryState
有几种状态
typedef NS_ENUM(NSInteger, UIDeviceBatteryState) {
UIDeviceBatteryStateUnknown, 无法取得充电状态情况
UIDeviceBatteryStateUnplugged, // 非充电状态
UIDeviceBatteryStateCharging, // 充电状态 (未充满)
UIDeviceBatteryStateFull, // 充满状态(充满)
}
监听电量时有两个通知:
UIDeviceBatteryStateDidChangeNotification //监视电池剩余电量
UIDeviceBatteryLevelDidChangeNotification //监视充电状态
看到一篇使用IOKit或instrument获取设备电量的文章,安利给大家:
获取IOS设备的电量信息:Battery Level
4.接近传感器
这里是设备的传感器,启用接近传感器后,它检测前方是否存在一个大型物体,如果有,它会关闭屏幕,并发出一般性通知。当障碍物移走后,会重新打开屏幕。这可以防止在通知过程中,误用耳朵触碰按钮。
@property(nonatomic,getter=isProximityMonitoringEnabled) BOOL proximityMonitoringEnabled //可以取得接近传感,默认为NO
@property(nonatomic,readonly) BOOL proximityState // YES 临近 消息触发
监听消息触发时有两个通知:
UIDeviceProximityStateDidChangeNotification
例如
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChanged:) name:UIDeviceProximityStateDidChangeNotificatio object:device];}
- (void) proximityChanged:(NSNotification *)notification {
UIDevice *device = [notification object];
if(device.proximityState==1){
//do something
}
}
5.多任务处理
支持多任务处理
@property(nonatomic,readonly,getter=isMultitaskingSupported) BOOL multitaskingSupported ;
更多内容后续补充,望多多执教。
文章优先发表于:http://keyliu.com
转载请注明出处。