2017-11-17 17 views
6

アップルウォッチ用のアプリケーションを作成しています。ロジックは、ユーザが手を上げてアプリからボタンをタップしたときのことです。その時、私は加速度計の値を取得します。そしてユーザーが自分の手を上げてキャプチャした位置を満たすたびに、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 
     } 
    } 

ユーザーが位置を取得したときにのみ値を取得するように案内してください。

+0

以下はあなたに当てはまると思われます:https://forums.developer.apple.com/thread/3657 – fishinear

+0

私は正確にあなたの質問を得ていません。ユーザーが手を上げてボタンをタップすると、加速度計情報が保存されます。あなたは、加速度計の情報を比較し、一致させたいのですか? –

答えて

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キーを加速度計の値で設定します。このキーの意味の詳細については、「情報プロパティーリストのキーリファレンス」を参照してください。

+0

返信いただきありがとうございます。私はこれを確認し、あなたに知らせます。 – Sabs

関連する問題