2017-11-17 4 views
6

Ich habe eine Anwendung für Apple Watch erstellen. Die Logik ist, wenn der Benutzer die Hand hebt und einen Knopf aus der App antippt. Zu dieser Zeit werde ich die Beschleunigungsmesserwerte holen. Und immer wenn Benutzer ihre Hand erheben und die eingenommene Position treffen, muss ich eine Nachricht an das iPhone senden.Wie erkennt man die Position der Apple Watch mit Beschleunigungsmesser und Gravity in Swift?

Für mich sind die Werte richtig, aber, es wird immer die Werte basierend auf Beschleunigungsmesser geben. Was bedeutet, dass der Benutzer die Hand nicht hebt, aber die Beschleunigungsmesserwerte übereinstimmen. Werte werden also an Mobilgeräte gesendet.

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 
     } 
    } 

Bitte führen Sie mich, um die Werte nur zu erhalten, wenn der Benutzer die Position erfasst.

+0

Folgendes scheint für Sie zu gelten: https://forums.developer.apple.com/thread/3657 – fishinear

+0

Ich habe Ihre Frage nicht genau erhalten. Wenn Benutzer ihre Hände heben und auf einen Knopf tippen, speichern Sie die Beschleunigungssensor-Informationen. Möchten Sie die Beschleunigungsmesserinfo vergleichen und abgleichen, wenn der Benutzer seine Hände wieder hebt? –

Antwort

0

Accelerometers Geschwindigkeitsänderungen messen entlang der x-, y- und z-Achsen

Fetching Beschleunigungsmesserdaten

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) 
    } 
} 

Wichtige

Wenn Ihre Anwendung auf das Vorhandensein des Beschleunigungsmessers stützt Konfigurieren Sie den UIRequiredDeviceCapabilities-Schlüssel der Info.plist-Datei mit dem Beschleunigungssensorwert. Weitere Informationen zur Bedeutung dieses Schlüssels finden Sie unter Schlüsselreferenz der Informationseigenschaftsliste.

+0

Danke für die Antwort. Ich werde das überprüfen und Sie wissen lassen. – Sabs

Verwandte Themen