2017-11-17 78 views
6

Mam tworzenie aplikacji na zegarek Apple. Logika polega na tym, że użytkownik podnosi rękę i dotyka przycisku z aplikacji. W tym czasie będę pobierał wartości akcelerometru. I ilekroć użytkownik podniesie rękę i osiągnie schwytaną pozycję, muszę wysłać wiadomość do iPhone'a.Jak wykryć pozycję zegarka Apple za pomocą akcelerometru i Gravity w szybkim tempie?

Dla mnie otrzymuję prawidłowe wartości Ale, To zawsze da wartości oparte na akcelerometrze. Co oznacza, że ​​użytkownik nie podnosi ręki, ale wartości akcelerometru są zgodne. Więc wartości będą wysyłane na telefon komórkowy.

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

Proszę wskazać mi, aby uzyskać wartości tylko wtedy, gdy użytkownik przechwycił pozycję.

+0

Wydaje się, że następujące informacje dotyczą Ciebie: https://forums.developer.apple.com/thread/3657 – fishinear

+0

Nie otrzymałem dokładnie Twojego pytania. Gdy użytkownik podniesie ręce i dotknie przycisku, przechowuje informacje o akcelerometrze. Czy chcesz porównać i dopasować informacje o akcelerometrze, jeśli użytkownik ponownie podniesie ręce? –

Odpowiedz

0

Accelerometers pomiaru zmian prędkości wzdłuż osi X, Y i Z osie

pobierania danych z akcelerometru

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

Ważne

Jeśli aplikacja opiera się na obecności akcelerometr sprzęt, skonfiguruj klucz UIRequiredDeviceCapabilities w pliku Info.plist z wartością akcelerometru. Aby uzyskać więcej informacji o znaczeniu tego klucza, zobacz Informacje o kluczach listy właściwości informacji.

+0

Dzięki za odpowiedź. Sprawdzę to i dam ci znać. – Sabs