fun c locationManager (_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading), похоже, никогда не вызывается - PullRequest
0 голосов
/ 07 мая 2020

У меня есть

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 по-прежнему ничего не делает, как будто его никогда не вызывают.

1 Ответ

0 голосов
/ 08 мая 2020

Убедитесь, что вы установили делегата CLLocationManager?

Кстати, вам не нужны разрешения на расположение, если вам нужен только заголовок пользователя. Если вам нужно их фактическое местонахождение, вам нужно будет запросить соответствующую авторизацию и установить значения pList.

import CoreLocation
import UIKit

class ViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager = CLLocationManager()
        locationManager.delegate = self // <-- Make sure you have set this
        locationManager.startUpdatingHeading()
    }

    func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
        print(newHeading)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...