【问题标题】:Swift CoreMotion detect Tap or Knock on device while in backgroundSwift CoreMotion 在后台检测设备上的敲击或敲击
【发布时间】:2015-08-17 15:27:56
【问题描述】:

我目前正在构建我的第一个 iOS Swift 应用程序,我想通过这个应用程序在后台运行时执行一个操作。

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

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

并在 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值,但是一旦我按下主页按钮,控制台就会停止打印。

我在网上搜索了有关如何执行此操作的示例代码,我知道这是可能的...因为我们都知道“敲敲解锁”应用程序,但我似乎找不到一块Swift 的示例代码。

【问题讨论】:

    标签: ios swift core-motion


    【解决方案1】:

    在 Swift 5.1 中这一行:

    manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { [weak self] (data: CMDeviceMotion!, error: NSError!) in
    

    需要:

    manager.startDeviceMotionUpdates(to: .main) { [weak self] (data, error) in
    

    【讨论】:

      【解决方案2】:

      感谢您发布此信息。尽管我需要弄清楚如何将这些数据与常规运动数据分开,但这对我有帮助。一个建议...使用 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
      

      【讨论】:

        【解决方案3】:

        我让它工作了!这是我的解决方案,请随时提出改进建议:)

        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
            }
        

        【讨论】:

        • 需要使用background mode
        • @Individual11 我们怎样才能通过使用后台模式仍然使 coreMotion 工作?你能给我更多的信息吗? CoreMotion 是否在 Kill App 状态下工作?非常感谢您的帮助。
        • @svh1985 嗨,如何让您的应用程序在后台运行?我没有得到你的回答,你能给我更多的细节吗?我也遇到了同样的问题,不知道怎么解决?如果应用程序被杀死,请问您是否知道 CoreMotion 工作?感谢您的帮助:)
        • 我从来没有让它以我完全想要的方式工作。有一些方法可以让您的应用在网络和蓝牙等后台运行,但如果我的应用实际上并不需要它,我不想将其用作作弊。
        猜你喜欢
        • 1970-01-01
        • 2011-08-16
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-30
        相关资源
        最近更新 更多