Skip to content

Instantly share code, notes, and snippets.

@miketsprague
Created November 3, 2015 18:47
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miketsprague/1e4c075f82d1e03ce327 to your computer and use it in GitHub Desktop.
Save miketsprague/1e4c075f82d1e03ce327 to your computer and use it in GitHub Desktop.
Swift class that lets you know when the user's device was raised to their ear
import Foundation
import CoreMotion
// Warning: This class assumes no one else is currently using the CMMotionManager.
class DeviceRaisedToEarListener: NSObject {
private let deviceQueue = NSOperationQueue()
private let motionManager = CMMotionManager()
private var vertical: Bool = false
private(set) var isRaisedToEar: Bool = false {
didSet {
if oldValue != self.isRaisedToEar {
self.stateChanged?(isRaisedToEar: self.isRaisedToEar)
}
}
}
var stateChanged:((isRaisedToEar: Bool)->())? = nil
override init() {
super.init()
self.setupMotionManager()
}
private func setupMotionManager() {
self.motionManager.deviceMotionUpdateInterval = 5.0 / 60.0
let device = UIDevice.currentDevice()
// Only listen for proximity changes if the device is held vertically
self.motionManager.startDeviceMotionUpdatesUsingReferenceFrame(CMAttitudeReferenceFrame.XArbitraryZVertical, toQueue: self.deviceQueue) { (motion, error) in
self.vertical = (motion.gravity.z > -0.4 && motion.gravity.z < 0.4 && motion.gravity.y < -0.7)
}
}
func startListening() {
UIDevice.currentDevice().proximityMonitoringEnabled = true
NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleProximityChange:", name: UIDeviceProximityStateDidChangeNotification, object: nil)
}
func stopListening() {
UIDevice.currentDevice().proximityMonitoringEnabled = false
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func handleProximityChange(notification: NSNotification) {
self.isRaisedToEar = UIDevice.currentDevice().proximityState && self.vertical
}
deinit {
self.stopListening()
}
}
// How to use:
private func setupRaiseListener() {
self.deviceListener.stateChanged = { [weak self] isRaisedToEar in
println("is raised? \(isRaisedToEar)")
}
self.deviceListener.startListening()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment