问题
I am working on a Swift playground and I am trying to use this code to get the device motion.
@objc func update()
{
    if let deviceMotion = motionManager.deviceMotion {
        print("Device Motion Yaw: \(deviceMotion.attitude.yaw)")
    }
}
However, it seems that device motion does not work on a Swift playground even though it works in iOS. How would I change a playground to support device motion? I am using an iPad running iOS 12 and the latest version of Swift Playgrounds and a Mac for the code. I know that the method gets called perfectly, and the code runs perfectly when I put it as part of an iOS app on both an iPad and an iPhone. How would I modify a playground to support this, as from my understanding it does not by default?
回答1:
It is entirely possible. I’ve done it on several occasions. You’ll need a CMMotionManager class. There are many ways to do this, but I would recommend using a timer. Here is some example code, taken from Apple’s developer documentation and modified to fit the question.
let motion = CMMotionManager()
func startDeviceMotion() {
    if motion.isDeviceMotionAvailable {
        //How often to push updates
        self.motion.deviceMotionUpdateInterval = 1.0/60.0
        self.motion.showsDeviceMovementDisplay = true
        self.motion.startDeviceMotionUpdates(using: .xMagneticNorthZVertical)
        // Configure a timer to fetch the motion data.
        self.timer = Timer(fire: Date(), interval: (1.0 / 60.0), repeats: true,
                           block: { (timer) in
                            if let data = self.motion.deviceMotion {      
let x = data.attitude.pitch
let y = data.attitude.roll
let z = data.attitude.yaw
//Use the data                                
                            }
        })
        RunLoop.current.add(self.timer!, forMode: RunLoop.Mode.default)
    }
}
startDeviceMotionUpdates()
Either do that or try something like this, also from the documentation
func startQueuedUpdates() {
   if motion.isDeviceMotionAvailable {       self.motion.deviceMotionUpdateInterval = 1.0 / 60.0
      self.motion.showsDeviceMovementDisplay = true
      self.motion.startDeviceMotionUpdates(using: .xMagneticNorthZVertical, 
               to: self.queue, withHandler: { (data, error) in
         // Make sure the data is valid before accessing it.
         if let validData = data {
            // Get the attitude relative to the magnetic north reference frame. 
            let roll = validData.attitude.roll
            let pitch = validData.attitude.pitch
            let yaw = validData.attitude.yaw
            // Use the motion data in your app.
         }
      })
   }
}
    来源:https://stackoverflow.com/questions/55294421/how-can-i-add-devicemotion-capabilities-to-a-swift-playground