iOS 获取设备信息之UIDevice的使用,Swift 基于 API(转)

https://juejin.im/post/5a4615aa5188257d6a7ee054#comment

*源代码中有一行bug




iOS 获取设备信息之UIDevice的使用,Swift 基于 API

这篇文章是基于 UIDevice 的 API进行分析的。最后给出了 UIDevice 的使用方法,包括可以访问设备名称,系统版本,UUID,监测电量变化,电池电量状态,监测屏幕方向变化,以及监测iPhone 是否在接近用户的身体。

UIDevice

UIDevice 是 UIKit 框架下Core App 中的设备环境的一个类。用来表示当前的设备,可以使用 UIDevice 实例做什么事情呢? 具体总结如下: 1.使用UIDevice对象获取有关设备的信息,如名称,设备型号以及操作系统名称和版本。 2.可以使用UIDevice实例来检测设备特性的变化,例如物理方向。 3.可以使用orientation属性获取当前方向,并可以在设备方向改变的时候使用通知来作出相应的处理。 4.可以使用UIDevice实例获取有关电池充电状态和充电水平更改的信息和通知。 5.还提供对接近传感器状态的访问。接近传感器检测用户是否将设备保持靠近他们的脸部。仅在需要时才启用电池监控或接近感应。 6.还可以使用实例方法在自定义输入和键盘附件视图中播放键盘输入点击。

源码分析

import Foundationimport UIKit// 设备方向。一个枚举public enum UIDeviceOrientation : Int {caseunknowncaseportrait  // 竖直屏,home 键在下边caseportraitUpsideDown //  竖直屏,Home 键在上边caselandscapeLeft // 横屏,Home 在右边caselandscapeRight // 横屏,home 在左边casefaceUp // 平放,正面朝上casefaceDown // 平放,正面朝下}// 设备方向的扩展。 用于判断方向,只有 get 属性extension UIDeviceOrientation {    // 是否是横屏    public var isLandscape: Bool { get }    // 是否是竖屏    public var isPortrait: Bool { get }    // 是否平放    public var isFlat: Bool { get }    // 有效的界面方向    public var isValidInterfaceOrientation: Bool { get }}// 电池状态枚举public enum UIDeviceBatteryState : Int {caseunknowncaseunplugged // 放电casecharging // 充电,少于100%casefull // 充满}// availableiniPhone 3.0// 当前设备的界面类型 枚举public enum UIUserInterfaceIdiom : Int {caseunspecified  // 未知。未指明    @available(iOS 3.2, *)casephone // iPhone and iPod touch 风格的UI    @available(iOS 3.2, *)casepad // iPad UI    @available(iOS 9.0, *)casetv // Apple TV style UI    @available(iOS 9.0, *)casecarPlay // CarPlay style UI ,车载屏}//  方法。设备是否是竖屏,返回 Bool 值public func UIDeviceOrientationIsPortrait(_ orientation: UIDeviceOrientation) -> Bool// 设备是否是横屏,返回 Bool 值public func UIDeviceOrientationIsLandscape(_ orientation: UIDeviceOrientation) -> Bool//  UIDevice类@available(iOS 2.0, *)open class UIDevice : NSObject {    //类属性,获取当前设备实例    open class var current: UIDevice { get }    //实例属性,设备名        open var name: String { get } // e.g."My iPhone"//实例属性,设备型号    open var model: String { get } // e.g. @"iPhone", @"iPod touch"//实例属性,设备定位型号    open var localizedModel: String { get } // localized version of model    //实例属性,设备系统名称    open var systemName: String { get } // e.g. @"iOS"//实例属性,设备系统版本    open var systemVersion: String { get } // e.g. @"4.0"//实例属性,设备方向    open var orientation: UIDeviceOrientation { get }      //实例属性,设备的 UUID    @available(iOS 6.0, *)    open var identifierForVendor: UUID? { get }      //实例属性,一个布尔值,指示接收器是否生成方向通知(true)或不指定(false)    open var isGeneratingDeviceOrientationNotifications: Bool { get }    // 开始设备方向更改通知的生成。    open func beginGeneratingDeviceOrientationNotifications() // nestable    // 结束设备方向更改通知的生成。    open func endGeneratingDeviceOrientationNotifications()    // 指示是否启用电池监控(true)或(否false)    @available(iOS 3.0, *)    open var isBatteryMonitoringEnabled: Bool // default is NO    // 电池的状态    @available(iOS 3.0, *)    open var batteryState: UIDeviceBatteryState { get } // UIDeviceBatteryStateUnknownifmonitoring disabled    // 电量 是个小数,用百分比展示    @available(iOS 3.0, *)    open var batteryLevel: Float { get } // 0 .. 1.0. 如果电池状态未知,为-1    //表示是否启用接近用户监测(true)或不(false)。    @available(iOS 3.0, *)    open var isProximityMonitoringEnabled: Bool // default is NO    // 表示接近传感器是否接近user(true)或not(false)    @available(iOS 3.0, *)    open var proximityState: Bool { get } // always returns NOifno proximity detector    // 设备是否支持接近用户监测    @available(iOS 4.0, *)    open var isMultitaskingSupported: Bool { get }    // 用户在当前设备上使用的界面风格,是上边的一个枚举    @available(iOS 3.2, *)    open var userInterfaceIdiom: UIUserInterfaceIdiom { get }    // 用来播放可用的键盘输入点击声,只有用户允许输入声音是才有用    @available(iOS 4.2, *)    open func playInputClick() // Plays a click onlyifan enabling input view is on-screen and user has enabled input clicks.}// 协议,输入视图的按键声音public protocol UIInputViewAudioFeedback : NSObjectProtocol {    // 获取设备是否开启键盘输入声音,如果是 YES 输入是将会播放声音    optional public varenableInputClicksWhenVisible: Bool { get } // If YES, an input view willenableplayInputClick.}// 可以用来监听的一些状态。用于通知的发送,设备状态改变时的监听。public func UI_USER_INTERFACE_IDIOM() -> UIUserInterfaceIdiomextension NSNotification.Name {    // 设备方向改变    public staticletUIDeviceOrientationDidChange: NSNotification.Name    // 电池状态改变    @available(iOS 3.0, *)    public staticletUIDeviceBatteryStateDidChange: NSNotification.Name    // 电量改变    @available(iOS 3.0, *)    public staticletUIDeviceBatteryLevelDidChange: NSNotification.Name    // 设备接近状态改变    @available(iOS 3.0, *)    public staticletUIDeviceProximityStateDidChange: NSNotification.Name}复制代码

================华丽丽分割线,代码来了===============

