2017-06-24 1 views

答えて

1

はい、CLLocationManagerを使用して、見出し更新の監視を開始することができます。

if CLLocationManager.headingAvailable() { 
     manager.headingFilter = 5 
     manager.startUpdatingHeading() 
} 

その後、CLLocationManagerのデリゲートは、経由でアップデートを見出し提供します:ここで

func locationManager(_ manager: CLLocationManager, 
        didUpdateHeading newHeading: CLHeading) 

30秒間見出しのデバイスを解決するための領域が終了し、試みに応答例迅速実装例であります。

import UIKit 
import CoreLocation 

class MyViewController: UIViewController { 

    /// Search for a heading for a specific amount of time after 
    /// a region update has occurred. 
    weak var timer: Timer? 

    /// Heading Direction 
    var currentHeading: CLLocationDirection? 

    lazy var manager: CLLocationManager = { 
     let manager = CLLocationManager() 
     manager.desiredAccuracy = kCLLocationAccuracyBest 
     manager.distanceFilter = kCLDistanceFilterNone 
     manager.delegate = self 
     manager.allowsBackgroundLocationUpdates = true 
     return manager 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if CLLocationManager.locationServicesEnabled() { 
      /// Turn on Location Services Under Settings 
     } 

     if CLLocationManager.authorizationStatus() == .notDetermined { 
      manager.requestAlwaysAuthorization() 
     } 
    } 

    func stopResolvingHeading() { 
     timer?.invalidate() 
     timer = nil 
     manager.stopUpdatingHeading() 
    } 
} 

extension MyViewController: CLLocationManagerDelegate { 

    func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) { 
     print("Exited Region = \(region.identifier) at \(Date())") 

     if CLLocationManager.headingAvailable() { 
      manager.headingFilter = 5 
      manager.startUpdatingHeading() 

      /// if timer is running, were still determining heading. You may 
      /// desire other functionality here. 

      if timer != nil { 
       return 
      } 

      timer = Timer.scheduledTimer(timeInterval: 30, 
             target: self, 
             selector: #selector(MyViewController.stopResolvingHeading), 
             userInfo: nil, repeats: false) 
     } 
    } 

    func locationManager(_ manager: CLLocationManager, 
         didUpdateHeading newHeading: CLHeading) { 

     guard newHeading.headingAccuracy > 0 else { 
      return 
     } 

     /// trueHeading = 0 is true north 
     /// trueHeading = 90 is due east, etc 
     /// trueHeading < 0 is invalid. All measured from top of device. 

     self.currentHeading = newHeading.trueHeading >= 0 ? newHeading.trueHeading : newHeading.magneticHeading 

     /// or radians (magnetic north) 
     // let headingDegrees = newHeading.magneticHeading * .pi/180.0 

     /// Trigger your Notification, Stop heading, update UI, etc.... 
    } 

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
     if status == .authorizedAlways { 
      /// Register Regions 
     } 
    } 

    /// ... other delegate methods ... 
} 
関連する問題