Поверните SCNNode на север без разрешения для отслеживания местоположения - PullRequest
3 голосов
/ 26 апреля 2019

Мы хотели бы повернуть SCNNode так, чтобы он совпадал с северным направлением.

Arkit позволяет выровнять свою ось z с севером, но для этого требуется разрешение пользователя для отслеживания местоположения, и мы не хотим его запрашивать. см сила тяжести и заголовок

Как следствие, мы пытаемся использовать свойство магнитного поля CMDeviceMotion. Но мы понятия не имеем, как это сделать. Вероятно, есть некоторые матричные вычисления, но мы их пока не осваиваем. см магнитное поле

Любая помощь будет принята с благодарностью! спасибо!

1 Ответ

0 голосов
/ 06 мая 2019

Вы не можете использовать отслеживание местоположения без разрешения пользователя .

Вот несколько советов о том, как правильно настроить его для приложений AR и NON-AR приложения :

В iOS 11 и более поздних версиях вот что вам нужно сделать, чтобы заставить работать местоположение:

  • Добавьте ключ к вашему info.plist и запросите авторизацию у менеджера местоположения, попросив его запустить.В info.plist есть два Property List Keys для авторизации местоположения. Требуется один или оба этих ключа .В приложениях NON-AR, если ни один из ключей не существует, вы можете вызвать метод startUpdatingLocation, но диспетчер местоположений фактически не запустится.Он также не отправит сообщение об ошибке делегату (так как он никогда не запускался, он не может потерпеть неудачу). Сбой также произойдет, если вы добавите один или оба ключа, но забудете явно запросить авторизацию .

Используйте эти два Property List Keys в info.plist файл.Они используются с момента выхода iOS 11 :

<key>NSLocationWhenInUseUsageDescription</key>
  <string>App needs an access to your location (in foreground)</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
  <string>App needs an access to your location (in background)</string>

И эти два Property List Keys были устаревшими ранее ( НЕ ИСПОЛЬЗОВАТЬЭТИ КЛЮЧИ ):

    <key>NSLocationUsageDescription</key>
      <string>App needs an access to your location (in background)</string>

    <key>NSLocationAlwaysUsageDescription</key>
      <true/>

Вот как должен выглядеть ваш код для приложений AR :

let configuration = ARWorldTrackingConfiguration()

func session(_ session: ARSession, didFailWithError error: Error) {

    switch error.code {
    case 101:
        configuration.worldAlignment = .gravity
        restartSession()
    default:
        configuration.worldAlignment = .gravityAndHeading
        restartSession()
    }
}   
func restartSession() {    
    self.sceneView.session.pause()
    self.sceneView.session.run(configuration, options: [.resetTracking, 
                                                        .removeExistingAnchors])
}

Для приложений без поддержки ARиспользуйте эти два метода экземпляра: requestAlwaysAuthorization() (запрашивает разрешение на использование служб определения местоположения, когда приложение работает) и requestWhenInUseAuthorization() (запрашивает разрешение на использование служб определения местоположения, когда приложение находится на переднем плане).

Вот какВаш код для приложений без AR должен выглядеть следующим образом:

import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager = CLLocationManager()

    func updateMyLocation() {

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers

        if locationManager.respondsToSelector(#selector(CLLocationManager.requestWhenInUseAuthorization)) {
            locationManager.requestWhenInUseAuthorization()
        } else {
            locationManager.startUpdatingLocation()
        }
    }
}

Кроме того, вы можете запросить Always Authorization:

let locationManager = CLLocationManager()   

func enableLocationServices() {

    locationManager.delegate = self

    switch CLLocationManager.authorizationStatus() {

        case .notDetermined:
            // Request when-in-use authorization initially
            locationManager.requestWhenInUseAuthorization()
            break

        case .restricted, .denied:
            // Disable location features
            disableMyLocationBasedFeatures()
            break

        case .authorizedWhenInUse:
            // Enable basic location features
            enableMyWhenInUseFeatures()
            break

        case .authorizedAlways:
            // Enable any of your app's location features
            enableMyAlwaysFeatures()
            break
    }      
}

Надеюсь, это поможет.

...