6

我已经为 Apple Watch 创建了一个应用程序。逻辑是,当用户举手并点击应用程序中的按钮时。那时我将获取加速度计值。每当用户举手并遇到捕获的位置时,我都必须向 iPhone 发送消息。

对我来说,我得到了正确的值但是,它总是会根据加速度计给出值。这意味着用户不会举手但加速度计值匹配。所以值将发送到移动设备。

func startUpadateAccelerometer() {
        self.motionManager.accelerometerUpdateInterval = 1.0 / 10.0
        self.motionManager.startAccelerometerUpdates(to: OperationQueue()) { (accelerometerData, error) -> Void in
            guard accelerometerData != nil else
            {
                print("There was an error: \(String(describing: error))")
                return
            }

            DispatchQueue.main.async {
                if(self.can_reset){
                    let differenceX : Bool = self.validateButtom(currentValue: accelerometerData!.acceleration.x, inititalValue: self.gravityReference.x)
                    let differenceY : Bool = self.validateButtom(currentValue: accelerometerData!.acceleration.y, inititalValue: self.gravityReference.y)

                    if(differenceX && differenceY && self.gravityOffsetDifference(currentValue: accelerometerData!.acceleration.x, referenceValue: self.gravityReference.x ) && self.gravityOffsetDifference(currentValue: accelerometerData!.acceleration.y, referenceValue: self.gravityReference.y)){
                        WKInterfaceDevice().play(.success)
//                        self.addLog(_logStr: EventsTypes.Achievements1.rawValue)

                        self.logString += String(format: "X: %0.3f Y: %0.3f Z: %0.3f  \n", accelerometerData!.acceleration.x,accelerometerData!.acceleration.y,accelerometerData!.acceleration.z)
                        self.m_XYZValueLbl.setText(self.logString)

                        self.is_RechedZeroPos = true
                        self.session?.sendMessage(["msg" : "\(self.logString)"], replyHandler: nil) { (error) in
                            NSLog("%@", "Error sending message: \(error)")
                        }

                    } else {
                        if(self.checkAchievements2_3(deviceMotionData: accelerometerData!.acceleration) == true) {
                            if self.is_RechedZeroPos == true {
                                self.addLog(_logStr: EventsTypes.Achievements2.rawValue)
                                self.is_RechedZeroPos = false
                            } else {
                                self.addLog(_logStr: EventsTypes.Achievements3.rawValue)
                            }
                        }
                    }
                } else {
                    self.gravityReference = accelerometerData!.acceleration
                    //self.logString = String(format: "Reference Acceleration   %0.3f   %0.3f   %0.3f  \n", self.gravityReference.x,self.gravityReference.y,self.gravityReference.z)
                    self.can_reset = true
                }
            }
        }
    }

func validateButtom(currentValue : Double , inititalValue : Double) -> Bool {
        if( currentValue == 0 && inititalValue == 0) {
            return true
        } else if( currentValue < 0 && inititalValue < 0) {
            return true
        } else if( currentValue > 0 && inititalValue > 0) {
            return true
        } else {
            return false
        }
    }



 func gravityOffsetDifference(currentValue : Double , referenceValue: Double) -> Bool {
        var difference : Double!
        if (fabs(currentValue) <= fabs(referenceValue)) {
            difference = fabs(referenceValue) - fabs(currentValue)
        } else {
            difference = fabs(currentValue) - fabs(referenceValue)
        }

        if (difference <= gravityOffset ) {
            return true
        } else {
            return false
        }
    }

请指导我仅在用户捕获位置时获取值。

4

1 回答 1

0

加速度计测量沿 x、y 和 z 轴的速度变化

获取加速度计数据

let motion = CMMotionManager()

func startAccelerometers() {
    // Make sure the accelerometer hardware is available.
    if self.motion.isAccelerometerAvailable {
        self.motion.accelerometerUpdateInterval = 1.0 / 60.0  // 60 Hz
        self.motion.startAccelerometerUpdates()

        // Configure a timer to fetch the data.
        self.timer = Timer(fire: Date(), interval: (1.0/60.0),
                           repeats: true, block: { (timer) in
                               // Get the accelerometer data.
                               if let data = self.motion.accelerometerData {
                                   let x = data.acceleration.x
                                   let y = data.acceleration.y
                                   let z = data.acceleration.z

                                   // Use the accelerometer data in your app.
                               }
                           })

        // Add the timer to the current run loop.
        RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
    }
}

重要的

如果您的应用依赖于加速度计硬件的存在,请使用加速度计值配置其 Info.plist 文件的 UIRequiredDeviceCapabilities 键。有关此键含义的更多信息,请参阅信息属性列表键参考。

于 2017-11-29T10:18:02.673 回答