Swift CoreMotion检测在后台点击或敲击设备

我目前正在build设我的第一个iOS Swift应用程序的过程中,与此应用程序我想执行一个操作,而应用程序在后台运行。

一旦用户在设备上点击两次,就需要执行该操作。

我已启用后台模式:应用function中的位置更新

并在AppDelegate中设置一个AccelerometerUpdatesToQueue函数:

let manager = CMMotionManager() func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. if manager.accelerometerAvailable { manager.accelerometerUpdateInterval = 0.01 manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) { [weak self] (data: CMAccelerometerData!, error: NSError!) in println(data.acceleration.z) } } return true } 

控制台按预期打印出acceleration.z值,但是一旦按下homebutton,控制台就会停止打印。

我在网上search了关于如何做到这一点的示例代码,我知道这是可能的…因为我们都知道应用程序“敲敲解锁”,但我似乎无法find一块示例代码为斯威夫特。

我得到它的工作! 这是我的解决scheme,随时提出改进:)

 class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? let manager = CMMotionManager() var knocked : Bool = false let motionUpdateInterval : Double = 0.05 var knockReset : Double = 2.0 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { if manager.deviceMotionAvailable { manager.deviceMotionUpdateInterval = motionUpdateInterval // seconds manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { [weak self] (data: CMDeviceMotion!, error: NSError!) in if (data.userAcceleration.z < -0.7) || (data.userAcceleration.z > 0.7) { // Check if device is knocked // Check for double knock if self!.knocked == false { // First knock println("First Knock") self!.knocked = true }else{ // Second knock println("Double Knocked") self!.knocked = false self!.knockReset = 2.0 // Action: } } // Countdown for reset action (second knock must be within the knockReset limit) if (self!.knocked) && (self!.knockReset >= 0.0) { self!.knockReset = self!.knockReset - self!.motionUpdateInterval }else if self!.knocked == true { self!.knocked = false self!.knockReset = 2.0 println("Reset") } } } return true } 

感谢张贴这个。 虽然我需要弄清楚如何将这些数据与常规移动数据分开,但是这对我有帮助。 一个build议…使用fabs来获得userAcceleration.z的绝对值。

  if (data.userAcceleration.z < -0.7) || (data.userAcceleration.z > 0.7) { // Check if device is knocked 

 if (fabs(data.userAcceleration.z) > 0.7) { // Check if device is knocked