iOS 獲取設(shè)備信息之UIDevice的使用,Swift 基于 API(轉(zhuǎn))

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

*源代碼中有一行bug




iOS 獲取設(shè)備信息之UIDevice的使用,Swift 基于 API

這篇文章是基于 UIDevice 的 API進行分析的。最后給出了 UIDevice 的使用方法,包括可以訪問設(shè)備名稱,系統(tǒng)版本,UUID,監(jiān)測電量變化,電池電量狀態(tài),監(jiān)測屏幕方向變化,以及監(jiān)測iPhone 是否在接近用戶的身體。

UIDevice

UIDevice?是 UIKit 框架下Core App 中的設(shè)備環(huán)境的一個類。用來表示當前的設(shè)備,可以使用 UIDevice 實例做什么事情呢? 具體總結(jié)如下: 1.使用UIDevice對象獲取有關(guān)設(shè)備的信息,如名稱,設(shè)備型號以及操作系統(tǒng)名稱和版本。 2.可以使用UIDevice實例來檢測設(shè)備特性的變化,例如物理方向。 3.可以使用orientation屬性獲取當前方向,并可以在設(shè)備方向改變的時候使用通知來作出相應(yīng)的處理。 4.可以使用UIDevice實例獲取有關(guān)電池充電狀態(tài)和充電水平更改的信息和通知。 5.還提供對接近傳感器狀態(tài)的訪問。接近傳感器檢測用戶是否將設(shè)備保持靠近他們的臉部。僅在需要時才啟用電池監(jiān)控或接近感應(yīng)。 6.還可以使用實例方法在自定義輸入和鍵盤附件視圖中播放鍵盤輸入點擊。

源碼分析

import Foundationimport UIKit// 設(shè)備方向。一個枚舉public enum UIDeviceOrientation : Int {caseunknowncaseportrait? // 豎直屏,home 鍵在下邊caseportraitUpsideDown //? 豎直屏,Home 鍵在上邊caselandscapeLeft // 橫屏,Home 在右邊caselandscapeRight // 橫屏,home 在左邊casefaceUp // 平放,正面朝上casefaceDown // 平放,正面朝下}// 設(shè)備方向的擴展。 用于判斷方向,只有 get 屬性extension UIDeviceOrientation {? ? // 是否是橫屏? ? public var isLandscape: Bool { get }? ? // 是否是豎屏? ? public var isPortrait: Bool { get }? ? // 是否平放? ? public var isFlat: Bool { get }? ? // 有效的界面方向? ? public var isValidInterfaceOrientation: Bool { get }}// 電池狀態(tài)枚舉public enum UIDeviceBatteryState : Int {caseunknowncaseunplugged // 放電casecharging // 充電,少于100%casefull // 充滿}// availableiniPhone 3.0// 當前設(shè)備的界面類型 枚舉public enum UIUserInterfaceIdiom : Int {caseunspecified? // 未知。未指明? ? @available(iOS 3.2, *)casephone // iPhone and iPod touch 風(fēng)格的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 ,車載屏}//? 方法。設(shè)備是否是豎屏,返回 Bool 值public func UIDeviceOrientationIsPortrait(_ orientation: UIDeviceOrientation) -> Bool// 設(shè)備是否是橫屏,返回 Bool 值public func UIDeviceOrientationIsLandscape(_ orientation: UIDeviceOrientation) -> Bool//? UIDevice類@available(iOS 2.0, *)open class UIDevice : NSObject {? ? //類屬性,獲取當前設(shè)備實例? ? open class var current: UIDevice { get }? ? //實例屬性,設(shè)備名? ? ? ? open var name: String { get } // e.g."My iPhone"http://實例屬性,設(shè)備型號? ? open var model: String { get } // e.g. @"iPhone", @"iPod touch"http://實例屬性,設(shè)備定位型號? ? open var localizedModel: String { get } // localized version of model? ? //實例屬性,設(shè)備系統(tǒng)名稱? ? open var systemName: String { get } // e.g. @"iOS"http://實例屬性,設(shè)備系統(tǒng)版本? ? open var systemVersion: String { get } // e.g. @"4.0"http://實例屬性,設(shè)備方向? ? open var orientation: UIDeviceOrientation { get }? ? ? //實例屬性,設(shè)備的 UUID? ? @available(iOS 6.0, *)? ? open var identifierForVendor: UUID? { get }? ? ? //實例屬性,一個布爾值,指示接收器是否生成方向通知(true)或不指定(false)? ? open var isGeneratingDeviceOrientationNotifications: Bool { get }? ? // 開始設(shè)備方向更改通知的生成。? ? open func beginGeneratingDeviceOrientationNotifications() // nestable? ? // 結(jié)束設(shè)備方向更改通知的生成。? ? open func endGeneratingDeviceOrientationNotifications()? ? // 指示是否啟用電池監(jiān)控(true)或(否false)? ? @available(iOS 3.0, *)? ? open var isBatteryMonitoringEnabled: Bool // default is NO? ? // 電池的狀態(tài)? ? @available(iOS 3.0, *)? ? open var batteryState: UIDeviceBatteryState { get } // UIDeviceBatteryStateUnknownifmonitoring disabled? ? // 電量 是個小數(shù),用百分比展示? ? @available(iOS 3.0, *)? ? open var batteryLevel: Float { get } // 0 .. 1.0. 如果電池狀態(tài)未知,為-1? ? //表示是否啟用接近用戶監(jiān)測(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? ? // 設(shè)備是否支持接近用戶監(jiān)測? ? @available(iOS 4.0, *)? ? open var isMultitaskingSupported: Bool { get }? ? // 用戶在當前設(shè)備上使用的界面風(fēng)格,是上邊的一個枚舉? ? @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.}// 協(xié)議,輸入視圖的按鍵聲音public protocol UIInputViewAudioFeedback : NSObjectProtocol {? ? // 獲取設(shè)備是否開啟鍵盤輸入聲音,如果是 YES 輸入是將會播放聲音? ? optional public varenableInputClicksWhenVisible: Bool { get } // If YES, an input view willenableplayInputClick.}// 可以用來監(jiān)聽的一些狀態(tài)。用于通知的發(fā)送,設(shè)備狀態(tài)改變時的監(jiān)聽。public func UI_USER_INTERFACE_IDIOM() -> UIUserInterfaceIdiomextension NSNotification.Name {? ? // 設(shè)備方向改變? ? public staticletUIDeviceOrientationDidChange: NSNotification.Name? ? // 電池狀態(tài)改變? ? @available(iOS 3.0, *)? ? public staticletUIDeviceBatteryStateDidChange: NSNotification.Name? ? // 電量改變? ? @available(iOS 3.0, *)? ? public staticletUIDeviceBatteryLevelDidChange: NSNotification.Name? ? // 設(shè)備接近狀態(tài)改變? ? @available(iOS 3.0, *)? ? public staticletUIDeviceProximityStateDidChange: NSNotification.Name}復(fù)制代碼