//  ViewController.swift//  DeviceOrientation//  Created by YHY on 2017/3/22.//  Copyright © 2017年 太阳在线. All rights reserved.import UIKitclass ViewController: UIViewController {var deviceInfo: [String]!@IBOutlet weak var name: UILabel!@IBOutlet weak var model: UILabel!@IBOutlet weak var localizedModel: UILabel!@IBOutlet weak var systemName: UILabel!@IBOutlet weak var systemVersion: UILabel!@IBOutlet weak var orientation: UILabel!@IBOutlet weak var batteryState: UILabel!@IBOutlet weak var batteryLevel: UILabel!@IBOutlet weak var proximityState: UILabel!@IBOutlet weak var userInterfaceIdiom: UILabel!@IBOutlet weak var multitaskingSupported: UILabel!@IBOutlet weak var identifierForVendor: UILabel!@IBOutlet weak var proximity: UILabel!var i = 0,j = 0override funcviewDidLoad() {super.viewDidLoad()letdevice = UIDevice.current// 启用电池监控,启用之后有关电池的监测才可以用device.isBatteryMonitoringEnabled =true// 启用用户接近device.isProximityMonitoringEnabled =trueprint("设备名:"+ device.name)print("设备型号:"+ device.model)print("设备定位型号:"+ device.localizedModel)print("设备系统:"+ device.systemName)print("系统版本:"+ device.systemVersion)print("UUID:"+ String(describing: device.identifierForVendor) )print("电量:\(UIDevice.current.batteryLevel * 100)%")print("是否支持接近用户监测:"+ String(device.isMultitaskingSupported))                name.text ="设备名:"+ device.name                model.text ="设备型号:"+ device.model                localizedModel.text ="设备定位型号:"+ device.localizedModel                systemName.text ="设备系统:"+ device.systemName                systemVersion.text ="系统版本:"+ device.systemVersion                identifierForVendor.text ="UUID:"+ String(describing: device.identifierForVendor!)                batteryLevel.text ="电量:"+ String(device.batteryLevel)                multitaskingSupported.text ="是否支持接近用户监测:"+ String(device.isMultitaskingSupported)switch device.userInterfaceIdiom {case.carPlay:print("用户界面风格:车载屏")    userInterfaceIdiom.text ="用户界面风格:车载屏"case.pad:print("用户界面风格:iPad")    userInterfaceIdiom.text ="用户界面风格:iPad"case.phone:print("用户界面风格:iPhone")    userInterfaceIdiom.text ="用户界面风格:iPhone"case.tv:print("用户界面风格: TV")userInterfaceIdiom.text ="用户界面风格: TV"default:print("用户界面风格:未知")    userInterfaceIdiom.text ="用户界面风格:未知"}}override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated)// 监听设备方向变化NotificationCenter.default.addObserver(self, selector:#selector(change), name: .UIDeviceOrientationDidChange, object: nil)// 监听电池状态NotificationCenter.default.addObserver(self, selector:#selector(battery), name: .UIDeviceBatteryStateDidChange, object: nil)// 监听电量NotificationCenter.default.addObserver(self, selector:#selector(batteryLevels), name: .UIDeviceBatteryLevelDidChange, object: nil)// 监听设备是否接近用户NotificationCenter.default.addObserver(self, selector:#selector(proximityStates), name: .UIDeviceProximityStateDidChange, object: nil)} funcchange() {letorienta = UIDevice.current.orientationprint(orienta)switch orienta {case.faceDown:    orientation.text ="设备方向:脸朝地"case.faceUp:    orientation.text ="设备方向:脸朝上"case.landscapeLeft:    orientation.text ="设备方向:头朝左"case.landscapeRight:    orientation.text ="设备方向:头朝右"case.portrait:    orientation.text ="设备方向:正立"case.portraitUpsideDown:    orientation.text ="设备方向:倒立"default:    orientation.text ="设备方向:还在懵逼"}}funcbattery() {letbatteryStatu = UIDevice.current.batteryStateswitch batteryStatu {case.charging:print("正在充电") batteryState.text ="电池状态:正在充电"case.full:print("满电量")batteryState.text ="电池状态:满电量"case.unplugged:print("放电")batteryState.text ="电池状态:在放电"default:print("我也不知道在干嘛")batteryState.text ="电池状态:我也不知道在干嘛"}}funcbatteryLevels() {print("电量",UIDevice.current.batteryLevel)batteryLevel.text ="通知电量变为:\(UIDevice.current.batteryLevel * 100)%"}funcproximityStates() {print("是否接近用户:",UIDevice.current.proximityState)ifUIDevice.current.proximityState {i += 1proximity.text ="接近了用户\(i)次"}else{j += 1proximityState.text ="离开了\(j)次"}}override func viewDidDisappear(_ animated: Bool) {super.viewDidDisappear(animated)UIDevice.current.endGeneratingDeviceOrientationNotifications()NotificationCenter.default.removeObserver(self)}}复制代码

Demo 下载

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容