0
は、私は私がこれが起こるしたいわけそれに基づいた特定の通知...CLRegionをトリガーした後に見出し/コースを監視することは可能ですか?この地域を出たユーザーが北や南に行くとされている場合トリガー: - - モニター出地域 2領域が発生したときに、私が知りたいのですが、EX</p> <p>1:
は、私は私がこれが起こるしたいわけそれに基づいた特定の通知...CLRegionをトリガーした後に見出し/コースを監視することは可能ですか?この地域を出たユーザーが北や南に行くとされている場合トリガー: - - モニター出地域 2領域が発生したときに、私が知りたいのですが、EX</p> <p>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 ...
}