diff --git a/GeoTrackKit/Core/Map/GeoTrackMap.swift b/GeoTrackKit/Core/Map/GeoTrackMap.swift index d058404..8adcfbc 100644 --- a/GeoTrackKit/Core/Map/GeoTrackMap.swift +++ b/GeoTrackKit/Core/Map/GeoTrackMap.swift @@ -9,10 +9,15 @@ import MapKit import CoreLocation -/// This class provides you an easy way to visualize your track on a map. You can configure the unknown, ascent and descent colors. They have sensible defaults. Using the UIGeoTrack model, you can set which legs of your track are visible and we'll render them accordingly. Keep in mind, performance of this control may degrade if your tracks have too many points. +/// This class provides you an easy way to visualize your track on a map. +/// You can configure the unknown, ascent and descent colors. They have sensible +/// defaults. Using the UIGeoTrack model, you can set which legs of your track +/// are visible and we'll render them accordingly. Keep in mind, performance of +/// this control may degrade if your tracks have too many points. public class GeoTrackMap: MKMapView { - /// The color to use when rendering a leg of unknown direction (could be flat, or we just don't have enough altitude change to tell if it's an ascent or descent) + /// The color to use when rendering a leg of unknown direction (could be flat, + /// or we just don't have enough altitude change to tell if it's an ascent or descent) public var unknownColor: UIColor = .yellow /// The color to use when rendering an ascent @@ -21,6 +26,16 @@ public class GeoTrackMap: MKMapView { /// The color to use when rendering a descent public var descentColor: UIColor = .blue + /// Shows the points on the map if you set it to true + public var showPoints = false { + didSet { + removeAnnotations(annotations) + if showPoints { + addAnnotations(buildAnnotations()) + } + } + } + /// The Zoom Delegate: which tells us if / where to zoom to public var zoomDelegate: ZoomDefining? // swiftlint:disable:previous weak_delegate @@ -98,20 +113,51 @@ extension GeoTrackMap: MKMapViewDelegate { switch direction { case .downward: renderer.strokeColor = descentColor + case .upward: renderer.strokeColor = ascentColor + default: break } return renderer } + + public func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { + guard let annotation = view.annotation as? PointAnnotation else { + return + } + NotificationCenter.default.post(name: Notification.Name.GeoTrackKit.selectedAnnotationPoint, object: annotation) + } +} + +// MARK: - Implementation + +private extension GeoTrackMap { + + /// Builds the annotations and returns them to you. + /// + /// - Returns: an array of annotations for each point in the track + func buildAnnotations() -> [MKAnnotation] { + var annotations = [MKAnnotation]() + guard let track = model?.track else { + return annotations + } + + for index in 0.. + NSCameraUsageDescription + Your camera can be used for an AR experience CFBundleDevelopmentRegion en CFBundleDisplayName diff --git a/GeoTrackKitExample/GeoTrackKitExample/Services/TrackService.swift b/GeoTrackKitExample/GeoTrackKitExample/Services/TrackService.swift index abb9b5a..d671efd 100644 --- a/GeoTrackKitExample/GeoTrackKitExample/Services/TrackService.swift +++ b/GeoTrackKitExample/GeoTrackKitExample/Services/TrackService.swift @@ -19,7 +19,6 @@ class TrackService { return documentFiles(withExtension: ".track") } - /// Saves the provided track to the user's documents folder. /// /// - Parameter track: the track to be saved. @@ -43,6 +42,23 @@ class TrackService { print("ERROR trying to save track: \(error.localizedDescription)") } } + + /// Renames the provided fileUrl to the provided string (and adds a `.track` + /// suffix if necessary) + /// + /// - Parameters: + /// - url: The File URL to be renamed. + /// - to: The name of the file to rename to. + func rename(fileUrl url: URL, to newName: String) { + let name = newName.lowercased().hasSuffix(".track") ? newName : newName + ".track" + let newFile = URL(fileURLWithPath: name, relativeTo: url.deletingLastPathComponent()) + + do { + try FileManager.default.moveItem(at: url, to: newFile) + } catch { + print("ERROR trying to move file from \(url.lastPathComponent) to \(newFile.lastPathComponent)") + } + } } // MARK: - Implementation @@ -72,7 +88,7 @@ extension TrackService { } /// Gives you back all of the files that match the provided extension (ends with, - /// case-insensitive). + /// case-insensitive). The files are sorted by their creation date, descending. /// /// - Parameter fileExtension: The file extension that you want files for. /// - Returns: The list of files matching your extension, or in the case of an @@ -83,10 +99,27 @@ extension TrackService { } do { - let allFiles = try FileManager.default.contentsOfDirectory(at: documentsFolder, includingPropertiesForKeys: nil, options: .skipsHiddenFiles) - return allFiles.filter { fileUrl in - return fileUrl.absoluteString.lowercased().hasSuffix(fileExtension.lowercased()) + let properties: [URLResourceKey] = [.localizedNameKey, .creationDateKey, + .contentModificationDateKey, .localizedTypeDescriptionKey] + let allFiles = try FileManager.default.contentsOfDirectory(at: documentsFolder, includingPropertiesForKeys: properties, options: [.skipsHiddenFiles]) + + var urlDictionary = [URL: Date]() + + for url in allFiles { + guard let dict = try? url.resourceValues(forKeys: Set(properties)), + let creationDate = dict.creationDate else { + continue + } + guard url.absoluteString.lowercased().hasSuffix(fileExtension.lowercased()) else { + continue + } + urlDictionary[url] = creationDate } + + return urlDictionary.sorted(by: { (first, second) -> Bool in + return first.value > second.value + }).map({ $0.key }) + } catch { print("ERROR: \(error.localizedDescription)") return nil diff --git a/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/ARCL.storyboard b/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/ARCL.storyboard new file mode 100644 index 0000000..a1f3b89 --- /dev/null +++ b/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/ARCL.storyboard @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/ARCLViewController.swift b/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/ARCLViewController.swift new file mode 100644 index 0000000..078c649 --- /dev/null +++ b/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/ARCLViewController.swift @@ -0,0 +1,318 @@ +// +// ARCLViewController.swift +// GeoTrackKitExample +// +// Created by Eric Internicola on 2/7/19. +// Copyright © 2019 Eric Internicola. All rights reserved. +// + + +import ARCL +import ARKit +import CoreLocation +import GeoTrackKit +import SceneKit +import UIKit + +class ARCLViewController: UIViewController { + + struct Config { + static let numberOfNodesToShow = 5 + static let distanceToAdvanceToNextPoint: CLLocationDistance = 10 + } + + @IBOutlet weak var sceneView: SceneLocationView! + @IBOutlet weak var infoLabel: UILabel! + @IBOutlet weak var mapView: GeoTrackMap! + + var track: GeoTrack? + var selectedNode: LocationNode? + + var displayDebugging = false + var adjustNorthByTappingSidesOfScreen = true + var updateInfoLabelTimer: Timer? + var nodes = [LocationNode]() + + /// The index of the current node: + var index: Int? + + override func viewDidLoad() { + super.viewDidLoad() + + configureARCL() + + if let track = track { + mapView.model = UIGeoTrack(with: track) + mapView.showsUserLocation = true + mapView.showPoints = true + } + NotificationCenter.default.addObserver(self, selector: #selector(selectedAnnotationPoint(_:)), name: Notification.Name.GeoTrackKit.selectedAnnotationPoint, object: nil) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + sceneView.run() + updateInfoLabelTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(updateInfoLabel), userInfo: nil, repeats: true) + } + + override func viewWillDisappear(_ animated: Bool) { + updateInfoLabelTimer?.invalidate() + sceneView.pause() + super.viewWillDisappear(animated) + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + super.touchesBegan(touches, with: event) + + guard let touch = touches.first else { + return + } + + let location = touch.location(in: sceneView) + + if location.x <= 40 && adjustNorthByTappingSidesOfScreen { + print("left side of the screen") + sceneView.moveSceneHeadingAntiClockwise() + } else if location.x >= view.frame.size.width - 40 && adjustNorthByTappingSidesOfScreen { + print("right side of the screen") + sceneView.moveSceneHeadingClockwise() + } + } + +} + +// MARK: - Notification Handlers + +extension ARCLViewController { + + @objc + func selectedAnnotationPoint(_ notification: NSNotification) { + guard let annotation = notification.object as? PointAnnotation else { + return assertionFailure("no object, or wrong object type") + } + for node in nodes where node.location.coordinate.latitude == annotation.coordinate.latitude && node.location.coordinate.longitude == annotation.coordinate.longitude { + select(node: node) + break + } + } + +} + +// MARK: - SceneLocationViewDelegate + +@available(iOS 11.0, *) +extension ARCLViewController: SceneLocationViewDelegate { + + func sceneLocationViewDidAddSceneLocationEstimate(sceneLocationView: SceneLocationView, position: SCNVector3, location: CLLocation) { + + } + + func sceneLocationViewDidRemoveSceneLocationEstimate(sceneLocationView: SceneLocationView, position: SCNVector3, location: CLLocation) { + + } + + func sceneLocationViewDidConfirmLocationOfNode(sceneLocationView: SceneLocationView, node: LocationNode) { + print("sceneLocationViewDidConfirmLocationOfNode: \(node)") + } + + func sceneLocationViewDidSetupSceneNode(sceneLocationView: SceneLocationView, sceneNode: SCNNode) { + print("sceneLocationViewDidSetupSceneNode: \(sceneNode)") + } + + func sceneLocationViewDidUpdateLocationAndScaleOfLocationNode(sceneLocationView: SceneLocationView, locationNode: LocationNode) { + // print("sceneLocationViewDidUpdateLocationAndScaleOfLocationNode: \(locationNode)") + } +} + +// MARK: - Implementation + +extension ARCLViewController { + + /// Sorts the nodes by their distance from the provided location (ascending). + /// + /// - Parameter location: The location you want closest order to. + /// - Returns: An array of LocationNodes, sorted by their distance to the provided location. + func closestNodes(to location: CLLocation) -> [LocationNode] { + return nodes.sorted { first, second -> Bool in + return first.location.distance(from: location) < second.location.distance(from: location) + } + } + + /// Gets you the index of the closest node in the array of nodes. + /// + /// - Parameter location: The location you want the closest node index to. + /// - Returns: The index in the nodes of the closest node. + func indexOfClosest(to location: CLLocation) -> Int? { + guard let closest = closestNodes(to: location).first else { + return nil + } + + for index in 0.. [LocationNode]? { + guard let track = track, track.points.count > 0 else { + return nil + } + + var nodes = [LocationNode]() + + for index in 0.. ArrowLocationNode { + let node = ArrowLocationNode(location: location) + guard let arrow = node.loadArrowModel() else { + assertionFailure("Failed to load the arrow model") + return node + } + node.addChildNode(arrow) + node.showDeselected() + + return node + } +} + +// MARK: - API + +extension ArrowLocationNode { + + /// Performs a rotation of this node to point at the provided node. + /// + /// - Parameter node: The node that this node should be pointing at. + func look(at node: LocationNode) { + look(at: node.position, up: SCNVector3.yAxisUp, localFront: SCNVector3.yAxisUp) + } + + /// Renders the node as selected + func showSelected() { + guard let arrow = childNodes.filter({ $0.name == "arrow" }).first else { + return + } + for childNode in arrow.childNodes { + childNode.geometry?.materials = [Constants.selectedMaterial, Constants.metalness, Constants.roughness] + } + } + + /// Renders the node as deselected + func showDeselected() { + guard let arrow = childNodes.filter({ $0.name == "arrow" }).first else { + return + } + for childNode in arrow.childNodes { + childNode.geometry?.materials = [Constants.deselectedMaterial, Constants.metalness, Constants.roughness] + } + } + +} + +// MARK: - Implementation + +private extension ArrowLocationNode { + + struct Constants { + static let deselectedMaterial = SCNMaterial.diffuse(fromColor: .red) + static let selectedMaterial = SCNMaterial.diffuse(fromColor: .blue) + static let metalness = SCNMaterial.metalness(fromFloat: 0.5) + static let roughness = SCNMaterial.roughness(fromFloat: 0.5) + } + + /// Loads the arrow model from the arrow scene. + /// + /// - Returns: The arrow node from the arrow scene. + func loadArrowModel() -> SCNNode? { + guard let scene = SCNScene(named: "example.scnassets/arrow.scn") else { + return nil + } + + return scene.rootNode.childNodes.filter({ $0.name == "arrow" }).first + } + +} + +extension SCNMaterial { + + class func diffuse(fromColor color: UIColor) -> SCNMaterial { + let material = SCNMaterial() + material.diffuse.contents = color + return material + } + + class func metalness(fromFloat value: Float) -> SCNMaterial { + let material = SCNMaterial() + material.metalness.contents = value + return material + } + + class func roughness(fromFloat value: Float) -> SCNMaterial { + let material = SCNMaterial() + material.roughness.contents = value + return material + } + +} + +// MARK: - Math Extensions + +extension SCNVector3 { + + static let yAxisUp = SCNVector3(0, 1, 0) + +} + + +extension Int { + + var radians: CGFloat { + return CGFloat(self) * .pi / 180 + } + +} + +extension Float { + + var radians: Float { + return self * .pi / 180 + } +} + + +extension CGFloat { + + var float: Float { + return Float(self) + } + +} diff --git a/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/EndpointLocationNode.swift b/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/EndpointLocationNode.swift new file mode 100644 index 0000000..eea1b40 --- /dev/null +++ b/GeoTrackKitExample/GeoTrackKitExample/Views/ARCL/EndpointLocationNode.swift @@ -0,0 +1,89 @@ +// +// EndpointLocationNode.swift +// GeoTrackKitExample +// +// Created by Eric Internicola on 2/13/19. +// Copyright © 2019 Eric Internicola. All rights reserved. +// + +import ARCL +import CoreLocation +import SceneKit +import UIKit + +class EndpointLocationNode: LocationNode { + + /// Factory creation function for the EndpointLocationNode. It creates the object and adds + /// the scenekit children for you and renders it ass you specify (start / end). + /// + /// - Parameters: + /// - location: The real world location for the point. + /// - isStart: Is this a start point? True = start, False = end. + /// - Returns: A fully configured EndpointLocationNode object. + class func build(fromLocation location: CLLocation?, isStart: Bool = true) -> EndpointLocationNode { + let node = EndpointLocationNode(location: location) + guard let arrow = node.loadEndpointModel() else { + assertionFailure("Failed to load the arrow model") + return node + } + node.addChildNode(arrow) + + if isStart { + node.showStart() + } else { + node.showEnd() + } + + return node + } +} + +// MARK: - API + +extension EndpointLocationNode { + + /// Renders the node as selected + func showStart() { + guard let arrow = childNodes.filter({ $0.name == "endpoint" }).first else { + return + } + for childNode in arrow.childNodes { + childNode.geometry?.materials = [Constants.startMaterial, Constants.metalness, Constants.roughness] + } + } + + /// Renders the node as deselected + func showEnd() { + guard let arrow = childNodes.filter({ $0.name == "endpoint" }).first else { + return + } + for childNode in arrow.childNodes { + childNode.geometry?.materials = [Constants.endMaterial, Constants.metalness, Constants.roughness] + } + } + +} + +// MARK: - Implementation + +private extension EndpointLocationNode { + + struct Constants { + static let startMaterial = SCNMaterial.diffuse(fromColor: .green) + static let endMaterial = SCNMaterial.diffuse(fromColor: .red) + static let metalness = SCNMaterial.metalness(fromFloat: 0.5) + static let roughness = SCNMaterial.roughness(fromFloat: 0.5) + } + + /// Loads the arrow model from the arrow scene. + /// + /// - Returns: The arrow node from the arrow scene. + func loadEndpointModel() -> SCNNode? { + guard let scene = SCNScene(named: "example.scnassets/endpoint.scn") else { + return nil + } + + return scene.rootNode.childNodes.filter({ $0.name == "endpoint" }).first + } + +} diff --git a/GeoTrackKitExample/GeoTrackKitExample/Views/ReferenceTrack/TrackMapViewController.swift b/GeoTrackKitExample/GeoTrackKitExample/Views/ReferenceTrack/TrackMapViewController.swift index 5d25a96..d92d5c0 100644 --- a/GeoTrackKitExample/GeoTrackKitExample/Views/ReferenceTrack/TrackMapViewController.swift +++ b/GeoTrackKitExample/GeoTrackKitExample/Views/ReferenceTrack/TrackMapViewController.swift @@ -27,6 +27,14 @@ class TrackMapViewController: UIViewController { var tableVC: TrackOverviewTableViewController? + /// Gives you back a track that contains only points with a horizontal accuracy that's less than 10 meters + var cleanedTrack: GeoTrack? { + guard let track = model?.track else { + return nil + } + return GeoTrack(points: track.points.filter({ $0.horizontalAccuracy < 10 }), name: track.name, description: track.description) + } + override func viewDidLoad() { super.viewDidLoad() @@ -40,7 +48,9 @@ class TrackMapViewController: UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(legVisiblityChanged(_:)), name: Notification.Name.GeoMapping.legVisibilityChanged, object: nil) - modelUpdated() + DispatchQueue.main.async { + self.modelUpdated() + } } /// Loads this view from a storyboard. @@ -52,13 +62,17 @@ class TrackMapViewController: UIViewController { trackVC.useDemoTrack = useDemoTrack return trackVC } - } // MARK: - User Actions extension TrackMapViewController { + @IBAction + func tappedAR(_ source: Any) { + showARViewController() + } + @IBAction func tappedShare(_ source: Any) { showShareOptions() @@ -176,6 +190,15 @@ private extension TrackMapViewController { present(dialog, animated: true) } + /// Creates the AR VC and navigates to it. + func showARViewController() { + guard let arVC = UIStoryboard(name: "ARCL", bundle: nil).instantiateInitialViewController() as? ARCLViewController else { + return assertionFailure("Failed to create ARVC") + } + arVC.track = cleanedTrack + navigationController?.pushViewController(arVC, animated: true) + } + /// Shares the track as a GPX file func shareGPX() { guard let trackWrittenToGpxFile = trackWrittenToGpxFile else { diff --git a/GeoTrackKitExample/GeoTrackKitExample/Views/ReferenceTrack/TrackView.storyboard b/GeoTrackKitExample/GeoTrackKitExample/Views/ReferenceTrack/TrackView.storyboard index ffe3a17..736ea68 100644 --- a/GeoTrackKitExample/GeoTrackKitExample/Views/ReferenceTrack/TrackView.storyboard +++ b/GeoTrackKitExample/GeoTrackKitExample/Views/ReferenceTrack/TrackView.storyboard @@ -45,6 +45,11 @@ + + + + + @@ -114,7 +119,7 @@ - + diff --git a/GeoTrackKitExample/GeoTrackKitExample/Views/TrackList/TrackListTableViewController.swift b/GeoTrackKitExample/GeoTrackKitExample/Views/TrackList/TrackListTableViewController.swift index b7817ed..2ff74fd 100644 --- a/GeoTrackKitExample/GeoTrackKitExample/Views/TrackList/TrackListTableViewController.swift +++ b/GeoTrackKitExample/GeoTrackKitExample/Views/TrackList/TrackListTableViewController.swift @@ -65,9 +65,24 @@ class TrackListTableViewController: UITableViewController { navigationController?.pushViewController(mapVC, animated: true) } + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { + return true + } + + override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { + return [ + UITableViewRowAction(style: .normal, title: "Rename") { _, indexPath in + self.showRename(for: indexPath) + } + ] + } + @IBAction func didPullToRefresh(_ source: UIRefreshControl) { updateTrackList() + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in + self?.refreshControl?.endRefreshing() + } } } @@ -76,6 +91,41 @@ class TrackListTableViewController: UITableViewController { extension TrackListTableViewController { + func showRename(for indexPath: IndexPath) { + guard let tracks = tracks, indexPath.row < tracks.count else { + return + } + let track = tracks[indexPath.row] + + let inputController = UIAlertController(title: "Rename", message: "Enter the new name for the track file", preferredStyle: .alert) + + inputController.addTextField { textField in + textField.text = track.filenameNoExtension + textField.autocapitalizationType = .words + textField.spellCheckingType = .yes + textField.clearButtonMode = .always + } + + inputController.addAction( + UIAlertAction(title: "OK", style: .default) { _ in + guard let textField = inputController.textFields?.first, + let filename = textField.text, + !filename.isEmpty else { + return + } + + TrackService.shared.rename(fileUrl: track, to: filename) + self.updateTrackList() + inputController.dismiss(animated: true, completion: nil) + } + ) + inputController.addAction(UIAlertAction(title: "Cancel", style: .cancel)) + + + + present(inputController, animated: true, completion: nil) + } + func updateTrackList() { tracks = TrackService.shared.trackFiles tableView.reloadData() @@ -100,7 +150,15 @@ extension TrackListTableViewController { class TrackCell: UITableViewCell { var track: URL? { didSet { - textLabel?.text = track?.lastPathComponent.removingPercentEncoding + textLabel?.text = track?.filenameNoExtension } } } + +extension URL { + + var filenameNoExtension: String? { + return lastPathComponent.removingPercentEncoding?.replacingOccurrences(of: ".track", with: "") + } + +} diff --git a/GeoTrackKitExample/GeoTrackKitExample/example.scnassets/arrow.scn b/GeoTrackKitExample/GeoTrackKitExample/example.scnassets/arrow.scn new file mode 100644 index 0000000..3c6e6e1 Binary files /dev/null and b/GeoTrackKitExample/GeoTrackKitExample/example.scnassets/arrow.scn differ diff --git a/GeoTrackKitExample/GeoTrackKitExample/example.scnassets/endpoint.scn b/GeoTrackKitExample/GeoTrackKitExample/example.scnassets/endpoint.scn new file mode 100644 index 0000000..95c427e Binary files /dev/null and b/GeoTrackKitExample/GeoTrackKitExample/example.scnassets/endpoint.scn differ diff --git a/GeoTrackKitExample/Podfile b/GeoTrackKitExample/Podfile index 0d4b3ba..87e68ef 100644 --- a/GeoTrackKitExample/Podfile +++ b/GeoTrackKitExample/Podfile @@ -9,6 +9,9 @@ target 'GeoTrackKitExample' do # Pods for GeoTrackKitExample pod 'GeoTrackKit', :subspecs => ['HealthKit'], :path => '..' + # 3rd party pods + pod 'ARCL' + target 'GeoTrackKitExampleTests' do inherit! :search_paths end diff --git a/GeoTrackKitExample/Podfile.lock b/GeoTrackKitExample/Podfile.lock index 59a0d49..7969634 100644 --- a/GeoTrackKitExample/Podfile.lock +++ b/GeoTrackKitExample/Podfile.lock @@ -1,18 +1,25 @@ PODS: + - ARCL (1.0.4) - GeoTrackKit/Core (0.4.2) - GeoTrackKit/HealthKit (0.4.2): - GeoTrackKit/Core DEPENDENCIES: + - ARCL - GeoTrackKit/HealthKit (from `..`) +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - ARCL + EXTERNAL SOURCES: GeoTrackKit: :path: ".." SPEC CHECKSUMS: + ARCL: 5fd2b0d7aabf91f15dbc0e8c510b25516b8a755a GeoTrackKit: 16113ae65bd458be0255a0d8270a8190ee4397a2 -PODFILE CHECKSUM: 6b6b15c8571da71adf29321de0604cdf6ea5756a +PODFILE CHECKSUM: e0a4cfa4a33435544a2817e2a6b27cbcbca4a1d9 COCOAPODS: 1.5.3 diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/CGPoint+Extensions.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/CGPoint+Extensions.swift new file mode 100644 index 0000000..48d9ccc --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/CGPoint+Extensions.swift @@ -0,0 +1,24 @@ +// +// CGPoint+Extensions.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 03/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import UIKit +import SceneKit + +extension CGPoint { + static func pointWithVector(vector: SCNVector3) -> CGPoint { + return CGPoint(x: CGFloat(vector.x), y: CGFloat(0 - vector.z)) + } + + func radiusContainsPoint(radius: CGFloat, point: CGPoint) -> Bool { + let x = pow(point.x - self.x, 2) + let y = pow(point.y - self.y, 2) + let radiusSquared = pow(radius, 2) + + return x + y <= radiusSquared + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/CLLocation+Extensions.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/CLLocation+Extensions.swift new file mode 100644 index 0000000..6eb226c --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/CLLocation+Extensions.swift @@ -0,0 +1,104 @@ +// +// CLLocation+Extensions.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 02/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import Foundation +import CoreLocation + +///Translation in meters between 2 locations +public struct LocationTranslation { + public var latitudeTranslation: Double + public var longitudeTranslation: Double + public var altitudeTranslation: Double + + public init(latitudeTranslation: Double, longitudeTranslation: Double, altitudeTranslation: Double) { + self.latitudeTranslation = latitudeTranslation + self.longitudeTranslation = longitudeTranslation + self.altitudeTranslation = altitudeTranslation + } +} + +public extension CLLocation { + public convenience init(coordinate: CLLocationCoordinate2D, altitude: CLLocationDistance) { + self.init(coordinate: coordinate, altitude: altitude, horizontalAccuracy: 0, verticalAccuracy: 0, timestamp: Date()) + } + + ///Translates distance in meters between two locations. + ///Returns the result as the distance in latitude and distance in longitude. + public func translation(toLocation location: CLLocation) -> LocationTranslation { + let inbetweenLocation = CLLocation(latitude: self.coordinate.latitude, longitude: location.coordinate.longitude) + + let distanceLatitude = location.distance(from: inbetweenLocation) + + let latitudeTranslation: Double + + if location.coordinate.latitude > inbetweenLocation.coordinate.latitude { + latitudeTranslation = distanceLatitude + } else { + latitudeTranslation = 0 - distanceLatitude + } + + let distanceLongitude = self.distance(from: inbetweenLocation) + + let longitudeTranslation: Double + + if self.coordinate.longitude > inbetweenLocation.coordinate.longitude { + longitudeTranslation = 0 - distanceLongitude + } else { + longitudeTranslation = distanceLongitude + } + + let altitudeTranslation = location.altitude - self.altitude + + return LocationTranslation( + latitudeTranslation: latitudeTranslation, + longitudeTranslation: longitudeTranslation, + altitudeTranslation: altitudeTranslation) + } + + public func translatedLocation(with translation: LocationTranslation) -> CLLocation { + let latitudeCoordinate = self.coordinate.coordinateWithBearing(bearing: 0, distanceMeters: translation.latitudeTranslation) + + let longitudeCoordinate = self.coordinate.coordinateWithBearing(bearing: 90, distanceMeters: translation.longitudeTranslation) + + let coordinate = CLLocationCoordinate2D( + latitude: latitudeCoordinate.latitude, + longitude: longitudeCoordinate.longitude) + + let altitude = self.altitude + translation.altitudeTranslation + + return CLLocation(coordinate: coordinate, altitude: altitude, horizontalAccuracy: self.horizontalAccuracy, verticalAccuracy: self.verticalAccuracy, timestamp: self.timestamp) + } +} + +extension Double { + func metersToLatitude() -> Double { + return self / (6360500.0) + } + + func metersToLongitude() -> Double { + return self / (5602900.0) + } +} + +public extension CLLocationCoordinate2D { + public func coordinateWithBearing(bearing: Double, distanceMeters: Double) -> CLLocationCoordinate2D { + //The numbers for earth radius may be _off_ here + //but this gives a reasonably accurate result.. + //Any correction here is welcome. + let distRadiansLat = distanceMeters.metersToLatitude() // earth radius in meters latitude + let distRadiansLong = distanceMeters.metersToLongitude() // earth radius in meters longitude + + let lat1 = self.latitude * Double.pi / 180 + let lon1 = self.longitude * Double.pi / 180 + + let lat2 = asin(sin(lat1) * cos(distRadiansLat) + cos(lat1) * sin(distRadiansLat) * cos(bearing)) + let lon2 = lon1 + atan2(sin(bearing) * sin(distRadiansLong) * cos(lat1), cos(distRadiansLong) - sin(lat1) * sin(lat2)) + + return CLLocationCoordinate2D(latitude: lat2 * 180 / Double.pi, longitude: lon2 * 180 / Double.pi) + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/FloatingPoint+Radians.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/FloatingPoint+Radians.swift new file mode 100644 index 0000000..6b3d4c0 --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/FloatingPoint+Radians.swift @@ -0,0 +1,14 @@ +// +// FloatingPoint+Radians.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 03/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import Foundation + +public extension FloatingPoint { + public var degreesToRadians: Self { return self * .pi / 180 } + public var radiansToDegrees: Self { return self * 180 / .pi } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/LocationManager.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/LocationManager.swift new file mode 100644 index 0000000..3851df2 --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/LocationManager.swift @@ -0,0 +1,89 @@ +// +// LocationManager.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 02/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import Foundation +import CoreLocation + +protocol LocationManagerDelegate: class { + func locationManagerDidUpdateLocation(_ locationManager: LocationManager, location: CLLocation) + func locationManagerDidUpdateHeading(_ locationManager: LocationManager, heading: CLLocationDirection, accuracy: CLLocationDirection) +} + +///Handles retrieving the location and heading from CoreLocation +///Does not contain anything related to ARKit or advanced location +public class LocationManager: NSObject, CLLocationManagerDelegate { + weak var delegate: LocationManagerDelegate? + + private var locationManager: CLLocationManager? + + var currentLocation: CLLocation? + + private(set) public var heading: CLLocationDirection? + private(set) public var headingAccuracy: CLLocationDegrees? + + override init() { + super.init() + + self.locationManager = CLLocationManager() + self.locationManager!.desiredAccuracy = kCLLocationAccuracyBestForNavigation + self.locationManager!.distanceFilter = kCLDistanceFilterNone + self.locationManager!.headingFilter = kCLHeadingFilterNone + self.locationManager!.pausesLocationUpdatesAutomatically = false + self.locationManager!.delegate = self + self.locationManager!.startUpdatingHeading() + self.locationManager!.startUpdatingLocation() + + self.locationManager!.requestWhenInUseAuthorization() + + self.currentLocation = self.locationManager!.location + } + + func requestAuthorization() { + if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways || + CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse { + return + } + + if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.denied || + CLLocationManager.authorizationStatus() == CLAuthorizationStatus.restricted { + return + } + + self.locationManager?.requestWhenInUseAuthorization() + } + + // MARK: - CLLocationManagerDelegate + + public func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + + } + + public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + for location in locations { + self.delegate?.locationManagerDidUpdateLocation(self, location: location) + } + + self.currentLocation = manager.location + } + + public func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) { + if newHeading.headingAccuracy >= 0 { + self.heading = newHeading.trueHeading + } else { + self.heading = newHeading.magneticHeading + } + + self.headingAccuracy = newHeading.headingAccuracy + + self.delegate?.locationManagerDidUpdateHeading(self, heading: self.heading!, accuracy: newHeading.headingAccuracy) + } + + public func locationManagerShouldDisplayHeadingCalibration(_ manager: CLLocationManager) -> Bool { + return true + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/LocationNode.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/LocationNode.swift new file mode 100644 index 0000000..426c4fb --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/LocationNode.swift @@ -0,0 +1,96 @@ +// +// LocationNode.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 02/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import Foundation +import SceneKit +import CoreLocation + +///A location node can be added to a scene using a coordinate. +///Its scale and position should not be adjusted, as these are used for scene layout purposes +///To adjust the scale and position of items within a node, you can add them to a child node and adjust them there +open class LocationNode: SCNNode { + /// Location can be changed and confirmed later by SceneLocationView. + public var location: CLLocation! + + /// A general purpose tag that can be used to find nodes already added to a SceneLocationView + public var tag: String? + + ///Whether the location of the node has been confirmed. + ///This is automatically set to true when you create a node using a location. + ///Otherwise, this is false, and becomes true once the user moves 100m away from the node, + ///except when the locationEstimateMethod is set to use Core Location data only, + ///as then it becomes true immediately. + public var locationConfirmed = false + + ///Whether a node's position should be adjusted on an ongoing basis + ///based on its' given location. + ///This only occurs when a node's location is within 100m of the user. + ///Adjustment doesn't apply to nodes without a confirmed location. + ///When this is set to false, the result is a smoother appearance. + ///When this is set to true, this means a node may appear to jump around + ///as the user's location estimates update, + ///but the position is generally more accurate. + ///Defaults to true. + public var continuallyAdjustNodePositionWhenWithinRange = true + + ///Whether a node's position and scale should be updated automatically on a continual basis. + ///This should only be set to false if you plan to manually update position and scale + ///at regular intervals. You can do this with `SceneLocationView`'s `updatePositionOfLocationNode`. + public var continuallyUpdatePositionAndScale = true + + public init(location: CLLocation?) { + self.location = location + self.locationConfirmed = location != nil + super.init() + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +open class LocationAnnotationNode: LocationNode { + ///An image to use for the annotation + ///When viewed from a distance, the annotation will be seen at the size provided + ///e.g. if the size is 100x100px, the annotation will take up approx 100x100 points on screen. + public let image: UIImage + + ///Subnodes and adjustments should be applied to this subnode + ///Required to allow scaling at the same time as having a 2D 'billboard' appearance + public let annotationNode: SCNNode + + ///Whether the node should be scaled relative to its distance from the camera + ///Default value (false) scales it to visually appear at the same size no matter the distance + ///Setting to true causes annotation nodes to scale like a regular node + ///Scaling relative to distance may be useful with local navigation-based uses + ///For landmarks in the distance, the default is correct + public var scaleRelativeToDistance = false + + public init(location: CLLocation?, image: UIImage) { + self.image = image + + let plane = SCNPlane(width: image.size.width / 100, height: image.size.height / 100) + plane.firstMaterial!.diffuse.contents = image + plane.firstMaterial!.lightingModel = .constant + + annotationNode = SCNNode() + annotationNode.geometry = plane + + super.init(location: location) + + let billboardConstraint = SCNBillboardConstraint() + billboardConstraint.freeAxes = SCNBillboardAxis.Y + constraints = [billboardConstraint] + + addChildNode(annotationNode) + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SCNNode+Extensions.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SCNNode+Extensions.swift new file mode 100644 index 0000000..8f843c8 --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SCNNode+Extensions.swift @@ -0,0 +1,38 @@ +// +// SCNNode+Extensions.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 09/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import SceneKit + +extension SCNNode { + class func axesNode(quiverLength: CGFloat, quiverThickness: CGFloat) -> SCNNode { + let quiverThickness = (quiverLength / 50.0) * quiverThickness + let chamferRadius = quiverThickness / 2.0 + + let xQuiverBox = SCNBox(width: quiverLength, height: quiverThickness, length: quiverThickness, chamferRadius: chamferRadius) + xQuiverBox.firstMaterial?.diffuse.contents = UIColor.red + let xQuiverNode = SCNNode(geometry: xQuiverBox) + xQuiverNode.position = SCNVector3Make(Float(quiverLength / 2.0), 0.0, 0.0) + + let yQuiverBox = SCNBox(width: quiverThickness, height: quiverLength, length: quiverThickness, chamferRadius: chamferRadius) + yQuiverBox.firstMaterial?.diffuse.contents = UIColor.green + let yQuiverNode = SCNNode(geometry: yQuiverBox) + yQuiverNode.position = SCNVector3Make(0.0, Float(quiverLength / 2.0), 0.0) + + let zQuiverBox = SCNBox(width: quiverThickness, height: quiverThickness, length: quiverLength, chamferRadius: chamferRadius) + zQuiverBox.firstMaterial?.diffuse.contents = UIColor.blue + let zQuiverNode = SCNNode(geometry: zQuiverBox) + zQuiverNode.position = SCNVector3Make(0.0, 0.0, Float(quiverLength / 2.0)) + + let quiverNode = SCNNode() + quiverNode.addChildNode(xQuiverNode) + quiverNode.addChildNode(yQuiverNode) + quiverNode.addChildNode(zQuiverNode) + quiverNode.name = "Axes" + return quiverNode + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SCNVector3+Extensions.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SCNVector3+Extensions.swift new file mode 100644 index 0000000..44de0b8 --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SCNVector3+Extensions.swift @@ -0,0 +1,17 @@ +// +// SCNVecto3+Extensions.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 23/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import SceneKit + +extension SCNVector3 { + ///Calculates distance between vectors + ///Doesn't include the y axis, matches functionality of CLLocation 'distance' function. + func distance(to anotherVector: SCNVector3) -> Float { + return sqrt(pow(anotherVector.x - x, 2) + pow(anotherVector.z - z, 2)) + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationEstimate+Extensions.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationEstimate+Extensions.swift new file mode 100644 index 0000000..6f6e6dc --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationEstimate+Extensions.swift @@ -0,0 +1,28 @@ +// +// SceneLocationEstimate+Extensions.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 16/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import CoreLocation +import SceneKit + +extension SceneLocationEstimate { + ///Compares the location's position to another position, to determine the translation between them + public func locationTranslation(to position: SCNVector3) -> LocationTranslation { + return LocationTranslation( + latitudeTranslation: Double(self.position.z - position.z), + longitudeTranslation: Double(position.x - self.position.x), + altitudeTranslation: Double(position.y - self.position.y)) + } + + ///Translates the location by comparing with a given position + public func translatedLocation(to position: SCNVector3) -> CLLocation { + let translation = self.locationTranslation(to: position) + let translatedLocation = self.location.translatedLocation(with: translation) + + return translatedLocation + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationEstimate.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationEstimate.swift new file mode 100644 index 0000000..a4f6574 --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationEstimate.swift @@ -0,0 +1,21 @@ +// +// SceneLocationEstimate.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 03/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import Foundation +import CoreLocation +import SceneKit + +public class SceneLocationEstimate { + public let location: CLLocation + public let position: SCNVector3 + + init(location: CLLocation, position: SCNVector3) { + self.location = location + self.position = position + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationView.swift b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationView.swift new file mode 100644 index 0000000..a8de6e0 --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/ARCL/Source/SceneLocationView.swift @@ -0,0 +1,514 @@ +// +// SceneLocationView.swift +// ARKit+CoreLocation +// +// Created by Andrew Hart on 02/07/2017. +// Copyright © 2017 Project Dent. All rights reserved. +// + +import Foundation +import ARKit +import CoreLocation +import MapKit + +@available(iOS 11.0, *) +public protocol SceneLocationViewDelegate: class { + func sceneLocationViewDidAddSceneLocationEstimate(sceneLocationView: SceneLocationView, position: SCNVector3, location: CLLocation) + func sceneLocationViewDidRemoveSceneLocationEstimate(sceneLocationView: SceneLocationView, position: SCNVector3, location: CLLocation) + + ///After a node's location is initially set based on current location, + ///it is later confirmed once the user moves far enough away from it. + ///This update uses location data collected since the node was placed to give a more accurate location. + func sceneLocationViewDidConfirmLocationOfNode(sceneLocationView: SceneLocationView, node: LocationNode) + + func sceneLocationViewDidSetupSceneNode(sceneLocationView: SceneLocationView, sceneNode: SCNNode) + + func sceneLocationViewDidUpdateLocationAndScaleOfLocationNode(sceneLocationView: SceneLocationView, locationNode: LocationNode) +} + +///Different methods which can be used when determining locations (such as the user's location). +public enum LocationEstimateMethod { + ///Only uses core location data. + ///Not suitable for adding nodes using current position, which requires more precision. + case coreLocationDataOnly + + ///Combines knowledge about movement through the AR world with + ///the most relevant Core Location estimate (based on accuracy and time). + case mostRelevantEstimate +} + +//Should conform to delegate here, add in future commit +@available(iOS 11.0, *) +public class SceneLocationView: ARSCNView, ARSCNViewDelegate { + ///The limit to the scene, in terms of what data is considered reasonably accurate. + ///Measured in meters. + private static let sceneLimit = 100.0 + + public weak var locationDelegate: SceneLocationViewDelegate? + + ///The method to use for determining locations. + ///Not advisable to change this as the scene is ongoing. + public var locationEstimateMethod: LocationEstimateMethod = .mostRelevantEstimate + + public let locationManager = LocationManager() + ///When set to true, displays an axes node at the start of the scene + public var showAxesNode = false + + private(set) var locationNodes = [LocationNode]() + + private var sceneLocationEstimates = [SceneLocationEstimate]() + + public private(set) var sceneNode: SCNNode? { + didSet { + if sceneNode != nil { + for locationNode in locationNodes { + sceneNode!.addChildNode(locationNode) + } + + locationDelegate?.sceneLocationViewDidSetupSceneNode(sceneLocationView: self, sceneNode: sceneNode!) + } + } + } + + private var updateEstimatesTimer: Timer? + + private var didFetchInitialLocation = false + + ///Whether debugging feature points should be displayed. + ///Defaults to false + public var showFeaturePoints = false + + ///Only to be overrided if you plan on manually setting True North. + ///When true, sets up the scene to face what the device considers to be True North. + ///This can be inaccurate, hence the option to override it. + ///The functions for altering True North can be used irrespective of this value, + ///but if the scene is oriented to true north, it will update without warning, + ///thus affecting your alterations. + ///The initial value of this property is respected. + public var orientToTrueNorth = true + + // MARK: - Setup + public convenience init() { + self.init(frame: CGRect.zero, options: nil) + } + + public override init(frame: CGRect, options: [String: Any]? = nil) { + super.init(frame: frame, options: options) + finishInitialization() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + finishInitialization() + } + + private func finishInitialization() { + locationManager.delegate = self + + delegate = self + + // Show statistics such as fps and timing information + showsStatistics = false + + if showFeaturePoints { + debugOptions = [ARSCNDebugOptions.showFeaturePoints] + } + } + + override public func layoutSubviews() { + super.layoutSubviews() + } + + public func run() { + // Create a session configuration + let configuration = ARWorldTrackingConfiguration() + configuration.planeDetection = .horizontal + + if orientToTrueNorth { + configuration.worldAlignment = .gravityAndHeading + } else { + configuration.worldAlignment = .gravity + } + + // Run the view's session + session.run(configuration) + + updateEstimatesTimer?.invalidate() + updateEstimatesTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(SceneLocationView.updateLocationData), userInfo: nil, repeats: true) + } + + public func pause() { + session.pause() + updateEstimatesTimer?.invalidate() + updateEstimatesTimer = nil + } + + @objc private func updateLocationData() { + removeOldLocationEstimates() + confirmLocationOfDistantLocationNodes() + updatePositionAndScaleOfLocationNodes() + } + + // MARK: - True North + ///iOS can be inaccurate when setting true north + ///The scene is oriented to true north, and will update its heading when it gets a more accurate reading + ///You can disable this through setting the + ///These functions provide manual overriding of the scene heading, + /// if you have a more precise idea of where True North is + ///The goal is for the True North orientation problems to be resolved + ///At which point these functions would no longer be useful + + ///Moves the scene heading clockwise by 1 degree + ///Intended for correctional purposes + public func moveSceneHeadingClockwise() { + sceneNode?.eulerAngles.y -= Float(1).degreesToRadians + } + + ///Moves the scene heading anti-clockwise by 1 degree + ///Intended for correctional purposes + public func moveSceneHeadingAntiClockwise() { + sceneNode?.eulerAngles.y += Float(1).degreesToRadians + } + + ///Resets the scene heading to 0 + func resetSceneHeading() { + sceneNode?.eulerAngles.y = 0 + } + + // MARK: - Scene location estimates + + public func currentScenePosition() -> SCNVector3? { + guard let pointOfView = pointOfView else { + return nil + } + + return scene.rootNode.convertPosition(pointOfView.position, to: sceneNode) + } + + public func currentEulerAngles() -> SCNVector3? { + return pointOfView?.eulerAngles + } + + ///Adds a scene location estimate based on current time, camera position and location from location manager + fileprivate func addSceneLocationEstimate(location: CLLocation) { + if let position = currentScenePosition() { + let sceneLocationEstimate = SceneLocationEstimate(location: location, position: position) + self.sceneLocationEstimates.append(sceneLocationEstimate) + + locationDelegate?.sceneLocationViewDidAddSceneLocationEstimate(sceneLocationView: self, position: position, location: location) + } + } + + private func removeOldLocationEstimates() { + if let currentScenePosition = currentScenePosition() { + self.removeOldLocationEstimates(currentScenePosition: currentScenePosition) + } + } + + private func removeOldLocationEstimates(currentScenePosition: SCNVector3) { + let currentPoint = CGPoint.pointWithVector(vector: currentScenePosition) + + sceneLocationEstimates = sceneLocationEstimates.filter({ + let point = CGPoint.pointWithVector(vector: $0.position) + + let radiusContainsPoint = currentPoint.radiusContainsPoint(radius: CGFloat(SceneLocationView.sceneLimit), point: point) + + if !radiusContainsPoint { + locationDelegate?.sceneLocationViewDidRemoveSceneLocationEstimate(sceneLocationView: self, position: $0.position, location: $0.location) + } + + return radiusContainsPoint + }) + } + + ///The best estimation of location that has been taken + ///This takes into account horizontal accuracy, and the time at which the estimation was taken + ///favouring the most accurate, and then the most recent result. + ///This doesn't indicate where the user currently is. + public func bestLocationEstimate() -> SceneLocationEstimate? { + let sortedLocationEstimates = sceneLocationEstimates.sorted(by: { + if $0.location.horizontalAccuracy == $1.location.horizontalAccuracy { + return $0.location.timestamp > $1.location.timestamp + } + + return $0.location.horizontalAccuracy < $1.location.horizontalAccuracy + }) + + return sortedLocationEstimates.first + } + + public func currentLocation() -> CLLocation? { + if locationEstimateMethod == .coreLocationDataOnly { + return locationManager.currentLocation + } + + guard let bestEstimate = self.bestLocationEstimate(), + let position = currentScenePosition() else { + return nil + } + + return bestEstimate.translatedLocation(to: position) + } + + // MARK: - LocationNodes + ///upon being added, a node's location, locationConfirmed and position may be modified and should not be changed externally. + public func addLocationNodeForCurrentPosition(locationNode: LocationNode) { + guard let currentPosition = currentScenePosition(), + let currentLocation = currentLocation(), + let sceneNode = self.sceneNode else { + return + } + + locationNode.location = currentLocation + + ///Location is not changed after being added when using core location data only for location estimates + if locationEstimateMethod == .coreLocationDataOnly { + locationNode.locationConfirmed = true + } else { + locationNode.locationConfirmed = false + } + + locationNode.position = currentPosition + + locationNodes.append(locationNode) + sceneNode.addChildNode(locationNode) + } + + ///location not being nil, and locationConfirmed being true are required + ///Upon being added, a node's position will be modified and should not be changed externally. + ///location will not be modified, but taken as accurate. + public func addLocationNodeWithConfirmedLocation(locationNode: LocationNode) { + if locationNode.location == nil || locationNode.locationConfirmed == false { + return + } + + updatePositionAndScaleOfLocationNode(locationNode: locationNode, initialSetup: true, animated: false) + + locationNodes.append(locationNode) + sceneNode?.addChildNode(locationNode) + } + + /// Determine if scene contains a node with the specified tag + /// + /// - Parameter tag: tag text + /// - Returns: true if a LocationNode with the tag exists; false otherwise + public func sceneContainsNodeWithTag(_ tag: String) -> Bool { + return findNodes(tagged: tag).count > 0 + } + + /// Find all location nodes in the scene tagged with `tag` + /// + /// - Parameter tag: The tag text for which to search nodes. + /// - Returns: A list of all matching tags + public func findNodes(tagged tag: String) -> [LocationNode] { + guard tag.count > 0 else { + return [] + } + + return locationNodes.filter { $0.tag == tag } + } + + public func removeLocationNode(locationNode: LocationNode) { + if let index = locationNodes.index(of: locationNode) { + locationNodes.remove(at: index) + } + + locationNode.removeFromParentNode() + } + + private func confirmLocationOfDistantLocationNodes() { + guard let currentPosition = currentScenePosition() else { + return + } + + for locationNode in locationNodes where !locationNode.locationConfirmed { + let currentPoint = CGPoint.pointWithVector(vector: currentPosition) + let locationNodePoint = CGPoint.pointWithVector(vector: locationNode.position) + + if !currentPoint.radiusContainsPoint(radius: CGFloat(SceneLocationView.sceneLimit), point: locationNodePoint) { + confirmLocationOfLocationNode(locationNode) + } + } + } + + ///Gives the best estimate of the location of a node + func locationOfLocationNode(_ locationNode: LocationNode) -> CLLocation { + if locationNode.locationConfirmed || locationEstimateMethod == .coreLocationDataOnly { + return locationNode.location! + } + + if let bestLocationEstimate = bestLocationEstimate(), + locationNode.location == nil || + bestLocationEstimate.location.horizontalAccuracy < locationNode.location!.horizontalAccuracy { + let translatedLocation = bestLocationEstimate.translatedLocation(to: locationNode.position) + + return translatedLocation + } else { + return locationNode.location! + } + } + + private func confirmLocationOfLocationNode(_ locationNode: LocationNode) { + locationNode.location = locationOfLocationNode(locationNode) + + locationNode.locationConfirmed = true + + locationDelegate?.sceneLocationViewDidConfirmLocationOfNode(sceneLocationView: self, node: locationNode) + } + + func updatePositionAndScaleOfLocationNodes() { + for locationNode in locationNodes where locationNode.continuallyUpdatePositionAndScale { + updatePositionAndScaleOfLocationNode(locationNode: locationNode, animated: true) + } + } + + public func updatePositionAndScaleOfLocationNode(locationNode: LocationNode, initialSetup: Bool = false, animated: Bool = false, duration: TimeInterval = 0.1) { + guard let currentPosition = currentScenePosition(), + let currentLocation = currentLocation() else { + return + } + + SCNTransaction.begin() + + SCNTransaction.animationDuration = animated ? duration : 0 + + let locationNodeLocation = locationOfLocationNode(locationNode) + + // Position is set to a position coordinated via the current position + let locationTranslation = currentLocation.translation(toLocation: locationNodeLocation) + let adjustedDistance: CLLocationDistance + let distance = locationNodeLocation.distance(from: currentLocation) + + if locationNode.locationConfirmed && + (distance > 100 || locationNode.continuallyAdjustNodePositionWhenWithinRange || initialSetup) { + if distance > 100 { + //If the item is too far away, bring it closer and scale it down + let scale = 100 / Float(distance) + + adjustedDistance = distance * Double(scale) + + let adjustedTranslation = SCNVector3( + x: Float(locationTranslation.longitudeTranslation) * scale, + y: Float(locationTranslation.altitudeTranslation) * scale, + z: Float(locationTranslation.latitudeTranslation) * scale) + + let position = SCNVector3( + x: currentPosition.x + adjustedTranslation.x, + y: currentPosition.y + adjustedTranslation.y, + z: currentPosition.z - adjustedTranslation.z) + + locationNode.position = position + + locationNode.scale = SCNVector3(x: scale, y: scale, z: scale) + } else { + adjustedDistance = distance + let position = SCNVector3( + x: currentPosition.x + Float(locationTranslation.longitudeTranslation), + y: currentPosition.y + Float(locationTranslation.altitudeTranslation), + z: currentPosition.z - Float(locationTranslation.latitudeTranslation)) + + locationNode.position = position + locationNode.scale = SCNVector3(x: 1, y: 1, z: 1) + } + } else { + //Calculates distance based on the distance within the scene, as the location isn't yet confirmed + adjustedDistance = Double(currentPosition.distance(to: locationNode.position)) + + locationNode.scale = SCNVector3(x: 1, y: 1, z: 1) + } + + if let annotationNode = locationNode as? LocationAnnotationNode { + //The scale of a node with a billboard constraint applied is ignored + //The annotation subnode itself, as a subnode, has the scale applied to it + let appliedScale = locationNode.scale + locationNode.scale = SCNVector3(x: 1, y: 1, z: 1) + + var scale: Float + + if annotationNode.scaleRelativeToDistance { + scale = appliedScale.y + annotationNode.annotationNode.scale = appliedScale + } else { + //Scale it to be an appropriate size so that it can be seen + scale = Float(adjustedDistance) * 0.181 + + if distance > 3000 { + scale = scale * 0.75 + } + + annotationNode.annotationNode.scale = SCNVector3(x: scale, y: scale, z: scale) + } + + annotationNode.pivot = SCNMatrix4MakeTranslation(0, -1.1 * scale, 0) + } + + SCNTransaction.commit() + + locationDelegate?.sceneLocationViewDidUpdateLocationAndScaleOfLocationNode(sceneLocationView: self, locationNode: locationNode) + } + + // MARK: - ARSCNViewDelegate + + public func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) { + if sceneNode == nil { + sceneNode = SCNNode() + scene.rootNode.addChildNode(sceneNode!) + + if showAxesNode { + let axesNode = SCNNode.axesNode(quiverLength: 0.1, quiverThickness: 0.5) + sceneNode?.addChildNode(axesNode) + } + } + + if !didFetchInitialLocation { + //Current frame and current location are required for this to be successful + if session.currentFrame != nil, + let currentLocation = self.locationManager.currentLocation { + didFetchInitialLocation = true + + self.addSceneLocationEstimate(location: currentLocation) + } + } + } + + public func sessionWasInterrupted(_ session: ARSession) { + print("session was interrupted") + } + + public func sessionInterruptionEnded(_ session: ARSession) { + print("session interruption ended") + } + + public func session(_ session: ARSession, didFailWithError error: Error) { + print("session did fail with error: \(error)") + } + + public func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera) { + switch camera.trackingState { + case .limited(.insufficientFeatures): + print("camera did change tracking state: limited, insufficient features") + case .limited(.excessiveMotion): + print("camera did change tracking state: limited, excessive motion") + case .limited(.initializing): + print("camera did change tracking state: limited, initializing") + case .normal: + print("camera did change tracking state: normal") + case .notAvailable: + print("camera did change tracking state: not available") + case .limited(.relocalizing): + print("camera did change tracking state: limited, relocalizing") + } + } +} + +// MARK: - LocationManager +@available(iOS 11.0, *) +extension SceneLocationView: LocationManagerDelegate { + func locationManagerDidUpdateLocation(_ locationManager: LocationManager, location: CLLocation) { + addSceneLocationEstimate(location: location) + } + + func locationManagerDidUpdateHeading(_ locationManager: LocationManager, heading: CLLocationDirection, accuracy: CLLocationAccuracy) { + + } +} diff --git a/GeoTrackKitExample/Pods/ARCL/LICENSE b/GeoTrackKitExample/Pods/ARCL/LICENSE new file mode 100644 index 0000000..5b4089f --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Project Dent (https://ProjectDent.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/GeoTrackKitExample/Pods/ARCL/readme.jp.md b/GeoTrackKitExample/Pods/ARCL/readme.jp.md new file mode 100644 index 0000000..fa210f7 --- /dev/null +++ b/GeoTrackKitExample/Pods/ARCL/readme.jp.md @@ -0,0 +1,154 @@ +![ARKit + CoreLocation](https://github.com/ProjectDent/ARKit-CoreLocation/blob/master/arkit.png) + +注) 英語から翻訳したものであり、その内容が最新でない場合もあります。最新の情報はオリジナルの英語版を参照してください。 + +**ARKit**: カメラとモーションデータを使用して、移動したときに精密に近辺の世界を映し出します。 + +**CoreLocation**: WifiとGPSを使用して、低い精度で現在地を測定します。 + +**ARKit + CoreLocation**: ARの高い精度とGPSのスケールを組み合わせます。 + +![Points of interest demo](https://github.com/ProjectDent/ARKit-CoreLocation/blob/master/giphy-1.gif) ![Navigation demo](https://github.com/ProjectDent/ARKit-CoreLocation/blob/master/giphy-2.gif) + +これらの技術の組み合わせには非常に大きな可能性があり、さまざまな分野に渡って多くの可能性あるアプリケーションがあります。このライブラリには2つの重要な機能が備わっています。 + +- 現実世界の座標を用いて、ARの世界にアイテムを置けるようにする機能 +- ARの世界を通した動きの知識を組み合わせた最近の位置データを利用した、劇的に改善された位置精度 + +改善された位置精度は現在、「実験的」な段階にありますが、最も重要な要素になる可能性があります。 + +やるべきことがまだたくさんあり、他の分野でもそうであるため、GithubのIssueで私たちがやるよりも、このプロジェクトはオープンなコミュニティで提供されるのが最善でしょう。 +なので、このライブラリや改善、自分たちの仕事について議論をするために 誰でも参加できるSlackのグループを開こうと思います。 + +**[Slackのコミュニティに参加してください](https://join.slack.com/t/arcl-dev/shared_invite/MjE4NTQ3NzE3MzgxLTE1MDExNTAzMTUtMTIyMmNlMTkyYg)** + +## 必要条件 +ARKitはiOS 11が必要で、以下の端末が対応しています。 +- iPhone 6S and upwards +- iPhone SE +- iPad (2017) +- All iPad Pro models + +iOS 11 は Apple’s Developer websiteからダウンロードできます。 + +## 利用方法 +このライブラリはARKitとCoreLocation frameworkを含んでおり、[Demo 1](https://twitter.com/AndrewProjDent/status/886916872683343872)と似たデモアプリと同様のものです。 + +[True North calibration のセクションを必ず読んでください。](#true-north-calibration) + +### CocoaPodsでの設定 +1. Podfileに以下を追加: + +`pod 'ARCL'` + +2. ターミナルでプロジェクトのフォルダまで移動し、以下を入力: + +`pod update` + +`pod install` + +3. `NSCameraUsageDescription` と `NSLocationWhenInUseUsageDescription` を、簡単な説明を入れてplistに追加 (例はデモをご覧ください) + +### マニュアルで設定 +1. `ARKit+CoreLocation/Source` からすべてのファイルをプロジェクトに追加. +2. ARKit、SceneKit、CoreLocation、MapKitをインポート +3. `NSCameraUsageDescription` と `NSLocationWhenInUseUsageDescription` を、簡単な説明を入れてplistに追加 (例はデモをご覧ください) + +### クリックスタートガイド +例えばロンドンのCanary Wharfなどの、ビルの上にピンを置くためには、ARCLの構築するメインのクラスを使います。 - `SceneLocationView` + +まず、ARCLとCoreLocationをインポートします。それから、SceneLocationViewをプロパティとして宣言します。 + +``` +import ARCL +import CoreLocation + +class ViewController: UIViewController { +var sceneLocationView = SceneLocationView() +} +``` + +ピントが合ってるときはいつでも `sceneLocationView.run()` を呼び、別のビューに移動したりアプリを閉じたりするなどで中断する場合は `sceneLocationView.pause()` を呼ぶべきです。 + +``` +override func viewDidLoad() { +super.viewDidLoad() + +sceneLocationView.run() +view.addSubview(sceneLocationView) +} + +override func viewDidLayoutSubviews() { +super.viewDidLayoutSubviews() + +sceneLocationView.frame = view.bounds +} +``` + +`run()`を呼んだら、座標を追加することができます。ARCLは`LocationNode`という、3Dシーンのオブジェクトで、現実世界の位置を持ち、3Dの世界の中に適切に表示できるようにする他のいくつかのプロパティも持っているクラスがあります。 +`LocationNode` は SceneKitの`SCNNode`のサブクラスで、さらにサブクラス化できます。例えば、`LocationAnnotationNode`というサブクラスを使います。これは3Dの世界に2次元の画像を表示するために使用しますが、いつも使うことになります。 + +``` +let coordinate = CLLocationCoordinate2D(latitude: 51.504571, longitude: -0.019717) +let location = CLLocation(coordinate: coordinate, altitude: 300) +let image = UIImage(named: "pin")! + +let annotationNode = LocationAnnotationNode(location: location, image: image) +``` + +デフォルトで、設置した画像は常に与えられたサイズで見えるべきです。例えば、100x100の画像を与えたなら、それはスクリーン上でも100x100で表示されるでしょう。 +遠くにあるアノテーションノードは近くになるのと同じサイズで常に見えるということです。 +もし距離に応じて縮小と拡大をさせる方がいいなら、LocationAnnotationNodeの`scaleRelativeToDistance`を`true`にセットすることができます。 + +``` +sceneLocationView.addLocationNodeWithConfirmedLocation(locationNode: annotationNode) +``` + +シーンに位置ノードを追加する方法は2つあります。それは`addLocationNodeWithConfirmedLocation`と`addLocationNodeForCurrentPosition`を使う方法です。端末と同じ位置に位置ノードを3Dの世界に配置し、座標を与えてくれます。 +sceneLocationViewのframeを設定したら、Canary Wharfの上にピンが浮かんでるのが見えます。 + +## 追加機能 +ライブラリとデモには、設定のための追加の機能が用意されています。必ず一覧できるように完全に文書化されています。 + +SceneLocationViewはARSCNViewのサブクラスです. 別の方法で完全にARSCNViewを使えるようにしてくれる一方で、別のクラスにdelegateをセットすべきではないことを留意してください。もしdelegateの機能が必要になったら、サブクラスの`SceneLocationView`を使ってください。 + +## True North calibration +私が個人的に解決できなかった問題は、iPhoneのTrue North calibrationが現在最高で15度の精度であるということです。これは地図のナビにとっては良いのですが、ARの世界に物体を置くときには、問題となりはじめます。 + +私はこの問題は、様々なARの技術によって乗り越えられると確信しています。それは共同して恩恵を受けることができると思う1つの領域です。 + +現在これを改善するために、私は北点を調整できるようにするいくつかの機能をライブラリに追加してきました。 +`sceneLocationView.useTrueNorth`を`false`に設定することでこれらを使用します。それから、最初に端末を北の一般的な方向に向けると、合理的に近づけることができます。`UseTrueNorth`をtrue(デフォルト)に設定すると、北をうまく検知できるようになるにつれて調整を続けていきます。 + +デモアプリ内では、`adjustNorthByTappingSidesOfScreen`という利用できないプロパティがあります。これは上記の機能にアクセスできるのですが、一度利用できるようにすれば、スクリーンの左側と右側をタップすることでシーンの進行方向を調整できるようになります。 + +自分の位置から直接的にTrue Northとなっている近くの目印を正確にし、座標を使ってそこに物体を設置し、その物体が目印に並んで表示されるまでシーンを調整する`moveSceneHeading`を使います。 + +## 位置精度の改善 +CoreLocationは1~15秒ごとにどこでも位置の更新を伝えてくれますが、精度は150mから4mまで変化します。不正確な位置の読み取りに戻ってしまう前に、ときどき4mや8mのようにより正確な位置を取得することがあるでしょう。それと同時に、ARはモーションやカメラのデータを使ってARの世界での地図を作ります。 + +ユーザーは4mまで正確な位置の読み取りを受信することがあります。その後、ユーザーが10m北に歩き、65mまで正確に読み取られた別の位置を取得します。この65mでの正確な読み取りはCoreLicationが提供できる最高のものなのですが、4mが読み取られたときにAR内でのユーザーの位置を把握し、そこからARを10m北に歩いたら、およそ4mの精度で新しい座標を与えてくれるデータに変換することができます。これは100mまで正確になります。 + +[より詳細な情報はwikiにあります。](https://github.com/ProjectDent/ARKit-CoreLocation/wiki/Current-Location-Accuracy). + +### 問題 +これは実験的だと言いましたが、現在はユーザーがARを使って歩いてるときにARKitがときどき混乱し、ユーザーの位置が不正確になるかもしれません。この問題は"オイラー角"または端末の向きの情報に影響するようにも見えます。なので、少し距離を進んだ後は、あなたが別の方角を歩いてるとARKitは思うのかもしれません。 + +AppleがそのうちARKitを改善する一方で、それらの問題を回避するために私たちでできる改善があると思っています。例えば問題が起きたことを認識し、修正することなど。これは位置データを想定した位置と比較して、想定した範囲を超えて移動したのかどうかを判定することで実現できます。 + +### 位置のアルゴリスムの改善 +ユーザの位置を決定するためにさらなる最適化をすることができます。 + +例えば、最近の位置データを見て、その後のユーザーの移動をもとに各データポイントを変換し、ユーザがいそうな位置をより厳しく判定するためにそのデータポイントの重なりを使うというテクニックです。 + +[より詳細な情報はwikiにあります。](https://github.com/ProjectDent/ARKit-CoreLocation/wiki/Current-Location-Accuracy). + +## 今後 + +私たちは、いくつかのマイルストーンと上記に関連した問題を抱えています。議論したり貢献することは誰でも歓迎です。心おきなくプルリクエストを送ってください。新しくIssueを追加するか[the Slack community](https://join.slack.com/t/arcl-dev/shared_invite/MjE4NTQ3NzE3MzgxLTE1MDExNTAzMTUtMTIyMmNlMTkyYg)で新しい機能/拡張/バグについて議論できます。 + +## Thanks +[@AndrewProjDent](https://twitter.com/andrewprojdent)がライブラリをつくりましたが、コミュニティの努力はここからです。 + +[MIT License](http://opensource.org/licenses/MIT)の条件でオープンソースとして利用できます。 + diff --git a/GeoTrackKitExample/Pods/Manifest.lock b/GeoTrackKitExample/Pods/Manifest.lock index 59a0d49..7969634 100644 --- a/GeoTrackKitExample/Pods/Manifest.lock +++ b/GeoTrackKitExample/Pods/Manifest.lock @@ -1,18 +1,25 @@ PODS: + - ARCL (1.0.4) - GeoTrackKit/Core (0.4.2) - GeoTrackKit/HealthKit (0.4.2): - GeoTrackKit/Core DEPENDENCIES: + - ARCL - GeoTrackKit/HealthKit (from `..`) +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - ARCL + EXTERNAL SOURCES: GeoTrackKit: :path: ".." SPEC CHECKSUMS: + ARCL: 5fd2b0d7aabf91f15dbc0e8c510b25516b8a755a GeoTrackKit: 16113ae65bd458be0255a0d8270a8190ee4397a2 -PODFILE CHECKSUM: 6b6b15c8571da71adf29321de0604cdf6ea5756a +PODFILE CHECKSUM: e0a4cfa4a33435544a2817e2a6b27cbcbca4a1d9 COCOAPODS: 1.5.3 diff --git a/GeoTrackKitExample/Pods/Pods.xcodeproj/project.pbxproj b/GeoTrackKitExample/Pods/Pods.xcodeproj/project.pbxproj index aa73b4f..84d5b15 100644 --- a/GeoTrackKitExample/Pods/Pods.xcodeproj/project.pbxproj +++ b/GeoTrackKitExample/Pods/Pods.xcodeproj/project.pbxproj @@ -7,46 +7,71 @@ objects = { /* Begin PBXBuildFile section */ + 0476386CCDD24035FF46BA085E69ABD1 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C77626DC61CC820DD862D736C3A8262 /* MapKit.framework */; }; 06D4A6D56DCE2E3229A01E9599A4D4EE /* Pods-GeoTrackKitExampleTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C5A04C84C5C1455273889A2E9D7ED64E /* Pods-GeoTrackKitExampleTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1731CE474EB724DC9695EA2FC0C784B5 /* CLLocation+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B2D5D9AAD50FDD2E5ED61B7AA7D0AE3 /* CLLocation+Extensions.swift */; }; 1A8691A3A3736C46C195F2BD3FBC1351 /* GeoTrackEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D1E4F2D7D0879F1C78CC73480DABEE /* GeoTrackEvent.swift */; }; - 1F165B3A7C62EAB9AB4E4A7F437272A8 /* Pods-GeoTrackKitExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2829797D6D1DEC21487DF701E3441478 /* Pods-GeoTrackKitExample-dummy.m */; }; + 1BAC8E580ED1795B4D1AFE7761CDCBD8 /* SceneLocationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3618B7E4E4860639AF27AA367DF83CDF /* SceneLocationView.swift */; }; 2BC4976B5A6BC44E0E5C380ECE6CEA44 /* GeoTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC845A0614CEA0E9CADE9B156ACE016 /* GeoTrack.swift */; }; - 2C7CAD17AEB336369B54D20343644676 /* Pods-GeoTrackKitExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D8487DF676406564F795C4F5A9181015 /* Pods-GeoTrackKitExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2DEAD02E6117F31890F3975560835ACC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; + 2DEAD02E6117F31890F3975560835ACC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73571F4B2281E0098DC76443D509656 /* Foundation.framework */; }; + 2FFCBF1EFDE0819D86D56EB9EE926E97 /* CGPoint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BF90A7F032E1856B25C16383292CABA /* CGPoint+Extensions.swift */; }; + 3826C26206C9EC54B8A2263261D04428 /* Pods-GeoTrackKitExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D8487DF676406564F795C4F5A9181015 /* Pods-GeoTrackKitExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3F6573228EF4BDEBCD3AD5F89C249B5E /* GeoTrackAnalyzer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1D99FD162A565FC1F9B9B5803F06CC6 /* GeoTrackAnalyzer.swift */; }; 4494170015BD308698DE403015B0D5BF /* DefaultMapZoom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650B7BCE441BEE4B6EE153C3EC14F7E0 /* DefaultMapZoom.swift */; }; - 44DF41CD4239BCB0AB861C319774C687 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; 45627C2BF022971053B5144F048DA89F /* GeoTrackManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72C87461CF15255A7025252B325CE785 /* GeoTrackManager.swift */; }; + 4911D5FFCD72381B9766E1C9752456C1 /* Pods-GeoTrackKitExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2829797D6D1DEC21487DF701E3441478 /* Pods-GeoTrackKitExample-dummy.m */; }; + 53B8369D4AB3039EA420AEA080C8CBAA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73571F4B2281E0098DC76443D509656 /* Foundation.framework */; }; 57247A0B5811565F3D736915FA511C2C /* GeoTrack+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049F3EAED8F8D85DAF8A029A33CCE601 /* GeoTrack+Utilities.swift */; }; 63CC0175B5F16850737654AA6B52049E /* LoggingFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893A879F4226476696E4F0E37633A996 /* LoggingFunctions.swift */; }; 71B912EC731764BA0DDAB0CF345307C8 /* GeoTrackLocationEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A33926ABF4471798D3B5AFAEEEEAA98A /* GeoTrackLocationEvent.swift */; }; 73B52CC40FE365A0FEAFBEEE77F06018 /* GeoTrackKitErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8506FAB66B85F0EA0067594CAB02FD05 /* GeoTrackKitErrors.swift */; }; + 7BC649DA0F1FA8CA3638CBCCB42C097E /* ARKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8448C8D3B02A33C992689E219E119203 /* ARKit.framework */; }; 82CB52ECCBFA4FCEABCA6600459B9889 /* Leg.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D35317804C02FC3094C9B1844BDF252 /* Leg.swift */; }; + 86080F5B443E4D05768660C8EF9C0E9F /* SCNVector3+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CD46BC44F1FC85C0C34FAAC2813EAAD /* SCNVector3+Extensions.swift */; }; + 860D7E054B462A71CDC25904167CF9A8 /* FloatingPoint+Radians.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DFEAB87DE66A02705086C1B9B34C01B /* FloatingPoint+Radians.swift */; }; 876809303D049BD6E9D2871D7126EC44 /* GeoTrackMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C72E6953FEC186B3C96D5151967215F /* GeoTrackMap.swift */; }; 89C7655773A87F350D08A9E1620BFA92 /* GeoTrackKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 08930193412935B3B76A16F4B963BFDA /* GeoTrackKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8DE39EDF5853A24915661631269AF860 /* ActivityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66E8F5B8007A496981EB42E4EA65437F /* ActivityService.swift */; }; + 95EB2446A9F57421A2EA2FC247E5389C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C167BE81500CB0164A60D9EEFFBD72 /* UIKit.framework */; }; 9B333720FB36CCD82EDD399A75B68E3A /* CLLocationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C413A2C2A53ACF9BADA7B8B72D56DD /* CLLocationExtension.swift */; }; + A861AA5002FDD243CD4103693A0F1F4A /* SceneKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C7175760E70DBC0C749A613721BD92E3 /* SceneKit.framework */; }; AB18FD30B961E1035BFC8EA2E0AF32CC /* UIGeoTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA65D9A3FD6926B35729C3C4C1D2D61 /* UIGeoTrack.swift */; }; B1920850E38567B97AB6B5ACD016D5CF /* GeoTrackState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EAA97D3C3AB91070E8A10EFA8DDEC8F /* GeoTrackState.swift */; }; B5540A07B5279BB415AFB1110956DC30 /* DateExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1DC9CE348190F6FFD426A7946CDAEF3 /* DateExtension.swift */; }; B69FB64824B98D103EC00258FEC8094D /* GeoTrackService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12A8E6D1FF547A38751030FFB432C17C /* GeoTrackService.swift */; }; C45268FAEB8B939BAC5BB54599D8E072 /* GeoTrackEventLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 728762008DF53ED5AA291012C0B97BEA /* GeoTrackEventLog.swift */; }; + C6EABF435C6EB4FA7795F928C4F50012 /* SceneLocationEstimate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E5C24FEA4F0A07B6DEEE011E53706A /* SceneLocationEstimate.swift */; }; CCC5524B6D13DDB16521D4E096D7E939 /* NumberExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B690759C2C8167F8F8041C8172A3B3B /* NumberExtensions.swift */; }; - D45AC1CD35713DC36F13DAF0CD0A50D5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; + CFD6CB6AA118249C3CDF43EEB829E03C /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 893DA6918C0ED7EBDEE9A9C24940A7C5 /* CoreLocation.framework */; }; + D45AC1CD35713DC36F13DAF0CD0A50D5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73571F4B2281E0098DC76443D509656 /* Foundation.framework */; }; + D594D2C0BBC54276DB1D608F8AA08F0F /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E55CF15AD847062A0584DF6B1CF84961 /* LocationManager.swift */; }; + D5B73806799AB2ABFA1EFCE71B47D310 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73571F4B2281E0098DC76443D509656 /* Foundation.framework */; }; + D77AA016B91919A51744DB8F534C3786 /* LocationNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14710DC478841B242D3879EDB99F7B0C /* LocationNode.swift */; }; DA4DEFC9C7FF871BDBBA6E46E37C948C /* Pods-GeoTrackKitExampleTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AD109C468E49F3F25589ECCD9E62E9C /* Pods-GeoTrackKitExampleTests-dummy.m */; }; + DEA77B7B83D390D37786842982DBBF2A /* SCNNode+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB81C7421D1D093F10C13DCE02ADF0E /* SCNNode+Extensions.swift */; }; + E4297551FCBB86F006562F62D3D1A1C5 /* ARCL-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 98F388A581673D502474498EF5106B16 /* ARCL-dummy.m */; }; EFE0A9905FF9C508AE980F438835DD85 /* GeoTrackKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D82712CA5EB4A7952F6ACE5E333F0C65 /* GeoTrackKit-dummy.m */; }; + F26B3E04972FA2A0A2EE1E60073EA418 /* ARCL-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E47D071400451536B355EBC5A26E2C5B /* ARCL-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FC1C8D3AE7A715B62E724DC975CE69FF /* SceneLocationEstimate+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7EA75D7A9FFD6C07D066AE2A86C258D /* SceneLocationEstimate+Extensions.swift */; }; FF034FD117E0D511466A075ECEE0E288 /* ZoomDefining.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FD5F957156137243905E859FE9E4849 /* ZoomDefining.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + A19AE88CFFF0A0B71E218E0743B19FF2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9F5FE7984ADAD7AD628D4FB34E7A153B; + remoteInfo = ARCL; + }; C0D614F836F9D0BBC6CFC757B12CBFB9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 7B3B0A7AC0B017469EF6A114A90A4715; + remoteGlobalIDString = 66DB58B2315665672D709965248EFEC2; remoteInfo = "Pods-GeoTrackKitExample"; }; - C1C6D1CFF223717ED1517481BAFDF918 /* PBXContainerItemProxy */ = { + F7B4FC51BC528F008CA8E8D4F7F63528 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; @@ -60,7 +85,6 @@ 024DF307FF1B90C75EB200AE366269E5 /* Stat.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Stat.html; path = docs/Classes/Stat.html; sourceTree = ""; }; 02EDA23F5F0BCCF564BF39C51286FB1C /* GeoTrackAnalyzer.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackAnalyzer.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/GeoTrackAnalyzer.html; sourceTree = ""; }; 049F3EAED8F8D85DAF8A029A33CCE601 /* GeoTrack+Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "GeoTrack+Utilities.swift"; sourceTree = ""; }; - 08266C21B77FAC5C88D130EB333D1E65 /* Pods_GeoTrackKitExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_GeoTrackKitExample.framework; path = "Pods-GeoTrackKitExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 08930193412935B3B76A16F4B963BFDA /* GeoTrackKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GeoTrackKit-umbrella.h"; sourceTree = ""; }; 09522AD3710FF29C7A591675AEE63609 /* Protocols.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Protocols.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Protocols.html; sourceTree = ""; }; 0A4B14C2156A4A9524D89E46F9F2CD61 /* Protocols.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Protocols.html; path = docs/Protocols.html; sourceTree = ""; }; @@ -69,10 +93,14 @@ 0AD109C468E49F3F25589ECCD9E62E9C /* Pods-GeoTrackKitExampleTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GeoTrackKitExampleTests-dummy.m"; sourceTree = ""; }; 0B690759C2C8167F8F8041C8172A3B3B /* NumberExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NumberExtensions.swift; sourceTree = ""; }; 0BB08B80A6A2CFBEBF64B035690A8C1E /* GeoTrackKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GeoTrackKit-prefix.pch"; sourceTree = ""; }; + 0DFEAB87DE66A02705086C1B9B34C01B /* FloatingPoint+Radians.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FloatingPoint+Radians.swift"; path = "ARCL/Source/FloatingPoint+Radians.swift"; sourceTree = ""; }; + 0E43F5DCE1CA439D91E7F4F65798B4AC /* Pods_GeoTrackKitExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_GeoTrackKitExample.framework; path = "Pods-GeoTrackKitExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 0E98A4BA789FA350CCD9F89A1580C153 /* GeoTrackLogAppender.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackLogAppender.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Protocols/GeoTrackLogAppender.html; sourceTree = ""; }; 103BAAABF55CF7D8C536446BF5FB4CA2 /* TrackingType.html */ = {isa = PBXFileReference; includeInIndex = 1; name = TrackingType.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Enums/TrackingType.html; sourceTree = ""; }; 12A8E6D1FF547A38751030FFB432C17C /* GeoTrackService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GeoTrackService.swift; path = GeoTrackKit/Core/GeoTrackService.swift; sourceTree = ""; }; + 14710DC478841B242D3879EDB99F7B0C /* LocationNode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocationNode.swift; path = ARCL/Source/LocationNode.swift; sourceTree = ""; }; 1B9527F0B9C5A45FDC937C5924426A84 /* DefaultMapZoom.html */ = {isa = PBXFileReference; includeInIndex = 1; name = DefaultMapZoom.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/DefaultMapZoom.html; sourceTree = ""; }; + 1BF90A7F032E1856B25C16383292CABA /* CGPoint+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGPoint+Extensions.swift"; path = "ARCL/Source/CGPoint+Extensions.swift"; sourceTree = ""; }; 1F2BC376E7530D21DF6383FCED8CE5B5 /* Direction.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Direction.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Enums/Direction.html; sourceTree = ""; }; 20402B210F9A3204B9AFD43448F716BD /* Stat.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Stat.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/Stat.html; sourceTree = ""; }; 20938AD62AD6EAF6CD9FF895A1CB6CC1 /* jquery.min.js */ = {isa = PBXFileReference; includeInIndex = 1; name = jquery.min.js; path = docs/js/jquery.min.js; sourceTree = ""; }; @@ -91,6 +119,7 @@ 312B983E4C60886DBD3FBCE307D442FC /* GeoTrackState.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackState.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Enums/GeoTrackState.html; sourceTree = ""; }; 35522176C429064FC0E9246954D211CD /* TrackStat.html */ = {isa = PBXFileReference; includeInIndex = 1; name = TrackStat.html; path = docs/Classes/TrackStat.html; sourceTree = ""; }; 356B99DD54D86B5753B7DA2CC0D5AC21 /* CLLocationCoordinate2D.html */ = {isa = PBXFileReference; includeInIndex = 1; name = CLLocationCoordinate2D.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Extensions/CLLocationCoordinate2D.html; sourceTree = ""; }; + 3618B7E4E4860639AF27AA367DF83CDF /* SceneLocationView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SceneLocationView.swift; path = ARCL/Source/SceneLocationView.swift; sourceTree = ""; }; 36850B7AA00305C61B41D3366AB7851B /* GeoTrackAnalyzer.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackAnalyzer.html; path = docs/Classes/GeoTrackAnalyzer.html; sourceTree = ""; }; 37631CE316E292464B808D45AC523D71 /* jquery.min.js */ = {isa = PBXFileReference; includeInIndex = 1; name = jquery.min.js; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/js/jquery.min.js; sourceTree = ""; }; 38676B3BD767E4857B80EBE679366C18 /* ActivityService.html */ = {isa = PBXFileReference; includeInIndex = 1; name = ActivityService.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/ActivityService.html; sourceTree = ""; }; @@ -98,13 +127,16 @@ 3DC845A0614CEA0E9CADE9B156ACE016 /* GeoTrack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GeoTrack.swift; sourceTree = ""; }; 4056B665E3F4B2EB76200865C9A1557E /* Double.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Double.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Extensions/Double.html; sourceTree = ""; }; 40B5D7C1975836E27C5CE78AAA07AFEF /* Direction.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Direction.html; path = docs/Enums/Direction.html; sourceTree = ""; }; + 45E5C24FEA4F0A07B6DEEE011E53706A /* SceneLocationEstimate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SceneLocationEstimate.swift; path = ARCL/Source/SceneLocationEstimate.swift; sourceTree = ""; }; 47C413A2C2A53ACF9BADA7B8B72D56DD /* CLLocationExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CLLocationExtension.swift; sourceTree = ""; }; 4D8F19986A0ECF429BB94F593FE326BC /* dash.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = dash.png; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/img/dash.png; sourceTree = ""; }; + 4DF451CC30B7AE98BC53CEF34D675382 /* GeoTrackKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GeoTrackKit.framework; path = GeoTrackKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4EAA97D3C3AB91070E8A10EFA8DDEC8F /* GeoTrackState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GeoTrackState.swift; path = GeoTrackKit/Core/GeoTrackState.swift; sourceTree = ""; }; 5023E42F9E01AF52EAF0B738491EF7B0 /* UIGeoTrack.html */ = {isa = PBXFileReference; includeInIndex = 1; name = UIGeoTrack.html; path = docs/Classes/UIGeoTrack.html; sourceTree = ""; }; 511D130D9B6BBB85D60EF5AC7B0BD47E /* Leg.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Leg.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/Leg.html; sourceTree = ""; }; 51F148022359BD599AD94EACC51EC8DB /* ZoomDefining.html */ = {isa = PBXFileReference; includeInIndex = 1; name = ZoomDefining.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Protocols/ZoomDefining.html; sourceTree = ""; }; 59DEEA346498F0AF5C7ED52F84D99351 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5C77626DC61CC820DD862D736C3A8262 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/MapKit.framework; sourceTree = DEVELOPER_DIR; }; 5D1E1BB33E9AD1AA39FB97470A5F7A31 /* GeoTrackMap.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackMap.html; path = docs/Classes/GeoTrackMap.html; sourceTree = ""; }; 5E1940BC926F51A9C4EF1B14FE656D7E /* highlight.css */ = {isa = PBXFileReference; includeInIndex = 1; name = highlight.css; path = docs/css/highlight.css; sourceTree = ""; }; 5FD5F957156137243905E859FE9E4849 /* ZoomDefining.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ZoomDefining.swift; sourceTree = ""; }; @@ -130,9 +162,10 @@ 72BA18D6BC5FB2B840E6AAE946068488 /* Enums.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Enums.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Enums.html; sourceTree = ""; }; 72C87461CF15255A7025252B325CE785 /* GeoTrackManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GeoTrackManager.swift; path = GeoTrackKit/Core/GeoTrackManager.swift; sourceTree = ""; }; 73B9ABC003B3D4EA1DE260789B4A7DA7 /* Pods-GeoTrackKitExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GeoTrackKitExampleTests.release.xcconfig"; sourceTree = ""; }; + 73D7FB9486AAE4232D0E1E8D070CE400 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 7434F8F7C75DD7E3F7EE22D6B5408024 /* Pods-GeoTrackKitExample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GeoTrackKitExample-acknowledgements.plist"; sourceTree = ""; }; - 749497A9828FCBBC17034E4625532C89 /* Pods_GeoTrackKitExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_GeoTrackKitExampleTests.framework; path = "Pods-GeoTrackKitExampleTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 77003E3901BFB07B6AE0B335EB56D1C1 /* Extensions.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Extensions.html; path = docs/Extensions.html; sourceTree = ""; }; + 7B2D5D9AAD50FDD2E5ED61B7AA7D0AE3 /* CLLocation+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CLLocation+Extensions.swift"; path = "ARCL/Source/CLLocation+Extensions.swift"; sourceTree = ""; }; 7B64FF72DBF7BE18E7422F336B8CA943 /* Pods-GeoTrackKitExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GeoTrackKitExample.debug.xcconfig"; sourceTree = ""; }; 7C72E6953FEC186B3C96D5151967215F /* GeoTrackMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GeoTrackMap.swift; sourceTree = ""; }; 7CBB7E47F6047AC851D778E9C9829BF4 /* EventType.html */ = {isa = PBXFileReference; includeInIndex = 1; name = EventType.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/GeoTrackLocationEvent/EventType.html; sourceTree = ""; }; @@ -141,10 +174,12 @@ 8025E79AE152419046C0F2D6FD88B063 /* GeoTrackKitError.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackKitError.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Enums/GeoTrackKitError.html; sourceTree = ""; }; 805AA7DEEB75146E7AF477610FCC19CA /* GeoTrackLocationEvent.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackLocationEvent.html; path = docs/Classes/GeoTrackLocationEvent.html; sourceTree = ""; }; 80E856BA9A4F230B4EE00C4E4ACDB474 /* DefaultMapZoom.html */ = {isa = PBXFileReference; includeInIndex = 1; name = DefaultMapZoom.html; path = docs/Classes/DefaultMapZoom.html; sourceTree = ""; }; + 8448C8D3B02A33C992689E219E119203 /* ARKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ARKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/ARKit.framework; sourceTree = DEVELOPER_DIR; }; 8506FAB66B85F0EA0067594CAB02FD05 /* GeoTrackKitErrors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GeoTrackKitErrors.swift; path = GeoTrackKit/Core/GeoTrackKitErrors.swift; sourceTree = ""; }; 876DAD1BFF7C00617033265627C951B9 /* Pods-GeoTrackKitExample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GeoTrackKitExample-frameworks.sh"; sourceTree = ""; }; 87700F63623F8274F07D1F871EE8261A /* search.json */ = {isa = PBXFileReference; includeInIndex = 1; name = search.json; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/search.json; sourceTree = ""; }; 893A879F4226476696E4F0E37633A996 /* LoggingFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoggingFunctions.swift; path = GeoTrackKit/Core/LoggingFunctions.swift; sourceTree = ""; }; + 893DA6918C0ED7EBDEE9A9C24940A7C5 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/CoreLocation.framework; sourceTree = DEVELOPER_DIR; }; 8B2369B1953369790DE06B2E3734A8D2 /* GeoTrackManager.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackManager.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/GeoTrackManager.html; sourceTree = ""; }; 8BB05E68F7356F5E0A0F4E4FE367355D /* index.html */ = {isa = PBXFileReference; includeInIndex = 1; name = index.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/index.html; sourceTree = ""; }; 8C57CAC0AF3C5DF91100E817988D1CA8 /* search.json */ = {isa = PBXFileReference; includeInIndex = 1; name = search.json; path = docs/search.json; sourceTree = ""; }; @@ -152,41 +187,50 @@ 91EEE491B45C18C9EDC825C70E12B209 /* Pods-GeoTrackKitExample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GeoTrackKitExample.modulemap"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9441CED5B15349B47BB7D102A0A43113 /* CLLocationCoordinate2D.html */ = {isa = PBXFileReference; includeInIndex = 1; name = CLLocationCoordinate2D.html; path = docs/Extensions/CLLocationCoordinate2D.html; sourceTree = ""; }; + 98F388A581673D502474498EF5106B16 /* ARCL-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ARCL-dummy.m"; sourceTree = ""; }; 9A64DDE326031AE741DDA519F5F21635 /* GeoMapping.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoMapping.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Extensions/Notification/Name/GeoMapping.html; sourceTree = ""; }; 9C0892DAFA254309E9722BACF3157B53 /* Typealiases.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Typealiases.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Typealiases.html; sourceTree = ""; }; 9C705DC4A1EF129C53EED892DF44284E /* GeoTrackLogAppender.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackLogAppender.html; path = docs/Protocols/GeoTrackLogAppender.html; sourceTree = ""; }; + 9CD46BC44F1FC85C0C34FAAC2813EAAD /* SCNVector3+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SCNVector3+Extensions.swift"; path = "ARCL/Source/SCNVector3+Extensions.swift"; sourceTree = ""; }; 9D08D1ED4F3BC9C6ADBE985CB55C7097 /* ZoomDefining.html */ = {isa = PBXFileReference; includeInIndex = 1; name = ZoomDefining.html; path = docs/Protocols/ZoomDefining.html; sourceTree = ""; }; 9D1A2218BB726D5348AA8C9A1AD11B76 /* GeoTrackLocationEvent.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackLocationEvent.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/GeoTrackLocationEvent.html; sourceTree = ""; }; 9D35317804C02FC3094C9B1844BDF252 /* Leg.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Leg.swift; sourceTree = ""; }; 9DDD4365E822BA790ED77BDA5A657FDD /* Pods-GeoTrackKitExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GeoTrackKitExample.release.xcconfig"; sourceTree = ""; }; + A00EACDF1880CBD4E5E1CC686F337B19 /* ARCL.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ARCL.modulemap; sourceTree = ""; }; A0CB3DA1BEDA61C5DB58798E12CEF704 /* Extensions.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Extensions.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Extensions.html; sourceTree = ""; }; A147527BB8F3B100B4E4717D6E635F2B /* Double.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Double.html; path = docs/Extensions/Double.html; sourceTree = ""; }; A1D99FD162A565FC1F9B9B5803F06CC6 /* GeoTrackAnalyzer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GeoTrackAnalyzer.swift; path = GeoTrackKit/Core/GeoTrackAnalyzer.swift; sourceTree = ""; }; A33926ABF4471798D3B5AFAEEEEAA98A /* GeoTrackLocationEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GeoTrackLocationEvent.swift; sourceTree = ""; }; A6A40FE9C5B987946B4809A403F76ED9 /* Notification.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Notification.html; path = docs/Extensions/Notification.html; sourceTree = ""; }; - A74DCC49B5EE019AB07F7041F9A2E724 /* GeoTrackKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GeoTrackKit.framework; path = GeoTrackKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A7EA75D7A9FFD6C07D066AE2A86C258D /* SceneLocationEstimate+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SceneLocationEstimate+Extensions.swift"; path = "ARCL/Source/SceneLocationEstimate+Extensions.swift"; sourceTree = ""; }; + A8D5C3F5395B08F5986EB8644CCDAAB2 /* ARCL-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ARCL-prefix.pch"; sourceTree = ""; }; + A9C167BE81500CB0164A60D9EEFFBD72 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; AA2D946A1D998FD3E1F11BC85E09154C /* docSet.dsidx */ = {isa = PBXFileReference; includeInIndex = 1; name = docSet.dsidx; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/docSet.dsidx; sourceTree = ""; }; AD58EECDAB365E618EBA5D2A3B5F09FE /* UIGeoTrack.html */ = {isa = PBXFileReference; includeInIndex = 1; name = UIGeoTrack.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/UIGeoTrack.html; sourceTree = ""; }; AE4A1ADDBB4E2C1B72BE864A61D131FB /* GeoMapping.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoMapping.html; path = docs/Extensions/Notification/Name/GeoMapping.html; sourceTree = ""; }; B1375BB80CE1BB9E3AC22FBA003F2D10 /* Pods-GeoTrackKitExampleTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GeoTrackKitExampleTests.modulemap"; sourceTree = ""; }; B26C71290D3CEA551B031BD48E2C9CA1 /* GeoTrackMap.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackMap.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/GeoTrackMap.html; sourceTree = ""; }; + B3EDFEDB163D4CAF9E44D89F515AB3AE /* ARCL.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ARCL.xcconfig; sourceTree = ""; }; B5E8AEE12CD6FB4CA4C035C76ECFF326 /* Pods-GeoTrackKitExampleTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GeoTrackKitExampleTests-resources.sh"; sourceTree = ""; }; B73B3D63C89DA41F0C7B06CA73ED298D /* Date.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Date.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Extensions/Date.html; sourceTree = ""; }; B88B57C6B0B35903D95F2966F6D8E0DF /* CLLocation.html */ = {isa = PBXFileReference; includeInIndex = 1; name = CLLocation.html; path = docs/Extensions/CLLocation.html; sourceTree = ""; }; B9B5B44856B2280548450EBBB0DB88A3 /* CGRect.html */ = {isa = PBXFileReference; includeInIndex = 1; name = CGRect.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Extensions/CGRect.html; sourceTree = ""; }; BB003B8849549A818F1302BE15BA4B63 /* jazzy.js */ = {isa = PBXFileReference; includeInIndex = 1; name = jazzy.js; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/js/jazzy.js; sourceTree = ""; }; + BCB81C7421D1D093F10C13DCE02ADF0E /* SCNNode+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SCNNode+Extensions.swift"; path = "ARCL/Source/SCNNode+Extensions.swift"; sourceTree = ""; }; BEE4C97A5A44A6AF1FF8F4F11D051585 /* GeoTrackEvent.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackEvent.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes/GeoTrackEvent.html; sourceTree = ""; }; C04CC35B107B37CA42F960638AA22802 /* GeoTrackKit.tgz */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackKit.tgz; path = docs/docsets/GeoTrackKit.tgz; sourceTree = ""; }; C4A281154DF19127DE2C51C4CE671EF5 /* jazzy.js */ = {isa = PBXFileReference; includeInIndex = 1; name = jazzy.js; path = docs/js/jazzy.js; sourceTree = ""; }; C5A04C84C5C1455273889A2E9D7ED64E /* Pods-GeoTrackKitExampleTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GeoTrackKitExampleTests-umbrella.h"; sourceTree = ""; }; C6F4A534FB7FDA04D9F016EFF1E42788 /* GeoTrackEvent.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackEvent.html; path = docs/Classes/GeoTrackEvent.html; sourceTree = ""; }; + C7175760E70DBC0C749A613721BD92E3 /* SceneKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SceneKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/SceneKit.framework; sourceTree = DEVELOPER_DIR; }; C71E7F16FE55C92C3666B473E63E2C72 /* Enums.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Enums.html; path = docs/Enums.html; sourceTree = ""; }; CA9DC717C08071D4846550E2E73B7586 /* Typealiases.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Typealiases.html; path = docs/Typealiases.html; sourceTree = ""; }; CD9CE7512AD40CB7D2627236A106FD6B /* GeoTrackKit.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackKit.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Extensions/Notification/Name/GeoTrackKit.html; sourceTree = ""; }; CEE865DF231B9C0FB8F007A63B3417D8 /* Functions.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Functions.html; path = docs/Functions.html; sourceTree = ""; }; D393BBA9AAE2702233EB6BA1309144DF /* Classes.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Classes.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Classes.html; sourceTree = ""; }; D3CE0BDA7AC4029FC3116520EA2D5891 /* Functions.html */ = {isa = PBXFileReference; includeInIndex = 1; name = Functions.html; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/Functions.html; sourceTree = ""; }; - D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + D631EF736A5EB90340B0FB6A72FD06D1 /* ARCL.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ARCL.framework; path = ARCL.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D73571F4B2281E0098DC76443D509656 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; D82712CA5EB4A7952F6ACE5E333F0C65 /* GeoTrackKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GeoTrackKit-dummy.m"; sourceTree = ""; }; D8487DF676406564F795C4F5A9181015 /* Pods-GeoTrackKitExample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GeoTrackKitExample-umbrella.h"; sourceTree = ""; }; D9D89312BA8F0914955E2D662762961B /* GeoTrackKit.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackKit.html; path = docs/Extensions/Notification/Name/GeoTrackKit.html; sourceTree = ""; }; @@ -194,7 +238,9 @@ DE4147E0F97F3640242E51024A0A7C5F /* jazzy.css */ = {isa = PBXFileReference; includeInIndex = 1; name = jazzy.css; path = docs/docsets/GeoTrackKit.docset/Contents/Resources/Documents/css/jazzy.css; sourceTree = ""; }; E29269E8A0DBF91E9154A02FD134F9DD /* GeoTrackKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GeoTrackKit.xcconfig; sourceTree = ""; }; E2A18612F549CAF1CDE93535FDE258D4 /* GeoTrackKitError.html */ = {isa = PBXFileReference; includeInIndex = 1; name = GeoTrackKitError.html; path = docs/Enums/GeoTrackKitError.html; sourceTree = ""; }; + E47D071400451536B355EBC5A26E2C5B /* ARCL-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ARCL-umbrella.h"; sourceTree = ""; }; E47F5D29E35074D2FF4C6CC5A01DDD30 /* jazzy.css */ = {isa = PBXFileReference; includeInIndex = 1; name = jazzy.css; path = docs/css/jazzy.css; sourceTree = ""; }; + E55CF15AD847062A0584DF6B1CF84961 /* LocationManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocationManager.swift; path = ARCL/Source/LocationManager.swift; sourceTree = ""; }; E5FBC32CBE64E36B2C49A67BDAE31C67 /* Pods-GeoTrackKitExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GeoTrackKitExampleTests.debug.xcconfig"; sourceTree = ""; }; E72A71BD60815E7A496CC57457735032 /* GeoTrackKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = GeoTrackKit.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; E88E5F4CEE10DCB133FCA08367C9866F /* Pods-GeoTrackKitExample-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GeoTrackKitExample-resources.sh"; sourceTree = ""; }; @@ -207,9 +253,23 @@ F5A61B7B19946F3969B60ED3C2BE5334 /* Pods-GeoTrackKitExample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GeoTrackKitExample-acknowledgements.markdown"; sourceTree = ""; }; F5EEEE304C78B3777B2B756E981E4319 /* Pods-GeoTrackKitExampleTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GeoTrackKitExampleTests-acknowledgements.markdown"; sourceTree = ""; }; FD5A9131E7E07CB56F032CF9A269578D /* badge.svg */ = {isa = PBXFileReference; includeInIndex = 1; name = badge.svg; path = docs/badge.svg; sourceTree = ""; }; + FFD0310533DA024B0BA0DD9AC5DE2878 /* Pods_GeoTrackKitExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_GeoTrackKitExampleTests.framework; path = "Pods-GeoTrackKitExampleTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 009FEB5114EFD3FEA9774585F67B5F15 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7BC649DA0F1FA8CA3638CBCCB42C097E /* ARKit.framework in Frameworks */, + CFD6CB6AA118249C3CDF43EEB829E03C /* CoreLocation.framework in Frameworks */, + 53B8369D4AB3039EA420AEA080C8CBAA /* Foundation.framework in Frameworks */, + 0476386CCDD24035FF46BA085E69ABD1 /* MapKit.framework in Frameworks */, + A861AA5002FDD243CD4103693A0F1F4A /* SceneKit.framework in Frameworks */, + 95EB2446A9F57421A2EA2FC247E5389C /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3AB37733E7E658E1FF90F915BE18F00E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -226,11 +286,11 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EE3D8DEB02BFD255874A4146A6FE9EFC /* Frameworks */ = { + 6B5E8AB8EA8DB8B8286CD57D283F1BB8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 44DF41CD4239BCB0AB861C319774C687 /* Foundation.framework in Frameworks */, + D5B73806799AB2ABFA1EFCE71B47D310 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -246,6 +306,14 @@ path = Analyze; sourceTree = ""; }; + 0F75DF6C7C5F002280EC53F48E80B587 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D4DC2673D61F82023A75FD920E4A2251 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; 1986149EE89CB977E808EF5E53AC061D /* Extension */ = { isa = PBXGroup; children = ( @@ -283,12 +351,18 @@ path = ../..; sourceTree = ""; }; - 44D5347904CF754D6785B84253F2574A /* iOS */ = { + 6841A6C81832DEF798134BA2311512E7 /* Support Files */ = { isa = PBXGroup; children = ( - D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */, + A00EACDF1880CBD4E5E1CC686F337B19 /* ARCL.modulemap */, + B3EDFEDB163D4CAF9E44D89F515AB3AE /* ARCL.xcconfig */, + 98F388A581673D502474498EF5106B16 /* ARCL-dummy.m */, + A8D5C3F5395B08F5986EB8644CCDAAB2 /* ARCL-prefix.pch */, + E47D071400451536B355EBC5A26E2C5B /* ARCL-umbrella.h */, + 73D7FB9486AAE4232D0E1E8D070CE400 /* Info.plist */, ); - name = iOS; + name = "Support Files"; + path = "../Target Support Files/ARCL"; sourceTree = ""; }; 7779C068C3FCCCA3AA16F5DD4A18D156 /* Pods-GeoTrackKitExampleTests */ = { @@ -314,12 +388,21 @@ children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, B0BD10772385D740820F5A1E736BC6C1 /* Development Pods */, - BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, - D722FD01015A9FB70FD69A71455B4B20 /* Products */, + 0F75DF6C7C5F002280EC53F48E80B587 /* Frameworks */, + 7E2EDA46737B4EF998C461A7A1D2EE68 /* Pods */, + F5CA9A59F7E084EE1534A9B515AC4CD4 /* Products */, 96962AD7B88E705590BE96BE65977FA8 /* Targets Support Files */, ); sourceTree = ""; }; + 7E2EDA46737B4EF998C461A7A1D2EE68 /* Pods */ = { + isa = PBXGroup; + children = ( + BD2792A4E425972F874046E435EB1D9B /* ARCL */, + ); + name = Pods; + sourceTree = ""; + }; 8B74EAA9C35A048C4840CDECB112AA9E /* Core */ = { isa = PBXGroup; children = ( @@ -373,12 +456,23 @@ name = "Development Pods"; sourceTree = ""; }; - BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { + BD2792A4E425972F874046E435EB1D9B /* ARCL */ = { isa = PBXGroup; children = ( - 44D5347904CF754D6785B84253F2574A /* iOS */, + 1BF90A7F032E1856B25C16383292CABA /* CGPoint+Extensions.swift */, + 7B2D5D9AAD50FDD2E5ED61B7AA7D0AE3 /* CLLocation+Extensions.swift */, + 0DFEAB87DE66A02705086C1B9B34C01B /* FloatingPoint+Radians.swift */, + E55CF15AD847062A0584DF6B1CF84961 /* LocationManager.swift */, + 14710DC478841B242D3879EDB99F7B0C /* LocationNode.swift */, + 45E5C24FEA4F0A07B6DEEE011E53706A /* SceneLocationEstimate.swift */, + A7EA75D7A9FFD6C07D066AE2A86C258D /* SceneLocationEstimate+Extensions.swift */, + 3618B7E4E4860639AF27AA367DF83CDF /* SceneLocationView.swift */, + BCB81C7421D1D093F10C13DCE02ADF0E /* SCNNode+Extensions.swift */, + 9CD46BC44F1FC85C0C34FAAC2813EAAD /* SCNVector3+Extensions.swift */, + 6841A6C81832DEF798134BA2311512E7 /* Support Files */, ); - name = Frameworks; + name = ARCL; + path = ARCL; sourceTree = ""; }; BD4C9C2C65C52942AEDFE59FBCBA8D4F /* HealthKit */ = { @@ -401,23 +495,26 @@ path = GeoTrackKit/Core/Map; sourceTree = ""; }; - D5A727650B8D4A77790A86BADC52BFBA /* UIModels */ = { + D4DC2673D61F82023A75FD920E4A2251 /* iOS */ = { isa = PBXGroup; children = ( - 0AA65D9A3FD6926B35729C3C4C1D2D61 /* UIGeoTrack.swift */, + 8448C8D3B02A33C992689E219E119203 /* ARKit.framework */, + 893DA6918C0ED7EBDEE9A9C24940A7C5 /* CoreLocation.framework */, + D73571F4B2281E0098DC76443D509656 /* Foundation.framework */, + 5C77626DC61CC820DD862D736C3A8262 /* MapKit.framework */, + C7175760E70DBC0C749A613721BD92E3 /* SceneKit.framework */, + A9C167BE81500CB0164A60D9EEFFBD72 /* UIKit.framework */, ); - name = UIModels; - path = UIModels; + name = iOS; sourceTree = ""; }; - D722FD01015A9FB70FD69A71455B4B20 /* Products */ = { + D5A727650B8D4A77790A86BADC52BFBA /* UIModels */ = { isa = PBXGroup; children = ( - A74DCC49B5EE019AB07F7041F9A2E724 /* GeoTrackKit.framework */, - 08266C21B77FAC5C88D130EB333D1E65 /* Pods_GeoTrackKitExample.framework */, - 749497A9828FCBBC17034E4625532C89 /* Pods_GeoTrackKitExampleTests.framework */, + 0AA65D9A3FD6926B35729C3C4C1D2D61 /* UIGeoTrack.swift */, ); - name = Products; + name = UIModels; + path = UIModels; sourceTree = ""; }; D78DCE3D804E072244A8D4A6CFEF51B6 /* Pod */ = { @@ -539,6 +636,17 @@ path = GeoTrackKit/Core/Models; sourceTree = ""; }; + F5CA9A59F7E084EE1534A9B515AC4CD4 /* Products */ = { + isa = PBXGroup; + children = ( + D631EF736A5EB90340B0FB6A72FD06D1 /* ARCL.framework */, + 4DF451CC30B7AE98BC53CEF34D675382 /* GeoTrackKit.framework */, + 0E43F5DCE1CA439D91E7F4F65798B4AC /* Pods_GeoTrackKitExample.framework */, + FFD0310533DA024B0BA0DD9AC5DE2878 /* Pods_GeoTrackKitExampleTests.framework */, + ); + name = Products; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -550,6 +658,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 5007943225B988E2BD1BCA013D4A7450 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F26B3E04972FA2A0A2EE1E60073EA418 /* ARCL-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6868B586DA1F854DB2D71986E9F34227 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -558,34 +674,53 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EB43AEE93E422F3980816654121F113B /* Headers */ = { + FFA18114B341F5BAF4668AB24701F68B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2C7CAD17AEB336369B54D20343644676 /* Pods-GeoTrackKitExample-umbrella.h in Headers */, + 3826C26206C9EC54B8A2263261D04428 /* Pods-GeoTrackKitExample-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 7B3B0A7AC0B017469EF6A114A90A4715 /* Pods-GeoTrackKitExample */ = { + 66DB58B2315665672D709965248EFEC2 /* Pods-GeoTrackKitExample */ = { isa = PBXNativeTarget; - buildConfigurationList = 29F3B3C58FC092E2DC7843E9BB0F39ED /* Build configuration list for PBXNativeTarget "Pods-GeoTrackKitExample" */; + buildConfigurationList = 77D27432FAD8E696468BE5BB064CA0F0 /* Build configuration list for PBXNativeTarget "Pods-GeoTrackKitExample" */; buildPhases = ( - EB43AEE93E422F3980816654121F113B /* Headers */, - 32B39A375311F9B02AAA464E430437CF /* Sources */, - EE3D8DEB02BFD255874A4146A6FE9EFC /* Frameworks */, - F4FF7A3F4683EC129079979D89FFFBDA /* Resources */, + FFA18114B341F5BAF4668AB24701F68B /* Headers */, + F873D535BC514C94D7AD1D6FEB968214 /* Sources */, + 6B5E8AB8EA8DB8B8286CD57D283F1BB8 /* Frameworks */, + 3B54FD6C5CEC4400187704B82B5968C0 /* Resources */, ); buildRules = ( ); dependencies = ( - 96FF6988F64DBC20D96207F19B26FA9A /* PBXTargetDependency */, + F7B5972B11FD3D59B49A77F479BA2B13 /* PBXTargetDependency */, + 901052064697D9A02452191902C4A168 /* PBXTargetDependency */, ); name = "Pods-GeoTrackKitExample"; productName = "Pods-GeoTrackKitExample"; - productReference = 08266C21B77FAC5C88D130EB333D1E65 /* Pods_GeoTrackKitExample.framework */; + productReference = 0E43F5DCE1CA439D91E7F4F65798B4AC /* Pods_GeoTrackKitExample.framework */; + productType = "com.apple.product-type.framework"; + }; + 9F5FE7984ADAD7AD628D4FB34E7A153B /* ARCL */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75DA467DD6E1A3F486AC85AD4F101F0C /* Build configuration list for PBXNativeTarget "ARCL" */; + buildPhases = ( + 5007943225B988E2BD1BCA013D4A7450 /* Headers */, + 33A32B21D43ADCA068E8268846277181 /* Sources */, + 009FEB5114EFD3FEA9774585F67B5F15 /* Frameworks */, + 3EE830717B755EF1112D653F33BE5051 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ARCL; + productName = ARCL; + productReference = D631EF736A5EB90340B0FB6A72FD06D1 /* ARCL.framework */; productType = "com.apple.product-type.framework"; }; A15198A034D2A91110B26252FF7B5A29 /* Pods-GeoTrackKitExampleTests */ = { @@ -604,7 +739,7 @@ ); name = "Pods-GeoTrackKitExampleTests"; productName = "Pods-GeoTrackKitExampleTests"; - productReference = 749497A9828FCBBC17034E4625532C89 /* Pods_GeoTrackKitExampleTests.framework */; + productReference = FFD0310533DA024B0BA0DD9AC5DE2878 /* Pods_GeoTrackKitExampleTests.framework */; productType = "com.apple.product-type.framework"; }; E65B1BAB10F40A9BC78B80AFB0D9AC55 /* GeoTrackKit */ = { @@ -622,7 +757,7 @@ ); name = GeoTrackKit; productName = GeoTrackKit; - productReference = A74DCC49B5EE019AB07F7041F9A2E724 /* GeoTrackKit.framework */; + productReference = 4DF451CC30B7AE98BC53CEF34D675382 /* GeoTrackKit.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -642,12 +777,13 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = D722FD01015A9FB70FD69A71455B4B20 /* Products */; + productRefGroup = F5CA9A59F7E084EE1534A9B515AC4CD4 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( + 9F5FE7984ADAD7AD628D4FB34E7A153B /* ARCL */, E65B1BAB10F40A9BC78B80AFB0D9AC55 /* GeoTrackKit */, - 7B3B0A7AC0B017469EF6A114A90A4715 /* Pods-GeoTrackKitExample */, + 66DB58B2315665672D709965248EFEC2 /* Pods-GeoTrackKitExample */, A15198A034D2A91110B26252FF7B5A29 /* Pods-GeoTrackKitExampleTests */, ); }; @@ -661,14 +797,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 47C63238E51A3E400452F607E7DA708A /* Resources */ = { + 3B54FD6C5CEC4400187704B82B5968C0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3EE830717B755EF1112D653F33BE5051 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - F4FF7A3F4683EC129079979D89FFFBDA /* Resources */ = { + 47C63238E51A3E400452F607E7DA708A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -678,11 +821,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 32B39A375311F9B02AAA464E430437CF /* Sources */ = { + 33A32B21D43ADCA068E8268846277181 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1F165B3A7C62EAB9AB4E4A7F437272A8 /* Pods-GeoTrackKitExample-dummy.m in Sources */, + E4297551FCBB86F006562F62D3D1A1C5 /* ARCL-dummy.m in Sources */, + 2FFCBF1EFDE0819D86D56EB9EE926E97 /* CGPoint+Extensions.swift in Sources */, + 1731CE474EB724DC9695EA2FC0C784B5 /* CLLocation+Extensions.swift in Sources */, + 860D7E054B462A71CDC25904167CF9A8 /* FloatingPoint+Radians.swift in Sources */, + D594D2C0BBC54276DB1D608F8AA08F0F /* LocationManager.swift in Sources */, + D77AA016B91919A51744DB8F534C3786 /* LocationNode.swift in Sources */, + FC1C8D3AE7A715B62E724DC975CE69FF /* SceneLocationEstimate+Extensions.swift in Sources */, + C6EABF435C6EB4FA7795F928C4F50012 /* SceneLocationEstimate.swift in Sources */, + 1BAC8E580ED1795B4D1AFE7761CDCBD8 /* SceneLocationView.swift in Sources */, + DEA77B7B83D390D37786842982DBBF2A /* SCNNode+Extensions.swift in Sources */, + 86080F5B443E4D05768660C8EF9C0E9F /* SCNVector3+Extensions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -722,24 +875,104 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F873D535BC514C94D7AD1D6FEB968214 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4911D5FFCD72381B9766E1C9752456C1 /* Pods-GeoTrackKitExample-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 2B172144B6D18DE447698EA89F8C63BA /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "Pods-GeoTrackKitExample"; - target = 7B3B0A7AC0B017469EF6A114A90A4715 /* Pods-GeoTrackKitExample */; + target = 66DB58B2315665672D709965248EFEC2 /* Pods-GeoTrackKitExample */; targetProxy = C0D614F836F9D0BBC6CFC757B12CBFB9 /* PBXContainerItemProxy */; }; - 96FF6988F64DBC20D96207F19B26FA9A /* PBXTargetDependency */ = { + 901052064697D9A02452191902C4A168 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GeoTrackKit; target = E65B1BAB10F40A9BC78B80AFB0D9AC55 /* GeoTrackKit */; - targetProxy = C1C6D1CFF223717ED1517481BAFDF918 /* PBXContainerItemProxy */; + targetProxy = F7B4FC51BC528F008CA8E8D4F7F63528 /* PBXContainerItemProxy */; + }; + F7B5972B11FD3D59B49A77F479BA2B13 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ARCL; + target = 9F5FE7984ADAD7AD628D4FB34E7A153B /* ARCL */; + targetProxy = A19AE88CFFF0A0B71E218E0743B19FF2 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + 172E24AAA39E850BE7477755598826A1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7B64FF72DBF7BE18E7422F336B8CA943 /* Pods-GeoTrackKitExample.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-GeoTrackKitExample/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 313E1B2C3BC44B35097A4D5A5714DE49 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B3EDFEDB163D4CAF9E44D89F515AB3AE /* ARCL.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ARCL/ARCL-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ARCL/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ARCL/ARCL.modulemap"; + PRODUCT_MODULE_NAME = ARCL; + PRODUCT_NAME = ARCL; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 3185AB2B459FB32803B102A1BD55BD7A /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = E5FBC32CBE64E36B2C49A67BDAE31C67 /* Pods-GeoTrackKitExampleTests.debug.xcconfig */; @@ -936,12 +1169,10 @@ }; name = Release; }; - 9335C12F91D8F5C456CE7A8AC2BA6BF0 /* Debug */ = { + 99C3619B8FA9F834B55F8387EE04DE50 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7B64FF72DBF7BE18E7422F336B8CA943 /* Pods-GeoTrackKitExample.debug.xcconfig */; + baseConfigurationReference = B3EDFEDB163D4CAF9E44D89F515AB3AE /* ARCL.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -951,60 +1182,24 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GeoTrackKitExample/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/ARCL/ARCL-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ARCL/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/ARCL/ARCL.modulemap"; + PRODUCT_MODULE_NAME = ARCL; + PRODUCT_NAME = ARCL; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - C6AB84A3F873A52A7E02F0A139912224 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9DDD4365E822BA790ED77BDA5A657FDD /* Pods-GeoTrackKitExample.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GeoTrackKitExample/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; E19471FE7E209D0818DAFB22D649A6E9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1071,18 +1266,44 @@ }; name = Debug; }; + E66F8BB5AB4E150600886507E4AEC233 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9DDD4365E822BA790ED77BDA5A657FDD /* Pods-GeoTrackKitExample.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-GeoTrackKitExample/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 29F3B3C58FC092E2DC7843E9BB0F39ED /* Build configuration list for PBXNativeTarget "Pods-GeoTrackKitExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9335C12F91D8F5C456CE7A8AC2BA6BF0 /* Debug */, - C6AB84A3F873A52A7E02F0A139912224 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1101,6 +1322,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 75DA467DD6E1A3F486AC85AD4F101F0C /* Build configuration list for PBXNativeTarget "ARCL" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 99C3619B8FA9F834B55F8387EE04DE50 /* Debug */, + 313E1B2C3BC44B35097A4D5A5714DE49 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 76848A92C5E0F1F29C85EDD17EF75F80 /* Build configuration list for PBXNativeTarget "Pods-GeoTrackKitExampleTests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1110,6 +1340,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 77D27432FAD8E696468BE5BB064CA0F0 /* Build configuration list for PBXNativeTarget "Pods-GeoTrackKitExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 172E24AAA39E850BE7477755598826A1 /* Debug */, + E66F8BB5AB4E150600886507E4AEC233 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; diff --git a/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-dummy.m b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-dummy.m new file mode 100644 index 0000000..dffeaa9 --- /dev/null +++ b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_ARCL : NSObject +@end +@implementation PodsDummy_ARCL +@end diff --git a/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-prefix.pch b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-umbrella.h b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-umbrella.h new file mode 100644 index 0000000..72ab46c --- /dev/null +++ b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double ARCLVersionNumber; +FOUNDATION_EXPORT const unsigned char ARCLVersionString[]; + diff --git a/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL.modulemap b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL.modulemap new file mode 100644 index 0000000..56addf0 --- /dev/null +++ b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL.modulemap @@ -0,0 +1,6 @@ +framework module ARCL { + umbrella header "ARCL-umbrella.h" + + export * + module * { export * } +} diff --git a/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL.xcconfig b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL.xcconfig new file mode 100644 index 0000000..3ce00f5 --- /dev/null +++ b/GeoTrackKitExample/Pods/Target Support Files/ARCL/ARCL.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ARCL +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = -framework "ARKit" -framework "CoreLocation" -framework "Foundation" -framework "MapKit" -framework "SceneKit" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/ARCL +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/GeoTrackKitExample/Pods/Target Support Files/ARCL/Info.plist b/GeoTrackKitExample/Pods/Target Support Files/ARCL/Info.plist new file mode 100644 index 0000000..2660a93 --- /dev/null +++ b/GeoTrackKitExample/Pods/Target Support Files/ARCL/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.4 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-acknowledgements.markdown b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-acknowledgements.markdown index 6504f22..8251ffa 100644 --- a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-acknowledgements.markdown +++ b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-acknowledgements.markdown @@ -1,6 +1,30 @@ # Acknowledgements This application makes use of the following third party libraries: +## ARCL + +MIT License + +Copyright (c) 2017 Project Dent (https://ProjectDent.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ## GeoTrackKit The MIT License (MIT) diff --git a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-acknowledgements.plist b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-acknowledgements.plist index 9b3ba65..484ce54 100644 --- a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-acknowledgements.plist +++ b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-acknowledgements.plist @@ -12,6 +12,36 @@ Type PSGroupSpecifier + + FooterText + MIT License + +Copyright (c) 2017 Project Dent (https://ProjectDent.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + License + MIT + Title + ARCL + Type + PSGroupSpecifier + FooterText The MIT License (MIT) diff --git a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-frameworks.sh b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-frameworks.sh index 243bbae..5a2343f 100755 --- a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-frameworks.sh +++ b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample-frameworks.sh @@ -143,9 +143,11 @@ strip_invalid_archs() { if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/ARCL/ARCL.framework" install_framework "${BUILT_PRODUCTS_DIR}/GeoTrackKit/GeoTrackKit.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/ARCL/ARCL.framework" install_framework "${BUILT_PRODUCTS_DIR}/GeoTrackKit/GeoTrackKit.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then diff --git a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.debug.xcconfig b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.debug.xcconfig index e6e69ac..9fd3de8 100644 --- a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.debug.xcconfig +++ b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.debug.xcconfig @@ -1,9 +1,9 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ARCL" "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit/GeoTrackKit.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "GeoTrackKit" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/ARCL/ARCL.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit/GeoTrackKit.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "ARCL" -framework "GeoTrackKit" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.release.xcconfig b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.release.xcconfig index e6e69ac..9fd3de8 100644 --- a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.release.xcconfig +++ b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExample/Pods-GeoTrackKitExample.release.xcconfig @@ -1,9 +1,9 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ARCL" "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit/GeoTrackKit.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "GeoTrackKit" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/ARCL/ARCL.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit/GeoTrackKit.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "ARCL" -framework "GeoTrackKit" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExampleTests/Pods-GeoTrackKitExampleTests.debug.xcconfig b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExampleTests/Pods-GeoTrackKitExampleTests.debug.xcconfig index 6f67a0d..d8a178d 100644 --- a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExampleTests/Pods-GeoTrackKitExampleTests.debug.xcconfig +++ b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExampleTests/Pods-GeoTrackKitExampleTests.debug.xcconfig @@ -1,7 +1,7 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ARCL" "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit/GeoTrackKit.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/ARCL/ARCL.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit/GeoTrackKit.framework/Headers" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExampleTests/Pods-GeoTrackKitExampleTests.release.xcconfig b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExampleTests/Pods-GeoTrackKitExampleTests.release.xcconfig index 6f67a0d..d8a178d 100644 --- a/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExampleTests/Pods-GeoTrackKitExampleTests.release.xcconfig +++ b/GeoTrackKitExample/Pods/Target Support Files/Pods-GeoTrackKitExampleTests/Pods-GeoTrackKitExampleTests.release.xcconfig @@ -1,7 +1,7 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ARCL" "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit/GeoTrackKit.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/ARCL/ARCL.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GeoTrackKit/GeoTrackKit.framework/Headers" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/.