Swift CoreMotion在后台时检测设备上的点击或敲门

svh1985

我目前正在构建我的第一个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
}

控制台将按预期方式打印加速度.z值,但是一旦按下主页按钮,控制台将停止打印。

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

svh1985

我知道了!这是我的解决方案,请随时提出改进建议:)

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
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检测NSStatusItem(Swift)上的左右点击事件

来自分类Dev

在Swift中检测按钮的点击

来自分类Dev

Swift:ReadMoreTextView库点击检测

来自分类Dev

Swift SpriteKit在后台播放音频

来自分类Dev

swift:在后台加载图像数据

来自分类Dev

在iOS Swift中检测设备上正在播放的音轨

来自分类Dev

我尝试在iPhone上在后台显示FCM通知,但是当我使用Swift发送此通知时,它不起作用

来自分类Dev

Swift SKSpriteNode:检测点击/ DoubleTap / LongPress

来自分类Dev

如何使用Swift在后台播放音频?

来自分类Dev

如何使用Swift在后台线程中保存到CoreData?

来自分类Dev

iOS Swift在后台下载大量小文件

来自分类Dev

Swift:从后台返回时位置未更新

来自分类Dev

使用spritekit在释放swift swift时检测坐标

来自分类Dev

领域Swift后台搜索

来自分类Dev

UIbutton点击问题 - Swift

来自分类Dev

如何从后台检测swift应用程序何时为前台?

来自分类Dev

iPhone 6之前的设备上的Swift Cast

来自分类Dev

无法在设备上运行Swift iOS应用

来自分类Dev

iPhone 6之前的设备上的Swift Cast

来自分类Dev

使用CTCallCenter(Swift)在iOS上检测电话

来自分类Dev

Swift UIWebView检测滚动

来自分类Dev

在后台检测窗口

来自分类Dev

当用户在Swift中点击我的UIImage时,如何在全屏上显示图像?

来自分类Dev

实时检测多个设备上的点击

来自分类Dev

检测到iBeacon时在后台启动App

来自分类Dev

Swift中的BLE后台扫描

来自分类Dev

在Swift中后台下载

来自分类Dev

在10.9上编译Swift?

来自分类Dev

在CentOS上构建Swift