================華麗麗分割線,代碼來了===============

//? 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// 啟用電池監(jiān)控,啟用之后有關(guān)電池的監(jiān)測才可以用device.isBatteryMonitoringEnabled =true// 啟用用戶接近device.isProximityMonitoringEnabled =trueprint("設(shè)備名:"+ device.name)print("設(shè)備型號:"+ device.model)print("設(shè)備定位型號:"+ device.localizedModel)print("設(shè)備系統(tǒng):"+ device.systemName)print("系統(tǒng)版本:"+ device.systemVersion)print("UUID:"+ String(describing: device.identifierForVendor) )print("電量:\(UIDevice.current.batteryLevel * 100)%")print("是否支持接近用戶監(jiān)測:"+ String(device.isMultitaskingSupported))? ? ? ? ? ? ? ? name.text ="設(shè)備名:"+ device.name? ? ? ? ? ? ? ? model.text ="設(shè)備型號:"+ device.model? ? ? ? ? ? ? ? localizedModel.text ="設(shè)備定位型號:"+ device.localizedModel? ? ? ? ? ? ? ? systemName.text ="設(shè)備系統(tǒng):"+ device.systemName? ? ? ? ? ? ? ? systemVersion.text ="系統(tǒng)版本:"+ device.systemVersion? ? ? ? ? ? ? ? identifierForVendor.text ="UUID:"+ String(describing: device.identifierForVendor!)? ? ? ? ? ? ? ? batteryLevel.text ="電量:"+ String(device.batteryLevel)? ? ? ? ? ? ? ? multitaskingSupported.text ="是否支持接近用戶監(jiān)測:"+ String(device.isMultitaskingSupported)switch device.userInterfaceIdiom {case.carPlay:print("用戶界面風(fēng)格:車載屏")? ? userInterfaceIdiom.text ="用戶界面風(fēng)格:車載屏"case.pad:print("用戶界面風(fēng)格:iPad")? ? userInterfaceIdiom.text ="用戶界面風(fēng)格:iPad"case.phone:print("用戶界面風(fēng)格:iPhone")? ? userInterfaceIdiom.text ="用戶界面風(fēng)格:iPhone"case.tv:print("用戶界面風(fēng)格: TV")userInterfaceIdiom.text ="用戶界面風(fēng)格: TV"default:print("用戶界面風(fēng)格:未知")? ? userInterfaceIdiom.text ="用戶界面風(fēng)格:未知"}}override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated)// 監(jiān)聽設(shè)備方向變化NotificationCenter.default.addObserver(self, selector:#selector(change), name: .UIDeviceOrientationDidChange, object: nil)// 監(jiān)聽電池狀態(tài)NotificationCenter.default.addObserver(self, selector:#selector(battery), name: .UIDeviceBatteryStateDidChange, object: nil)// 監(jiān)聽電量NotificationCenter.default.addObserver(self, selector:#selector(batteryLevels), name: .UIDeviceBatteryLevelDidChange, object: nil)// 監(jiān)聽設(shè)備是否接近用戶NotificationCenter.default.addObserver(self, selector:#selector(proximityStates), name: .UIDeviceProximityStateDidChange, object: nil)} funcchange() {letorienta = UIDevice.current.orientationprint(orienta)switch orienta {case.faceDown:? ? orientation.text ="設(shè)備方向:臉朝地"case.faceUp:? ? orientation.text ="設(shè)備方向:臉朝上"case.landscapeLeft:? ? orientation.text ="設(shè)備方向:頭朝左"case.landscapeRight:? ? orientation.text ="設(shè)備方向:頭朝右"case.portrait:? ? orientation.text ="設(shè)備方向:正立"case.portraitUpsideDown:? ? orientation.text ="設(shè)備方向:倒立"default:? ? orientation.text ="設(shè)備方向:還在懵逼"}}funcbattery() {letbatteryStatu = UIDevice.current.batteryStateswitch batteryStatu {case.charging:print("正在充電") batteryState.text ="電池狀態(tài):正在充電"case.full:print("滿電量")batteryState.text ="電池狀態(tài):滿電量"case.unplugged:print("放電")batteryState.text ="電池狀態(tài):在放電"default:print("我也不知道在干嘛")batteryState.text ="電池狀態(tài):我也不知道在干嘛"}}funcbatteryLevels() {print("電量",UIDevice.current.batteryLevel)batteryLevel.text ="通知電量變?yōu)椋篭(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)}}復(fù)制代碼

Demo 下載

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容