У меня есть
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
Я также помещаю все в plist, который начинается с того, что службы определения местоположения конфиденциальности включены.
Когда я проверяю
if CLLocationManager.headingAvailable()
это возвращает true, но этот метод никогда не вызывается. Ничего не происходит.
Вот мой полный код. Прямо сейчас это беспорядок от попытки протестировать его.
import UIKit
import SceneKit
import CoreLocation
class GameViewController: UIViewController, CLLocationManagerDelegate {
var locationManager:CLLocationManager!
var angle = 0.0
var rotate = SCNAction.rotate(by: 0.0, around: SCNVector3(0, 1, 0), duration: 0.5)
override func viewDidLoad() {
super.viewDidLoad()
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
let scene = SCNScene(named: "art.scnassets/CompassObject2 copy.scn")
let compassNode = scene?.rootNode.childNodes[0]
compassNode?.position = SCNVector3(x:0, y:0, z: 0)
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene?.rootNode.addChildNode(cameraNode)
cameraNode.position = SCNVector3(x:0, y:50, z:-5)
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light?.type = .omni
lightNode.light?.intensity = 100000
lightNode.position = SCNVector3(x:0, y:150, z: 0)
scene?.rootNode.addChildNode(lightNode)
//let origin = SCNNode()
//origin.position = SCNVector3(x:0, y:0, z: 0)
let lookAt = SCNLookAtConstraint(target: compassNode)
lookAt.isGimbalLockEnabled = true
cameraNode.constraints = [lookAt]
_ = scene?.rootNode.childNode
let scnView = self.view as! SCNView
scnView.scene = scene
scnView.allowsCameraControl = false
scnView.backgroundColor = UIColor.black
//print(compassNode?.position as Any)
if CLLocationManager.locationServicesEnabled() {
print("yes")
}
else {
print("no")
}
/*if CLLocationManager.headingAvailable() {
scnView.backgroundColor = UIColor.blue
print("yes")
}
else {
print("no")
}*/
if angle != 0.0 {
scnView.backgroundColor = UIColor.green
}
compassNode?.runAction(rotate)
}
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
//UIView.animate(withDuration: 0.5) {
self.angle = newHeading.trueHeading.toRadians
self.rotate = SCNAction.rotate(by: CGFloat(self.angle), around: SCNVector3(0, 1, 0), duration: 0.5)
//}
}
/* func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
exit(0)
}*/
func locationManagerShouldDisplayHeadingCalibration(_ manager: CLLocationManager) -> Bool {
return true
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations newLocation: CLLocation) {
print(newLocation)
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
print("delegate works")
}
}
extension Double {
var toRadians: Double { return self * .pi / 180 }
}
Кажется, что делегат действительно работает, потому что забавная c проверка статуса авторизации печатает «делегат работает», но другие функции, самое главное, didUpdateHeading по-прежнему ничего не делает, как будто его никогда не вызывают.