From 68b34cd8de099ea4a5794b77d52806a124764d3c Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Mon, 10 Jan 2022 06:09:31 +1300 Subject: [PATCH 01/10] New map view --- .../Map/Custom/PositionAnnotationView.swift | 52 +- MeshtasticClient/Views/Map/MapView.swift | 18 +- .../Views/Map/MapViewModule.swift | 746 ++++++++++++++++++ MeshtasticClient/Views/Nodes/NodeMap.swift | 89 ++- .../Views/Settings/AppSettings.swift | 10 +- 5 files changed, 879 insertions(+), 36 deletions(-) create mode 100644 MeshtasticClient/Views/Map/MapViewModule.swift diff --git a/MeshtasticClient/Views/Map/Custom/PositionAnnotationView.swift b/MeshtasticClient/Views/Map/Custom/PositionAnnotationView.swift index 8e97bb98..f00858c6 100644 --- a/MeshtasticClient/Views/Map/Custom/PositionAnnotationView.swift +++ b/MeshtasticClient/Views/Map/Custom/PositionAnnotationView.swift @@ -26,38 +26,38 @@ class PositionAnnotation: NSObject, MKAnnotation { class PositionAnnotationView: MKAnnotationView { private let annotationFrame = CGRect(x: 0, y: 0, width: 32, height: 32) - private let label: UILabel + private let label: UILabel - override init(annotation: MKAnnotation?, reuseIdentifier: String?) { - self.label = UILabel(frame: annotationFrame.offsetBy(dx: 0, dy: 0)) - super.init(annotation: annotation, reuseIdentifier: reuseIdentifier) - self.frame = annotationFrame - self.label.font = UIFont.preferredFont(forTextStyle: .caption2) - self.label.textColor = .white - self.label.textAlignment = .center - self.backgroundColor = .clear - self.addSubview(label) + override init(annotation: MKAnnotation?, reuseIdentifier: String?) { + self.label = UILabel(frame: annotationFrame.offsetBy(dx: 0, dy: 0)) + super.init(annotation: annotation, reuseIdentifier: reuseIdentifier) + self.frame = annotationFrame + self.label.font = UIFont.preferredFont(forTextStyle: .caption2) + self.label.textColor = .white + self.label.textAlignment = .center + self.backgroundColor = .clear + self.addSubview(label) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) not implemented!") + } + + public var name: String = "" { + didSet { + self.label.text = name } + } - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) not implemented!") - } + override func draw(_ rect: CGRect) { + guard let context = UIGraphicsGetCurrentContext() else { return } - public var name: String = "" { - didSet { - self.label.text = name - } - } + let circleRect = CGRect(x: 1, y: 1, width: 30, height: 30) - override func draw(_ rect: CGRect) { - guard let context = UIGraphicsGetCurrentContext() else { return } + context.setFillColor(CGColor(red: 0, green: 0.5, blue: 1.0, alpha: 1.0)) - let circleRect = CGRect(x: 1, y: 1, width: 30, height: 30) + context.fillEllipse(in: circleRect) - context.setFillColor(CGColor(red: 0, green: 0.5, blue: 1.0, alpha: 1.0)) - - context.fillEllipse(in: circleRect) - - } + } } diff --git a/MeshtasticClient/Views/Map/MapView.swift b/MeshtasticClient/Views/Map/MapView.swift index ddc5f896..4f2d6431 100644 --- a/MeshtasticClient/Views/Map/MapView.swift +++ b/MeshtasticClient/Views/Map/MapView.swift @@ -10,13 +10,13 @@ import UIKit import MapKit import SwiftUI import CoreData - +#if false // wrap a MKMapView into something we can use in SwiftUI struct MapView: UIViewRepresentable { var nodes: FetchedResults - weak var mapViewDelegate = MapViewDelegate() + var mapViewDelegate = MapViewDelegate() // observe changes to the key in UserDefaults @AppStorage("meshMapType") var type: String = "hybrid" @@ -36,6 +36,12 @@ struct MapView: UIViewRepresentable { map.register(PositionAnnotationView.self, forAnnotationViewWithReuseIdentifier: NSStringFromClass(PositionAnnotationView.self)) + let overlay = MKTileOverlay(urlTemplate: //"http://tiles-a.data-cdn.linz.govt.nz/services;key=7fa19132d53240708c4ff436df5b9800/tiles/v4/layer=50767/EPSG:3857/{z}/{x}/{y}.png") + "http://10.147.253.250:5050/local/map/{z}/{x}/{y}.png") + overlay.canReplaceMapContent = true + self.mapViewDelegate.renderer = MKTileOverlayRenderer(tileOverlay: overlay) + map.addOverlay(overlay) + return map } @@ -129,6 +135,8 @@ private extension MapView { class MapViewDelegate: NSObject, MKMapViewDelegate { + var renderer: MKTileOverlayRenderer? + func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { guard !annotation.isKind(of: MKUserLocation.self) else { @@ -144,6 +152,11 @@ class MapViewDelegate: NSObject, MKMapViewDelegate { return annotationView } + + func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { + return self.renderer! + + } private func setupPositionAnnotationView(for annotation: PositionAnnotation, on mapView: MKMapView) -> PositionAnnotationView { let identifier = NSStringFromClass(PositionAnnotationView.self) @@ -157,3 +170,4 @@ class MapViewDelegate: NSObject, MKMapViewDelegate { return annotationView } } +#endif diff --git a/MeshtasticClient/Views/Map/MapViewModule.swift b/MeshtasticClient/Views/Map/MapViewModule.swift new file mode 100644 index 00000000..088ff3e2 --- /dev/null +++ b/MeshtasticClient/Views/Map/MapViewModule.swift @@ -0,0 +1,746 @@ +// +// MapView.swift +// MapViewTest +// +// Created by Cem Yilmaz on 05.07.21. +// +import SwiftUI +import MapKit +import CoreData + +#if canImport(MapKit) && canImport(UIKit) +public struct MapView: UIViewRepresentable { + + @Environment(\.managedObjectContext) var context + + //@Binding private var region: MKCoordinateRegion + + private var customMapOverlay: CustomMapOverlay? + @State private var presentCustomMapOverlayHash: CustomMapOverlay? + + private var mapType: MKMapType + + private var showZoomScale: Bool + private var zoomEnabled: Bool + private var zoomRange: (minHeight: CLLocationDistance?, maxHeight: CLLocationDistance?) + + private var scrollEnabled: Bool + private var scrollBoundaries: MKCoordinateRegion? + + private var rotationEnabled: Bool + private var showCompassWhenRotated: Bool + + private var showUserLocation: Bool + private var userTrackingMode: MKUserTrackingMode + @Binding private var userLocation: CLLocationCoordinate2D? + + //private var annotations: [MKPointAnnotation] + + private var overlays: [Overlay] + + @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "lastHeard", ascending: false)], animation: .default) + private var locationNodes: FetchedResults + + public init( + //region: Binding = .constant(MKCoordinateRegion()), + customMapOverlay: CustomMapOverlay? = nil, + //mapType: MKMapType = MKMapType.standard, + mapType: String = "hybrid", + zoomEnabled: Bool = true, + showZoomScale: Bool = false, + zoomRange: (minHeight: CLLocationDistance?, maxHeight: CLLocationDistance?) = (nil, nil), + scrollEnabled: Bool = true, + scrollBoundaries: MKCoordinateRegion? = nil, + rotationEnabled: Bool = true, + showCompassWhenRotated: Bool = true, + showUserLocation: Bool = true, + userTrackingMode: MKUserTrackingMode = MKUserTrackingMode.none, + userLocation: Binding = .constant(nil), + //annotations: [MKPointAnnotation] = [], + //locationNodes: [NodeInfoEntity] = [], + overlays: [Overlay] = [] + ) { + //self._region = region + + self.customMapOverlay = customMapOverlay + + switch mapType { + case "satellite": + self.mapType = .satellite + break + case "standard": + self.mapType = .standard + break + case "hybrid": + self.mapType = .hybrid + break + default: + self.mapType = .hybrid + } + //self.mapType = mapType + + self.showZoomScale = showZoomScale + self.zoomEnabled = zoomEnabled + self.zoomRange = zoomRange + + self.scrollEnabled = scrollEnabled + self.scrollBoundaries = scrollBoundaries + + self.rotationEnabled = rotationEnabled + self.showCompassWhenRotated = showCompassWhenRotated + + self.showUserLocation = showUserLocation + self.userTrackingMode = userTrackingMode + self._userLocation = userLocation + + //self.annotations = annotations + + //self.locationNodes = locationNodes + + self.overlays = overlays + + } + + public func makeUIView(context: Context) -> MKMapView { + let mapView = MKMapView() + mapView.delegate = context.coordinator + mapView.register(PositionAnnotationView.self, forAnnotationViewWithReuseIdentifier: NSStringFromClass(PositionAnnotationView.self)) + + return mapView + } + + public func updateUIView(_ mapView: MKMapView, context: Context) { + + //if self.userTrackingMode == MKUserTrackingMode.none && (mapView.region.center.latitude != self.region.center.latitude || mapView.region.center.longitude != self.region.center.longitude) { + //mapView.region = self.region + //} + + if self.customMapOverlay != self.presentCustomMapOverlayHash { + mapView.removeOverlays(mapView.overlays) + if let customMapOverlay = self.customMapOverlay { + let overlay = CustomMapOverlaySource( + parent: self, + mapName: customMapOverlay.mapName, + tileType: customMapOverlay.tileType, + defaultTile: customMapOverlay.defaultTile + ) + + if let minZ = customMapOverlay.minimumZoomLevel { + overlay.minimumZ = minZ + } + + if let maxZ = customMapOverlay.maximumZoomLevel { + overlay.maximumZ = maxZ + } + + overlay.canReplaceMapContent = customMapOverlay.canReplaceMapContent + + mapView.addOverlay(overlay) + } + DispatchQueue.main.async { + self.presentCustomMapOverlayHash = self.customMapOverlay + } + } + + if mapView.overlays.count != (self.overlays.count + (self.customMapOverlay == nil ? 0 : 1)) { + context.coordinator.overlays = self.overlays + mapView.overlays.forEach { overlay in + if !(overlay is MKTileOverlay) { + mapView.removeOverlay(overlay) + } + } + mapView.addOverlays(self.overlays.map { overlay in overlay.shape }) + } + + if mapView.mapType != self.mapType { + mapView.mapType = self.mapType + } + + mapView.showsScale = self.zoomEnabled ? self.showZoomScale : false + + if mapView.isZoomEnabled != self.zoomEnabled { + mapView.isZoomEnabled = self.zoomEnabled + } + + if mapView.cameraZoomRange.minCenterCoordinateDistance != self.zoomRange.minHeight ?? 0 || + mapView.cameraZoomRange.maxCenterCoordinateDistance != self.zoomRange.maxHeight ?? .infinity { + mapView.cameraZoomRange = MKMapView.CameraZoomRange( + minCenterCoordinateDistance: self.zoomRange.minHeight ?? 0, + maxCenterCoordinateDistance: self.zoomRange.maxHeight ?? .infinity + ) + } + + mapView.isScrollEnabled = self.userTrackingMode == MKUserTrackingMode.none ? self.scrollEnabled : false + + if let scrollBoundary = self.scrollBoundaries, (mapView.cameraBoundary?.region.center.latitude != scrollBoundary.center.latitude || mapView.cameraBoundary?.region.center.longitude != scrollBoundary.center.longitude || mapView.cameraBoundary?.region.span.latitudeDelta != scrollBoundary.span.latitudeDelta || mapView.cameraBoundary?.region.span.longitudeDelta != scrollBoundary.span.longitudeDelta) { + mapView.cameraBoundary = MKMapView.CameraBoundary(coordinateRegion: scrollBoundary) + } else if self.scrollBoundaries == nil && mapView.cameraBoundary != nil { + mapView.cameraBoundary = nil + } + + mapView.isRotateEnabled = self.userTrackingMode != .followWithHeading ? self.rotationEnabled : false + mapView.showsCompass = self.userTrackingMode != .followWithHeading ? self.showCompassWhenRotated : false + + if mapView.showsUserLocation != self.showUserLocation { + mapView.showsUserLocation = self.showUserLocation + } + + if mapView.userTrackingMode != self.userTrackingMode { + mapView.userTrackingMode = self.userTrackingMode + } + + //if mapView.annotations.filter({ annotation in !(annotation is MKUserLocation) }).count != self.annotations.count { + // mapView.removeAnnotations(mapView.annotations) + // mapView.addAnnotations(self.annotations) + //} + + // clear any existing annotations + var shouldMoveRegion = false + if !mapView.annotations.isEmpty { + mapView.removeAnnotations(mapView.annotations) + } else { + shouldMoveRegion = true + } + + for node in self.locationNodes { + // try and get the last position + if (node.positions?.count ?? 0) > 0 && (node.positions!.lastObject as! PositionEntity).coordinate != nil { + let annotation = PositionAnnotation() + annotation.coordinate = (node.positions!.lastObject as! PositionEntity).coordinate! + annotation.title = node.user?.longName ?? "Unknown" + annotation.shortName = node.user?.shortName?.uppercased() ?? "???" + + mapView.addAnnotation(annotation) + } + } + + if shouldMoveRegion { + self.moveToMeshRegion(mapView) + } + + + } + + func moveToMeshRegion(_ mapView: MKMapView) { + //go through the annotations and create a bounding box that encloses them + + var minLat: CLLocationDegrees = 90.0 + var maxLat: CLLocationDegrees = -90.0 + var minLon: CLLocationDegrees = 180.0 + var maxLon: CLLocationDegrees = -180.0 + + for annotation in mapView.annotations { + if annotation.isKind(of: PositionAnnotation.self) { + minLat = min(minLat, annotation.coordinate.latitude) + maxLat = max(maxLat, annotation.coordinate.latitude) + minLon = min(minLon, annotation.coordinate.longitude) + maxLon = max(maxLon, annotation.coordinate.longitude) + } + } + + //check if the mesh region looks sensible before we move to it. Otherwise we won't move the map (leave it at the current location) + if maxLat < minLat || (maxLat-minLat) > 5 || maxLon < minLon || (maxLon-minLon) > 5 { + return + } + + let centerCoord = CLLocationCoordinate2D(latitude: (minLat+maxLat)/2, longitude: (minLon+maxLon)/2) + + let span = MKCoordinateSpan(latitudeDelta: (maxLat-minLat)*1.5, longitudeDelta: (maxLon-minLon)*1.5) + + let region = mapView.regionThatFits(MKCoordinateRegion(center: centerCoord, span: span)) + + mapView.setRegion(region, animated: true) + + + } + + public func makeCoordinator() -> Coordinator { + Coordinator(parent: self) + } + + public class Coordinator: NSObject, MKMapViewDelegate { + + private var parent: MapView + public var overlays: [Overlay] = [] + + init(parent: MapView) { + self.parent = parent + } + + /*public func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) { + DispatchQueue.main.async { + self.parent.region = mapView.region + } + }*/ + + public func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { + + guard !annotation.isKind(of: MKUserLocation.self) else { + // Make a fast exit if the annotation is the `MKUserLocation`, as it's not an annotation view we wish to customize. + return nil + } + + var annotationView: MKAnnotationView? + + if let annotation = annotation as? PositionAnnotation { + let identifier = NSStringFromClass(PositionAnnotationView.self) + + //let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? PositionAnnotationView ?? PositionAnnotationView() + let annotationView = PositionAnnotationView(annotation: annotation, reuseIdentifier: "PositionAnnotation") + + annotationView.name = annotation.shortName ?? "???" + + annotationView.canShowCallout = true + + return annotationView + } + + return annotationView + } + + public func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { + + if let index = self.overlays.firstIndex(where: { overlay_ in overlay_.shape.hash == overlay.hash }) { + + let unwrappedOverlay = self.overlays[index] + + if let circleOverlay = unwrappedOverlay.shape as? MKCircle { + + let renderer = MKCircleRenderer(circle: circleOverlay) + renderer.fillColor = unwrappedOverlay.fillColor + renderer.strokeColor = unwrappedOverlay.strokeColor + renderer.lineWidth = unwrappedOverlay.lineWidth + return renderer + + } else if let polygonOverlay = unwrappedOverlay.shape as? MKPolygon { + + let renderer = MKPolygonRenderer(polygon: polygonOverlay) + renderer.fillColor = unwrappedOverlay.fillColor + renderer.strokeColor = unwrappedOverlay.strokeColor + renderer.lineWidth = unwrappedOverlay.lineWidth + return renderer + + } else if let multiPolygonOverlay = unwrappedOverlay.shape as? MKMultiPolygon { + + let renderer = MKMultiPolygonRenderer(multiPolygon: multiPolygonOverlay) + renderer.fillColor = unwrappedOverlay.fillColor + renderer.strokeColor = unwrappedOverlay.strokeColor + renderer.lineWidth = unwrappedOverlay.lineWidth + return renderer + + } else if let polyLineOverlay = unwrappedOverlay.shape as? MKPolyline { + + let renderer = MKPolylineRenderer(polyline: polyLineOverlay) + renderer.fillColor = unwrappedOverlay.fillColor + renderer.strokeColor = unwrappedOverlay.strokeColor + renderer.lineWidth = unwrappedOverlay.lineWidth + return renderer + + } else if let multiPolylineOverlay = unwrappedOverlay.shape as? MKMultiPolyline { + + let renderer = MKMultiPolylineRenderer(multiPolyline: multiPolylineOverlay) + renderer.fillColor = unwrappedOverlay.fillColor + renderer.strokeColor = unwrappedOverlay.strokeColor + renderer.lineWidth = unwrappedOverlay.lineWidth + return renderer + + } else { + + return MKOverlayRenderer() + + } + + } else if let tileOverlay = overlay as? MKTileOverlay { + + return MKTileOverlayRenderer(tileOverlay: tileOverlay) + + } else { + + return MKOverlayRenderer() + + } + + } + + + + } + + /// is supposed to be located in the folder with the map name + public struct DefaultTile: Hashable { + let tileName: String + let tileType: String + + public init(tileName: String, tileType: String) { + self.tileName = tileName + self.tileType = tileType + } + } + + public struct CustomMapOverlay: Equatable, Hashable { + let mapName: String + let tileType: String + var canReplaceMapContent: Bool + var minimumZoomLevel: Int? + var maximumZoomLevel: Int? + let defaultTile: DefaultTile? + + public init( + mapName: String, + tileType: String, + canReplaceMapContent: Bool = true, // false for transparent tiles + minimumZoomLevel: Int? = nil, + maximumZoomLevel: Int? = nil, + defaultTile: DefaultTile? = nil + ) { + + self.mapName = mapName + self.tileType = tileType + self.canReplaceMapContent = canReplaceMapContent + self.minimumZoomLevel = minimumZoomLevel + self.maximumZoomLevel = maximumZoomLevel + self.defaultTile = defaultTile + } + + public init?( + mapName: String?, + tileType: String, + canReplaceMapContent: Bool = true, // false for transparent tiles + minimumZoomLevel: Int? = nil, + maximumZoomLevel: Int? = nil, + defaultTile: DefaultTile? = nil + ) { + if (mapName == nil || mapName! == "") { + return nil + } + self.mapName = mapName! + self.tileType = tileType + self.canReplaceMapContent = canReplaceMapContent + self.minimumZoomLevel = minimumZoomLevel + self.maximumZoomLevel = maximumZoomLevel + self.defaultTile = defaultTile + } + } + + public class CustomMapOverlaySource: MKTileOverlay { + + // requires folder: tiles/{mapName}/z/y/y,{tileType} + private var parent: MapView + private let mapName: String + private let tileType: String + private let defaultTile: DefaultTile? + + public init( + parent: MapView, + mapName: String, + tileType: String, + defaultTile: DefaultTile? + ) { + self.parent = parent + self.mapName = mapName + self.tileType = tileType + self.defaultTile = defaultTile + super.init(urlTemplate: "") + } + + public override func url(forTilePath path: MKTileOverlayPath) -> URL { + if let tileUrl = Bundle.main.url( + forResource: "\(path.y)", + withExtension: self.tileType, + subdirectory: "tiles/\(self.mapName)/\(path.z)/\(path.x)", + localization: nil + ) { + return tileUrl + } else if let defaultTile = self.defaultTile, let defaultTileUrl = Bundle.main.url( + forResource: defaultTile.tileName, + withExtension: defaultTile.tileType, + subdirectory: "tiles/\(self.mapName)", + localization: nil + ) { + return defaultTileUrl + } else { + let urlstring = self.mapName+"\(path.z)/\(path.x)/\(path.y).png" + return URL(string: urlstring)! + // Bundle.main.url(forResource: "surrounding", withExtension: "png", subdirectory: "tiles")! + } + + } + + } + + public struct Overlay { + + public static func == (lhs: MapView.Overlay, rhs: MapView.Overlay) -> Bool { + // maybe to use in the future for comparison of full array + lhs.shape.coordinate.latitude == rhs.shape.coordinate.latitude && + lhs.shape.coordinate.longitude == rhs.shape.coordinate.longitude && + lhs.fillColor == rhs.fillColor + } + + var shape: MKOverlay + var fillColor: UIColor? + var strokeColor: UIColor? + var lineWidth: CGFloat + + public init( + shape: MKOverlay, + fillColor: UIColor? = nil, + strokeColor: UIColor? = nil, + lineWidth: CGFloat = 0 + ) { + self.shape = shape + self.fillColor = fillColor + self.strokeColor = strokeColor + self.lineWidth = lineWidth + } + } + +} + +// MARK: End of implementation +// MARK: Demonstration +/* +public struct MapViewDemo: View { + + @State private var locationManager: CLLocationManager + + @State private var mapRegion: MKCoordinateRegion = MKCoordinateRegion( + center: CLLocationCoordinate2D( + latitude: -38.758247, + longitude: 175.360208 + ), + span: MKCoordinateSpan( + latitudeDelta: 0.01, + longitudeDelta: 0.01 + ) + ) + + @State private var customMapOverlay: MapView.CustomMapOverlay? + + @State private var mapType: MKMapType = MKMapType.standard + + @State private var zoomEnabled: Bool = true + @State private var showZoomScale: Bool = true + @State private var useMinZoomBoundary: Bool = false + @State private var minZoom: Double = 0 + @State private var useMaxZoomBoundary: Bool = false + @State private var maxZoom: Double = 3000000 + + @State private var scrollEnabled: Bool = true + @State private var useScrollBoundaries: Bool = false + @State private var scrollBoundaries: MKCoordinateRegion = MKCoordinateRegion() + + @State private var rotationEnabled: Bool = true + @State private var showCompassWhenRotated: Bool = true + + @State private var showUserLocation: Bool = true + @State private var userTrackingMode: MKUserTrackingMode = MKUserTrackingMode.none + @State private var userLocation: CLLocationCoordinate2D? + + @State private var showAnnotations: Bool = true + @State private var annotations: [MKPointAnnotation] = [] + + @State private var showOverlays: Bool = true + @State private var overlays: [MapView.Overlay] = [] + + @State private var showMapCenter: Bool = false + + public init() { + self.locationManager = CLLocationManager() + self.locationManager.requestWhenInUseAuthorization() + } + + public var body: some View { + + NavigationView { + + List { + + Section(header: Text("Scroll")) { + Toggle("Scroll enabled", isOn: self.$scrollEnabled) + Toggle("Use scroll boundaries", isOn: self.$useScrollBoundaries) + .onChange(of: self.useScrollBoundaries) { newValue in + if newValue { + self.scrollBoundaries = MKCoordinateRegion(center: self.mapRegion.center, span: MKCoordinateSpan()) + } + } + if self.useScrollBoundaries { + VStack(alignment: .leading) { + Text(String(format: "Vertical distance to center: %.2f m", self.scrollBoundaries.span.latitudeDelta * 10609)) + Slider(value: self.$scrollBoundaries.span.latitudeDelta, in: 0...(300/10609)) + } + VStack(alignment: .leading) { + Text(String(format: "Horizontal distance to center: %.2f m", self.self.scrollBoundaries.span.longitudeDelta * 10609)) + Slider(value: self.$scrollBoundaries.span.longitudeDelta, in: 0...(300/10609)) + } + } + } + + Section(header: Text("Zoom")) { + Toggle("Zoom enabled", isOn: self.$zoomEnabled) + Toggle("Show zoom scale", isOn: self.$showZoomScale) + Toggle("Use minimum zoom boundary", isOn: self.$useMinZoomBoundary) + if self.useMinZoomBoundary { + VStack(alignment: .leading) { + Text(String(format: "Minimum Height: %.2f m", self.minZoom)) + Slider(value: self.$minZoom, in: 0...(self.useMaxZoomBoundary ? self.maxZoom : 3000000), step: 10) + } + } + Toggle("Use maximum zoom boundary", isOn: self.$useMaxZoomBoundary) + if self.useMaxZoomBoundary { + VStack(alignment: .leading) { + Text(String(format: "Maximum Height: %.2f m", self.maxZoom)) + Slider(value: self.$maxZoom, in: (self.useMinZoomBoundary ? self.minZoom : 0)...3000000, step: 10) + } + } + } + + Section(header: Text("Rotation")) { + Toggle("Rotation enabled", isOn: self.$rotationEnabled) + Toggle("Show compass when rotated", isOn: self.$showCompassWhenRotated) + } + + Section { + Toggle("Show map Center", isOn: self.$showMapCenter) + } + + Section(header: Text("User Location")) { + Toggle("Show User Location", isOn: self.$showUserLocation) + Picker("Follow Mode", selection: self.$userTrackingMode) { + Text("Nicht folgen").tag(MKUserTrackingMode.none) + Text("Folgen").tag(MKUserTrackingMode.follow) + Text("Richtung folgen").tag(MKUserTrackingMode.followWithHeading) + }.pickerStyle(MenuPickerStyle()) + + } + + Section(header: Text("Annotations")) { + Toggle("Show Annotations", isOn: self.$showAnnotations) + Button("Add Annotation") { + let annotation = MKPointAnnotation() + annotation.coordinate = self.mapRegion.center + annotation.title = "Title" + annotation.subtitle = "Subtitle" + self.annotations.append(annotation) + } + + Button("Delete all") { self.annotations = [] }.foregroundColor(.red) + } + + Section(header: Text("Overlays")) { + Toggle("Show Overlays", isOn: self.$showOverlays) + Button("Add circle") { + self.overlays.append(MapView.Overlay( + shape: MKCircle( + center: self.mapRegion.center, + radius: 20 + ), + strokeColor: UIColor.systemBlue, + lineWidth: 10 + )) + } + + Button("Delete all") { self.overlays = [] }.foregroundColor(.red) + } + + Section(header: Text("Custom Map Overlay")) { + Button("Keine") { self.customMapOverlay = nil } + Button("OSM Online") { + self.customMapOverlay = MapView.CustomMapOverlay( + mapName: "https://tile.openstreetmap.org/", + tileType: "png", + canReplaceMapContent: true + ) + } + Button("Farm Map") { + self.customMapOverlay = MapView.CustomMapOverlay( + mapName: "http://10.147.253.250:5050/local/map/", + tileType: "png", + canReplaceMapContent: true + ) + } + } + + }.listStyle(GroupedListStyle()) + .navigationBarTitle("Map Configuration", displayMode: NavigationBarItem.TitleDisplayMode.inline) + + ZStack { + + MapView( + region: self.$mapRegion, + customMapOverlay: self.customMapOverlay, + mapType: self.mapType, + zoomEnabled: self.zoomEnabled, + showZoomScale: self.showZoomScale, + zoomRange: (minHeight: self.useMinZoomBoundary ? self.minZoom : 0, maxHeight: self.useMaxZoomBoundary ? self.maxZoom : .infinity), + scrollEnabled: self.scrollEnabled, + scrollBoundaries: self.useScrollBoundaries ? self.scrollBoundaries : nil, + rotationEnabled: self.rotationEnabled, + showCompassWhenRotated: self.showCompassWhenRotated, + showUserLocation: self.showUserLocation, + userTrackingMode: self.userTrackingMode, + userLocation: self.$userLocation, + annotations: self.showAnnotations ? self.annotations : [], + overlays: self.showOverlays ? self.overlays : [] + ) + + VStack { + + Spacer() + + HStack { + if let userLocation = self.userLocation, self.showUserLocation { + VStack(alignment: .leading) { + Button("Center user location") { + self.mapRegion.center = userLocation + } + Text("User Location").bold() + Text("\(userLocation.latitude)") + Text("\(userLocation.longitude)") + } + } + + Spacer() + + VStack(alignment: .leading) { + Text("Map Center").bold() + Text("\(self.mapRegion.center.latitude)") + Text("\(self.mapRegion.center.longitude)") + } + } + + Picker("", selection: self.$mapType) { + Text("Standard").tag(MKMapType.standard) + Text("Muted Standard").tag(MKMapType.mutedStandard) + Text("Satellite").tag(MKMapType.satellite) + Text("Satellite Flyover").tag(MKMapType.satelliteFlyover) + Text("Hybrid").tag(MKMapType.hybrid) + Text("Hybrid Flyover").tag(MKMapType.hybridFlyover) + }.pickerStyle(SegmentedPickerStyle()) + + if self.showMapCenter { + Circle().frame(width: 8, height: 8).foregroundColor(.red) + } + + }.padding() + + }.navigationBarTitle("SwiftUI MapView", displayMode: NavigationBarItem.TitleDisplayMode.inline) + .ignoresSafeArea(edges: .bottom) + + } + + } + +} + + +public struct MapView_Previews: PreviewProvider { + + public static var previews: some View { + + MapViewDemo() + + } + +}*/ +#endif diff --git a/MeshtasticClient/Views/Nodes/NodeMap.swift b/MeshtasticClient/Views/Nodes/NodeMap.swift index 6fc93b3e..5d1ba62e 100644 --- a/MeshtasticClient/Views/Nodes/NodeMap.swift +++ b/MeshtasticClient/Views/Nodes/NodeMap.swift @@ -16,25 +16,100 @@ struct NodeMap: View { @Environment(\.managedObjectContext) var context @EnvironmentObject var bleManager: BLEManager - // @AppStorage("meshMapType") var meshMapType: String = "hybrid" - + @AppStorage("meshMapType") var type: String = "hybrid" + @AppStorage("meshMapCustomTileServer") var customTileServer: String = "" { + didSet { + if customTileServer == "" { + self.customMapOverlay = nil + } else { + self.customMapOverlay = MapView.CustomMapOverlay( + mapName: customTileServer, + tileType: "png", + canReplaceMapContent: true + ) + } + } + } + @State private var showLabels: Bool = false - @State private var annotationItems: [MapLocation] = [] - @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \NodeInfoEntity.lastHeard, ascending: false)], animation: .default) + //@State private var annotationItems: [MapLocation] = [] + //@FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \NodeInfoEntity.lastHeard, ascending: false)], animation: .default) + //private var locationNodes: FetchedResults - private var locationNodes: FetchedResults + /*@State private var mapRegion: MKCoordinateRegion = MKCoordinateRegion( + center: CLLocationCoordinate2D( + latitude: -38.758247, + longitude: 175.360208 + ), + span: MKCoordinateSpan( + latitudeDelta: 0.01, + longitudeDelta: 0.01 + ) + )*/ + + @State private var customMapOverlay: MapView.CustomMapOverlay? = MapView.CustomMapOverlay( + mapName: UserDefaults.standard.string(forKey: "meshMapCustomTileServer"), + tileType: "png", + canReplaceMapContent: true + ) + //@State private var mapType: MKMapType = MKMapType.standard + + @State private var zoomEnabled: Bool = true + @State private var showZoomScale: Bool = true + @State private var useMinZoomBoundary: Bool = false + @State private var minZoom: Double = 0 + @State private var useMaxZoomBoundary: Bool = false + @State private var maxZoom: Double = 3000000 + + @State private var scrollEnabled: Bool = true + @State private var useScrollBoundaries: Bool = false + @State private var scrollBoundaries: MKCoordinateRegion = MKCoordinateRegion() + + @State private var rotationEnabled: Bool = true + @State private var showCompassWhenRotated: Bool = true + + @State private var showUserLocation: Bool = true + @State private var userTrackingMode: MKUserTrackingMode = MKUserTrackingMode.none + @State private var userLocation: CLLocationCoordinate2D? + + @State private var showAnnotations: Bool = true + @State private var annotations: [MKPointAnnotation] = [] + + @State private var showOverlays: Bool = true + @State private var overlays: [MapView.Overlay] = [] + + @State private var showMapCenter: Bool = false + var body: some View { - let location = LocationHelper.currentLocation + //let location = LocationHelper.currentLocation NavigationView { ZStack { - MapView(nodes: self.locationNodes)//.environmentObject(bleManager) + //MapView(nodes: self.locationNodes)//.environmentObject(bleManager) // } + MapView( + //region: self.$mapRegion, + customMapOverlay: self.customMapOverlay, + mapType: self.type, + zoomEnabled: self.zoomEnabled, + showZoomScale: self.showZoomScale, + zoomRange: (minHeight: self.useMinZoomBoundary ? self.minZoom : 0, maxHeight: self.useMaxZoomBoundary ? self.maxZoom : .infinity), + scrollEnabled: self.scrollEnabled, + scrollBoundaries: self.useScrollBoundaries ? self.scrollBoundaries : nil, + rotationEnabled: self.rotationEnabled, + showCompassWhenRotated: self.showCompassWhenRotated, + showUserLocation: self.showUserLocation, + userTrackingMode: self.userTrackingMode, + userLocation: self.$userLocation, + //annotations: self.annotations, + overlays: self.overlays + ) + .frame(maxHeight: .infinity) .ignoresSafeArea(.all, edges: [.leading, .trailing]) } diff --git a/MeshtasticClient/Views/Settings/AppSettings.swift b/MeshtasticClient/Views/Settings/AppSettings.swift index 98690e2a..ad654ee8 100644 --- a/MeshtasticClient/Views/Settings/AppSettings.swift +++ b/MeshtasticClient/Views/Settings/AppSettings.swift @@ -90,6 +90,12 @@ class UserSettings: ObservableObject { UserDefaults.standard.set(meshMapType, forKey: "meshMapType") } } + + @Published var meshMapCustomTileServer: String { + didSet { + UserDefaults.standard.set(meshMapCustomTileServer, forKey: "meshMapCustomTileServer") + } + } init() { @@ -100,6 +106,7 @@ class UserSettings: ObservableObject { self.keyboardType = UserDefaults.standard.object(forKey: "keyboardType") as? Int ?? 0 self.meshActivityLog = UserDefaults.standard.object(forKey: "meshActivityLog") as? Bool ?? false self.meshMapType = UserDefaults.standard.string(forKey: "meshMapType") ?? "hybrid" + self.meshMapCustomTileServer = UserDefaults.standard.string(forKey: "meshMapCustomTileServer") ?? "" } } @@ -171,12 +178,13 @@ struct AppSettings: View { } } Section(header: Text("MAP OPTIONS")) { - Picker("Map Type", selection: $userSettings.meshMapType) { + Picker("Base Map (Apple)", selection: $userSettings.meshMapType) { ForEach(MeshMapType.allCases) { map in Text(map.description) } } .pickerStyle(DefaultPickerStyle()) + TextField("Custom Tile Server", text: $userSettings.meshMapCustomTileServer) } } } From 26d934a98964133852f6c0ebbd6f15b4b0643bb3 Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Mon, 10 Jan 2022 06:18:20 +1300 Subject: [PATCH 02/10] Update project file --- Meshtastic Client.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Meshtastic Client.xcodeproj/project.pbxproj b/Meshtastic Client.xcodeproj/project.pbxproj index 98ec63f9..452bc4da 100644 --- a/Meshtastic Client.xcodeproj/project.pbxproj +++ b/Meshtastic Client.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ C9483F6D2773017500998F6B /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9483F6C2773017500998F6B /* MapView.swift */; }; C9A7BC1027759A9600760B50 /* PositionAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */; }; + C9A88B55278B503C00BD810A /* MapViewModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A88B54278B503C00BD810A /* MapViewModule.swift */; }; DD17E5DD277D49D400010EC2 /* apponly.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD17E5DB277D49D400010EC2 /* apponly.pb.swift */; }; DD17E5DE277D49D400010EC2 /* storeforward.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD17E5DC277D49D400010EC2 /* storeforward.pb.swift */; }; DD1BF2F92776FE2E008C8D2F /* UserMessageList.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1BF2F82776FE2E008C8D2F /* UserMessageList.swift */; }; @@ -74,6 +75,7 @@ /* Begin PBXFileReference section */ C9483F6C2773017500998F6B /* MapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = ""; }; C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionAnnotationView.swift; sourceTree = ""; }; + C9A88B54278B503C00BD810A /* MapViewModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewModule.swift; sourceTree = ""; }; DD17E5DB277D49D400010EC2 /* apponly.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = apponly.pb.swift; sourceTree = ""; }; DD17E5DC277D49D400010EC2 /* storeforward.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = storeforward.pb.swift; sourceTree = ""; }; DD1BF2F82776FE2E008C8D2F /* UserMessageList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserMessageList.swift; sourceTree = ""; }; @@ -156,6 +158,7 @@ children = ( C9A7BC0E27759A6800760B50 /* Custom */, C9483F6C2773017500998F6B /* MapView.swift */, + C9A88B54278B503C00BD810A /* MapViewModule.swift */, ); path = Map; sourceTree = ""; @@ -544,6 +547,7 @@ DD47E3D626F17ED900029299 /* CircleText.swift in Sources */, DDC2E18F26CE25FE0042C5E4 /* ContentView.swift in Sources */, DD17E5DE277D49D400010EC2 /* storeforward.pb.swift in Sources */, + C9A88B55278B503C00BD810A /* MapViewModule.swift in Sources */, DDAF8C6326ED0A230058C060 /* admin.pb.swift in Sources */, C9483F6D2773017500998F6B /* MapView.swift in Sources */, DDAF8C5826ED07FD0058C060 /* mesh.pb.swift in Sources */, From f013dbe4a4d04f84cc7ab2f703f7c530314e5774 Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Mon, 10 Jan 2022 06:33:32 +1300 Subject: [PATCH 03/10] WIP --- Meshtastic Client.xcodeproj/project.pbxproj | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Meshtastic Client.xcodeproj/project.pbxproj b/Meshtastic Client.xcodeproj/project.pbxproj index 452bc4da..95d2dae7 100644 --- a/Meshtastic Client.xcodeproj/project.pbxproj +++ b/Meshtastic Client.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ C9483F6D2773017500998F6B /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9483F6C2773017500998F6B /* MapView.swift */; }; C9A7BC1027759A9600760B50 /* PositionAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */; }; C9A88B55278B503C00BD810A /* MapViewModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A88B54278B503C00BD810A /* MapViewModule.swift */; }; - DD17E5DD277D49D400010EC2 /* apponly.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD17E5DB277D49D400010EC2 /* apponly.pb.swift */; }; DD17E5DE277D49D400010EC2 /* storeforward.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD17E5DC277D49D400010EC2 /* storeforward.pb.swift */; }; DD1BF2F92776FE2E008C8D2F /* UserMessageList.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1BF2F82776FE2E008C8D2F /* UserMessageList.swift */; }; DD23A50F26FD1B4400D9B90C /* PeripheralModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD23A50E26FD1B4400D9B90C /* PeripheralModel.swift */; }; @@ -76,7 +75,6 @@ C9483F6C2773017500998F6B /* MapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = ""; }; C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionAnnotationView.swift; sourceTree = ""; }; C9A88B54278B503C00BD810A /* MapViewModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewModule.swift; sourceTree = ""; }; - DD17E5DB277D49D400010EC2 /* apponly.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = apponly.pb.swift; sourceTree = ""; }; DD17E5DC277D49D400010EC2 /* storeforward.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = storeforward.pb.swift; sourceTree = ""; }; DD1BF2F82776FE2E008C8D2F /* UserMessageList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserMessageList.swift; sourceTree = ""; }; DD23A50E26FD1B4400D9B90C /* PeripheralModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeripheralModel.swift; sourceTree = ""; }; @@ -209,7 +207,6 @@ DDAF8C5626ED07740058C060 /* Protobufs */ = { isa = PBXGroup; children = ( - DD17E5DB277D49D400010EC2 /* apponly.pb.swift */, DD17E5DC277D49D400010EC2 /* storeforward.pb.swift */, DDAF8C5E26ED09B50058C060 /* radioconfig.pb.swift */, DDAF8C6426ED0A490058C060 /* channel.pb.swift */, @@ -557,7 +554,6 @@ DD8169F9271F1A6100F4AB02 /* MeshLogger.swift in Sources */, DD539502276DAA6A00AD86B1 /* MapLocation.swift in Sources */, DDAF8C6726ED0C8C0058C060 /* remote_hardware.pb.swift in Sources */, - DD17E5DD277D49D400010EC2 /* apponly.pb.swift in Sources */, DDAF8C6526ED0A490058C060 /* channel.pb.swift in Sources */, DD47E3DD26F390A000029299 /* Messages.swift in Sources */, DDC2E15826CE248E0042C5E4 /* MeshtasticClientApp.swift in Sources */, @@ -723,7 +719,7 @@ CODE_SIGN_ENTITLEMENTS = MeshtasticClient/MeshtasticClient.entitlements; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_ASSET_PATHS = "\"MeshtasticClient/Preview Content\""; - DEVELOPMENT_TEAM = GCH7VS5Y9R; + DEVELOPMENT_TEAM = 37C534H572; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = MeshtasticClient/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -750,7 +746,7 @@ CODE_SIGN_ENTITLEMENTS = MeshtasticClient/MeshtasticClient.entitlements; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_ASSET_PATHS = "\"MeshtasticClient/Preview Content\""; - DEVELOPMENT_TEAM = GCH7VS5Y9R; + DEVELOPMENT_TEAM = 37C534H572; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = MeshtasticClient/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; From 54f160eab2f2e14bc83003905059656c9ea65e65 Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Mon, 10 Jan 2022 06:41:22 +1300 Subject: [PATCH 04/10] Add apponly.pb that mysteriously disappeared --- Meshtastic Client.xcodeproj/project.pbxproj | 4 ++++ .../UserInterfaceState.xcuserstate | Bin 48402 -> 48924 bytes 2 files changed, 4 insertions(+) diff --git a/Meshtastic Client.xcodeproj/project.pbxproj b/Meshtastic Client.xcodeproj/project.pbxproj index a63a243f..9bb595da 100644 --- a/Meshtastic Client.xcodeproj/project.pbxproj +++ b/Meshtastic Client.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ C9483F6D2773017500998F6B /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9483F6C2773017500998F6B /* MapView.swift */; }; C9A7BC1027759A9600760B50 /* PositionAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */; }; C9A88B55278B503C00BD810A /* MapViewModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A88B54278B503C00BD810A /* MapViewModule.swift */; }; + C9A88B57278B559900BD810A /* apponly.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A88B56278B559900BD810A /* apponly.pb.swift */; }; DD17E5DE277D49D400010EC2 /* storeforward.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD17E5DC277D49D400010EC2 /* storeforward.pb.swift */; }; DD1BF2F92776FE2E008C8D2F /* UserMessageList.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1BF2F82776FE2E008C8D2F /* UserMessageList.swift */; }; DD23A50F26FD1B4400D9B90C /* PeripheralModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD23A50E26FD1B4400D9B90C /* PeripheralModel.swift */; }; @@ -75,6 +76,7 @@ C9483F6C2773017500998F6B /* MapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = ""; }; C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionAnnotationView.swift; sourceTree = ""; }; C9A88B54278B503C00BD810A /* MapViewModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewModule.swift; sourceTree = ""; }; + C9A88B56278B559900BD810A /* apponly.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = apponly.pb.swift; sourceTree = ""; }; DD17E5DC277D49D400010EC2 /* storeforward.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = storeforward.pb.swift; sourceTree = ""; }; DD1BF2F82776FE2E008C8D2F /* UserMessageList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserMessageList.swift; sourceTree = ""; }; DD23A50E26FD1B4400D9B90C /* PeripheralModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeripheralModel.swift; sourceTree = ""; }; @@ -207,6 +209,7 @@ DDAF8C5626ED07740058C060 /* Protobufs */ = { isa = PBXGroup; children = ( + C9A88B56278B559900BD810A /* apponly.pb.swift */, DD17E5DC277D49D400010EC2 /* storeforward.pb.swift */, DDAF8C5E26ED09B50058C060 /* radioconfig.pb.swift */, DDAF8C6426ED0A490058C060 /* channel.pb.swift */, @@ -550,6 +553,7 @@ DDAF8C5826ED07FD0058C060 /* mesh.pb.swift in Sources */, DD8169FB271F1F3A00F4AB02 /* MeshLog.swift in Sources */, DD2E65262767A01F00E45FC5 /* NodeDetail.swift in Sources */, + C9A88B57278B559900BD810A /* apponly.pb.swift in Sources */, DD47E3D926F3093800029299 /* MessageBubble.swift in Sources */, DD8169F9271F1A6100F4AB02 /* MeshLogger.swift in Sources */, DD539502276DAA6A00AD86B1 /* MapLocation.swift in Sources */, diff --git a/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate b/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate index c864b6bced4699ee3447fb57884461b74e50ef5e..89d39f915875b69d2bc7a27bd6a67505067c4710 100644 GIT binary patch delta 23405 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 From 6d90211ab516c4d9bf2c102f657ce416684f8e64 Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Mon, 10 Jan 2022 19:23:30 +1300 Subject: [PATCH 05/10] Use location manager to show user location on the map --- MeshtasticClient/Views/Nodes/NodeMap.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MeshtasticClient/Views/Nodes/NodeMap.swift b/MeshtasticClient/Views/Nodes/NodeMap.swift index 5d1ba62e..2e1123b4 100644 --- a/MeshtasticClient/Views/Nodes/NodeMap.swift +++ b/MeshtasticClient/Views/Nodes/NodeMap.swift @@ -72,7 +72,7 @@ struct NodeMap: View { @State private var showUserLocation: Bool = true @State private var userTrackingMode: MKUserTrackingMode = MKUserTrackingMode.none - @State private var userLocation: CLLocationCoordinate2D? + @State private var userLocation: CLLocationCoordinate2D? = LocationHelper.currentLocation @State private var showAnnotations: Bool = true @State private var annotations: [MKPointAnnotation] = [] @@ -84,7 +84,7 @@ struct NodeMap: View { var body: some View { - //let location = LocationHelper.currentLocation + //self.$userLocation = LocationHelper.currentLocation NavigationView { From b492113c021258e5e0f78bccde8e75e3671ba5d6 Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Sun, 16 Jan 2022 05:48:02 +1300 Subject: [PATCH 06/10] Basic map is working. ABout to start on offline --- .../UserInterfaceState.xcuserstate | Bin 48924 -> 67549 bytes .../Views/Map/MapViewModule.swift | 19 +++++++++++++++++- MeshtasticClient/Views/Nodes/NodeMap.swift | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate b/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate index 89d39f915875b69d2bc7a27bd6a67505067c4710..85e4e4d5c2962ae21b71d9d554869200c1036c6e 100644 GIT binary patch literal 67549 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

ceJjLU`7wH5+igO; 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 literal 48924 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 f=hr*yBlT + //@State private var locationNodes: [NodeInfoEntity] + public init( //region: Binding = .constant(MKCoordinateRegion()), customMapOverlay: CustomMapOverlay? = nil, @@ -95,7 +97,7 @@ public struct MapView: UIViewRepresentable { //self.annotations = annotations - //self.locationNodes = locationNodes + self.locationNodes = locationNodes self.overlays = overlays @@ -106,9 +108,24 @@ public struct MapView: UIViewRepresentable { mapView.delegate = context.coordinator mapView.register(PositionAnnotationView.self, forAnnotationViewWithReuseIdentifier: NSStringFromClass(PositionAnnotationView.self)) + Timer.scheduledTimer(withTimeInterval: 10, repeats: true) { timer in + for node in self.locationNodes { + // try and get the last position + if (node.positions?.count ?? 0) > 0 && (node.positions!.lastObject as! PositionEntity).coordinate != nil { + let annotation = PositionAnnotation() + annotation.coordinate = (node.positions!.lastObject as! PositionEntity).coordinate! + annotation.title = node.user?.longName ?? "Unknown" + annotation.shortName = node.user?.shortName?.uppercased() ?? "???" + + mapView.addAnnotation(annotation) + } + } + } + return mapView } + public func updateUIView(_ mapView: MKMapView, context: Context) { //if self.userTrackingMode == MKUserTrackingMode.none && (mapView.region.center.latitude != self.region.center.latitude || mapView.region.center.longitude != self.region.center.longitude) { diff --git a/MeshtasticClient/Views/Nodes/NodeMap.swift b/MeshtasticClient/Views/Nodes/NodeMap.swift index 2e1123b4..b9cc26b1 100644 --- a/MeshtasticClient/Views/Nodes/NodeMap.swift +++ b/MeshtasticClient/Views/Nodes/NodeMap.swift @@ -107,6 +107,7 @@ struct NodeMap: View { userTrackingMode: self.userTrackingMode, userLocation: self.$userLocation, //annotations: self.annotations, + //locationNodes: self.locationNodes.map({ nodeinfo in return nodeinfo }), overlays: self.overlays ) From 3a828ee0ff70e71c6e7686c22912e44cbe888757 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 16 Jan 2022 16:58:23 -0800 Subject: [PATCH 07/10] Try passing context into map view --- MeshtasticClient/Views/Map/MapViewModule.swift | 9 ++++++--- MeshtasticClient/Views/Nodes/NodeMap.swift | 6 ++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/MeshtasticClient/Views/Map/MapViewModule.swift b/MeshtasticClient/Views/Map/MapViewModule.swift index dddcc826..adb33419 100644 --- a/MeshtasticClient/Views/Map/MapViewModule.swift +++ b/MeshtasticClient/Views/Map/MapViewModule.swift @@ -11,7 +11,9 @@ import CoreData #if canImport(MapKit) && canImport(UIKit) public struct MapView: UIViewRepresentable { - @Environment(\.managedObjectContext) var context + //@Environment(\.managedObjectContext) var context + + var context: NSManagedObjectContext? //@Binding private var region: MKCoordinateRegion @@ -60,7 +62,8 @@ public struct MapView: UIViewRepresentable { userLocation: Binding = .constant(nil), //annotations: [MKPointAnnotation] = [], //locationNodes: [NodeInfoEntity] = [], - overlays: [Overlay] = [] + overlays: [Overlay] = [], + context: NSManagedObjectContext? = nil ) { //self._region = region @@ -97,7 +100,7 @@ public struct MapView: UIViewRepresentable { //self.annotations = annotations - self.locationNodes = locationNodes + //self.locationNodes = locationNodes self.overlays = overlays diff --git a/MeshtasticClient/Views/Nodes/NodeMap.swift b/MeshtasticClient/Views/Nodes/NodeMap.swift index b9cc26b1..fd4517f4 100644 --- a/MeshtasticClient/Views/Nodes/NodeMap.swift +++ b/MeshtasticClient/Views/Nodes/NodeMap.swift @@ -108,14 +108,16 @@ struct NodeMap: View { userLocation: self.$userLocation, //annotations: self.annotations, //locationNodes: self.locationNodes.map({ nodeinfo in return nodeinfo }), - overlays: self.overlays + overlays: self.overlays, + context: self.context ) - + .frame(maxHeight: .infinity) .ignoresSafeArea(.all, edges: [.leading, .trailing]) } .navigationTitle("Mesh Map") .navigationBarTitleDisplayMode(.inline) + .navigationBarItems(trailing: ZStack { From fae46080c7c692e2db22aacff45fde9236c6787c Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Mon, 17 Jan 2022 14:03:48 +1300 Subject: [PATCH 08/10] Local MBTiles source --- Meshtastic Client.xcodeproj/project.pbxproj | 33 ++++++++ .../xcshareddata/swiftpm/Package.resolved | 9 +++ .../UserInterfaceState.xcuserstate | Bin 67549 -> 100418 bytes MeshtasticClient/Info.plist | 41 +++++++++- MeshtasticClient/MTAppDelegate.swift | 28 +++++++ MeshtasticClient/MeshtasticClientApp.swift | 2 + .../Views/Map/LocalMBTileOverlay.swift | 72 ++++++++++++++++++ .../Views/Map/MapViewModule.swift | 18 +---- MeshtasticClient/Views/Nodes/NodeMap.swift | 2 +- 9 files changed, 188 insertions(+), 17 deletions(-) create mode 100644 MeshtasticClient/MTAppDelegate.swift create mode 100644 MeshtasticClient/Views/Map/LocalMBTileOverlay.swift diff --git a/Meshtastic Client.xcodeproj/project.pbxproj b/Meshtastic Client.xcodeproj/project.pbxproj index 1a2e70d0..84f3004b 100644 --- a/Meshtastic Client.xcodeproj/project.pbxproj +++ b/Meshtastic Client.xcodeproj/project.pbxproj @@ -8,6 +8,10 @@ /* Begin PBXBuildFile section */ C9483F6D2773017500998F6B /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9483F6C2773017500998F6B /* MapView.swift */; }; + C9697F9B2793366500250207 /* offline_map.mbtiles in Resources */ = {isa = PBXBuildFile; fileRef = C9697F9A2793366500250207 /* offline_map.mbtiles */; }; + C9697F9D279336B700250207 /* LocalMBTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */; }; + C9697FA527933B8C00250207 /* SQLite in Frameworks */ = {isa = PBXBuildFile; productRef = C9697FA427933B8C00250207 /* SQLite */; }; + C9697FA72793F9FB00250207 /* MTAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9697FA62793F9FB00250207 /* MTAppDelegate.swift */; }; C9A7BC1027759A9600760B50 /* PositionAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */; }; C9A88B55278B503C00BD810A /* MapViewModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A88B54278B503C00BD810A /* MapViewModule.swift */; }; C9A88B57278B559900BD810A /* apponly.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A88B56278B559900BD810A /* apponly.pb.swift */; }; @@ -74,6 +78,9 @@ /* Begin PBXFileReference section */ C9483F6C2773017500998F6B /* MapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = ""; }; + C9697F9A2793366500250207 /* offline_map.mbtiles */ = {isa = PBXFileReference; lastKnownFileType = file; path = offline_map.mbtiles; sourceTree = ""; }; + C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalMBTileOverlay.swift; sourceTree = ""; }; + C9697FA62793F9FB00250207 /* MTAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MTAppDelegate.swift; sourceTree = ""; }; C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionAnnotationView.swift; sourceTree = ""; }; C9A88B54278B503C00BD810A /* MapViewModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewModule.swift; sourceTree = ""; }; C9A88B56278B559900BD810A /* apponly.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = apponly.pb.swift; sourceTree = ""; }; @@ -132,6 +139,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + C9697FA527933B8C00250207 /* SQLite in Frameworks */, DD5394FC276993AD00AD86B1 /* SwiftProtobuf in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -159,6 +167,7 @@ C9A7BC0E27759A6800760B50 /* Custom */, C9483F6C2773017500998F6B /* MapView.swift */, C9A88B54278B503C00BD810A /* MapViewModule.swift */, + C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */, ); path = Map; sourceTree = ""; @@ -258,6 +267,7 @@ DDC2E18826CE24EE0042C5E4 /* Model */, DDC2E18926CE24F70042C5E4 /* Resources */, DDC2E15726CE248E0042C5E4 /* MeshtasticClientApp.swift */, + C9697FA62793F9FB00250207 /* MTAppDelegate.swift */, DDC2E16526CE248F0042C5E4 /* Info.plist */, DDC2E15D26CE248F0042C5E4 /* Preview Content */, ); @@ -316,6 +326,7 @@ DDC2E18926CE24F70042C5E4 /* Resources */ = { isa = PBXGroup; children = ( + C9697F9A2793366500250207 /* offline_map.mbtiles */, DDC2E15B26CE248F0042C5E4 /* Assets.xcassets */, ); path = Resources; @@ -383,6 +394,7 @@ name = MeshtasticClient; packageProductDependencies = ( DD5394FB276993AD00AD86B1 /* SwiftProtobuf */, + C9697FA427933B8C00250207 /* SQLite */, ); productName = MeshtasticClient; productReference = DDC2E15426CE248E0042C5E4 /* MeshtasticClient.app */; @@ -435,6 +447,7 @@ TargetAttributes = { DDC2E15326CE248E0042C5E4 = { CreatedOnToolsVersion = 12.5.1; + LastSwiftMigration = 1320; }; DDC2E16926CE248F0042C5E4 = { CreatedOnToolsVersion = 12.5.1; @@ -457,6 +470,7 @@ mainGroup = DDC2E14B26CE248E0042C5E4; packageReferences = ( DD5394FA276993AD00AD86B1 /* XCRemoteSwiftPackageReference "swift-protobuf" */, + C9697FA327933B8C00250207 /* XCRemoteSwiftPackageReference "SQLite.swift" */, ); productRefGroup = DDC2E15526CE248E0042C5E4 /* Products */; projectDirPath = ""; @@ -476,6 +490,7 @@ files = ( DDC2E15F26CE248F0042C5E4 /* Preview Assets.xcassets in Resources */, DDC2E15C26CE248F0042C5E4 /* Assets.xcassets in Resources */, + C9697F9B2793366500250207 /* offline_map.mbtiles in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -551,10 +566,12 @@ DDAF8C6326ED0A230058C060 /* admin.pb.swift in Sources */, C9483F6D2773017500998F6B /* MapView.swift in Sources */, DDAF8C5826ED07FD0058C060 /* mesh.pb.swift in Sources */, + C9697FA72793F9FB00250207 /* MTAppDelegate.swift in Sources */, DD8169FB271F1F3A00F4AB02 /* MeshLog.swift in Sources */, DD2E65262767A01F00E45FC5 /* NodeDetail.swift in Sources */, C9A88B57278B559900BD810A /* apponly.pb.swift in Sources */, DD47E3D926F3093800029299 /* MessageBubble.swift in Sources */, + C9697F9D279336B700250207 /* LocalMBTileOverlay.swift in Sources */, DD8169F9271F1A6100F4AB02 /* MeshLogger.swift in Sources */, DD539502276DAA6A00AD86B1 /* MapLocation.swift in Sources */, DDAF8C6726ED0C8C0058C060 /* remote_hardware.pb.swift in Sources */, @@ -720,6 +737,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MeshtasticClient/MeshtasticClient.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 15; @@ -737,6 +755,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,6"; }; @@ -748,6 +767,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MeshtasticClient/MeshtasticClient.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 15; @@ -896,6 +916,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + C9697FA327933B8C00250207 /* XCRemoteSwiftPackageReference "SQLite.swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/stephencelis/SQLite.swift.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.9.2; + }; + }; DD5394FA276993AD00AD86B1 /* XCRemoteSwiftPackageReference "swift-protobuf" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/apple/swift-protobuf.git"; @@ -907,6 +935,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + C9697FA427933B8C00250207 /* SQLite */ = { + isa = XCSwiftPackageProductDependency; + package = C9697FA327933B8C00250207 /* XCRemoteSwiftPackageReference "SQLite.swift" */; + productName = SQLite; + }; DD5394FB276993AD00AD86B1 /* SwiftProtobuf */ = { isa = XCSwiftPackageProductDependency; package = DD5394FA276993AD00AD86B1 /* XCRemoteSwiftPackageReference "swift-protobuf" */; diff --git a/Meshtastic Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Meshtastic Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 1cb05e42..c0572681 100644 --- a/Meshtastic Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Meshtastic Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,6 +1,15 @@ { "object": { "pins": [ + { + "package": "SQLite.swift", + "repositoryURL": "https://github.com/stephencelis/SQLite.swift.git", + "state": { + "branch": null, + "revision": "60a65015f6402b7c34b9a924f755ca0a73afeeaa", + "version": "0.13.1" + } + }, { "package": "SwiftProtobuf", "repositoryURL": "https://github.com/apple/swift-protobuf.git", diff --git a/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate b/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate index 85e4e4d5c2962ae21b71d9d554869200c1036c6e..66abbf05c5972d37806bdf97770f5cc0336576e2 100644 GIT binary patch literal 100418 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

r$IgOl7&LC$3P7gM9@%0?sbwdKHcvD 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 GnDjsN6@gU% diff --git a/MeshtasticClient/Info.plist b/MeshtasticClient/Info.plist index b5b09295..74217155 100644 --- a/MeshtasticClient/Info.plist +++ b/MeshtasticClient/Info.plist @@ -2,10 +2,27 @@ + UISupportsDocumentBrowser + + LSSupportsOpeningDocumentsInPlace + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName Meshtastic + CFBundleDocumentTypes + + + CFBundleTypeName + MBTiles Map + LSHandlerRank + Default + LSItemContentTypes + + gvh.MeshtasticClient.mbtiles + + + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -29,7 +46,7 @@ NSBluetoothAlwaysUsageDescription We use bluetooth to connect to nearby Meshtastic Devices NSBluetoothPeripheralUsageDescription - Bluetooth is used to connect an iPhone to a user's meshtastic device to allow text messaging and location data for the mesh network. + Bluetooth is used to connect an iPhone to a user's meshtastic device to allow text messaging and location data for the mesh network. NSLocationWhenInUseUsageDescription We use your location to center maps of the mesh Privacy – Bluetooth Always Usage Description @@ -65,5 +82,27 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UTImportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + MBTiles Map + UTTypeIconFiles + + UTTypeIdentifier + gvh.MeshtasticClient.mbtiles + UTTypeTagSpecification + + public.filename-extension + + mbtiles + + + + diff --git a/MeshtasticClient/MTAppDelegate.swift b/MeshtasticClient/MTAppDelegate.swift new file mode 100644 index 00000000..a59f9b27 --- /dev/null +++ b/MeshtasticClient/MTAppDelegate.swift @@ -0,0 +1,28 @@ +// +// AppDelegate.swift +// MeshtasticClient +// +// Created by Joshua Pirihi on 16/01/22. +// + +import Foundation +import UIKit + +class MTAppDelegate: NSObject, UIApplicationDelegate { + + func applicationDidFinishLaunching(_ application: UIApplication) { + } + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + // ... + return true + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + print("We received a file") + return true + } +} diff --git a/MeshtasticClient/MeshtasticClientApp.swift b/MeshtasticClient/MeshtasticClientApp.swift index f7222a60..5f99066d 100644 --- a/MeshtasticClient/MeshtasticClientApp.swift +++ b/MeshtasticClient/MeshtasticClientApp.swift @@ -4,6 +4,8 @@ import CoreData @main struct MeshtasticClientApp: App { + @UIApplicationDelegateAdaptor var delegate: MTAppDelegate + let persistenceController = PersistenceController.shared @ObservedObject private var bleManager: BLEManager = BLEManager.shared diff --git a/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift b/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift new file mode 100644 index 00000000..2b967097 --- /dev/null +++ b/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift @@ -0,0 +1,72 @@ +// +// LocalMBTileOverlay.swift +// MeshtasticClient +// +// Created by Joshua Pirihi on 16/01/22. +// + +import UIKit +import MapKit +import SQLite + +class LocalMBTileOverlay: MKTileOverlay { + + var path: String! + + var mb: Connection! + + init(mbTilePath path: String) { + + super.init(urlTemplate: nil) + self.path = path + + do { + self.mb = try Connection(self.path, readonly: true) + let metadata = Table("metadata") + + let name = Expression("name") + let value = Expression("value") + + let minZQuery = try mb.pluck(metadata.select(value).filter(name == "minzoom")) + self.minimumZ = Int(minZQuery![value])! + + let maxZQuery = try mb.pluck(metadata.select(value).filter(name == "maxzoom")) + self.maximumZ = Int(maxZQuery![value])! + + self.isGeometryFlipped = true + + //let boundingBoxString = try mb.pluck(metadata.select(value).filter(name == "bounds")) + //let boundCoords = boundingBoxString![value].split(separator: ",") + //self.boundingMapRect = MKMapRect(coordinates: [CLLocationCoordinate2D(latitude: Double(boundCoords[0]) ?? 0, longitude: Double(boundCoords[1]) ?? 0), CLLocationCoordinate2D(latitude: Double(boundCoords[2]) ?? 0, longitude: Double(boundCoords[3]) ?? 0)]) + + + } catch { + + } + + + } + + override func loadTile(at path: MKTileOverlayPath) async throws -> Data { + + let tileX = Int64(path.x) + let tileY = Int64(path.y) + let tileZ = Int64(path.z) + + let tileData = Expression("tile_data") + let zoomLevel = Expression("zoom_level") + let tileColumn = Expression("tile_column") + let tileRow = Expression("tile_row") + + if let dataQuery = try self.mb.pluck(Table("tiles").select(tileData).filter(zoomLevel == tileZ).filter(tileColumn == tileX).filter(tileRow == tileY)) { + + let data = Data(bytes: dataQuery[tileData].bytes, count: dataQuery[tileData].bytes.count)//dataQuery![tileData].bytes + + return data + + } else { + return Data() + } + } + +} diff --git a/MeshtasticClient/Views/Map/MapViewModule.swift b/MeshtasticClient/Views/Map/MapViewModule.swift index dddcc826..570da564 100644 --- a/MeshtasticClient/Views/Map/MapViewModule.swift +++ b/MeshtasticClient/Views/Map/MapViewModule.swift @@ -97,7 +97,7 @@ public struct MapView: UIViewRepresentable { //self.annotations = annotations - self.locationNodes = locationNodes + //self.locationNodes = locationNodes self.overlays = overlays @@ -135,22 +135,10 @@ public struct MapView: UIViewRepresentable { if self.customMapOverlay != self.presentCustomMapOverlayHash { mapView.removeOverlays(mapView.overlays) if let customMapOverlay = self.customMapOverlay { - let overlay = CustomMapOverlaySource( - parent: self, - mapName: customMapOverlay.mapName, - tileType: customMapOverlay.tileType, - defaultTile: customMapOverlay.defaultTile - ) - if let minZ = customMapOverlay.minimumZoomLevel { - overlay.minimumZ = minZ - } + let overlay = LocalMBTileOverlay(mbTilePath: Bundle.main.path(forResource: "offline_map", ofType: "mbtiles")!) - if let maxZ = customMapOverlay.maximumZoomLevel { - overlay.maximumZ = maxZ - } - - overlay.canReplaceMapContent = customMapOverlay.canReplaceMapContent + overlay.canReplaceMapContent = false//customMapOverlay.canReplaceMapContent mapView.addOverlay(overlay) } diff --git a/MeshtasticClient/Views/Nodes/NodeMap.swift b/MeshtasticClient/Views/Nodes/NodeMap.swift index b9cc26b1..280fb2d0 100644 --- a/MeshtasticClient/Views/Nodes/NodeMap.swift +++ b/MeshtasticClient/Views/Nodes/NodeMap.swift @@ -49,7 +49,7 @@ struct NodeMap: View { )*/ @State private var customMapOverlay: MapView.CustomMapOverlay? = MapView.CustomMapOverlay( - mapName: UserDefaults.standard.string(forKey: "meshMapCustomTileServer"), + mapName: "offlinemap", tileType: "png", canReplaceMapContent: true ) From 21f2e0fbf4729d3f15ab98199f3a39959e238f2f Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Tue, 18 Jan 2022 17:09:23 +1300 Subject: [PATCH 09/10] Make BLEManager handle Position packets that arrive under the PositionApp port number --- .../UserInterfaceState.xcuserstate | Bin 100418 -> 129299 bytes MeshtasticClient/Helpers/BLEManager.swift | 25 +++++++ .../Views/Map/LocalMBTileOverlay.swift | 61 +++++++++++++++--- .../Views/Map/MapViewModule.swift | 53 ++++++++++----- MeshtasticClient/Views/Nodes/NodeMap.swift | 4 +- 5 files changed, 117 insertions(+), 26 deletions(-) diff --git a/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate b/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate index 66abbf05c5972d37806bdf97770f5cc0336576e2..c932fa4414624c3f5e906a34fac5ce2cf5ef044d 100644 GIT binary patch literal 129299 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�SySMJwaQNTqzKi-m_qA@f?g!#m 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 Ve-8cs{VTKoto{G@uh4)U{|6sgzO?`V literal 100418 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

$Z&Pd8kPfblsY2BisMnMbO6_lHum75t4 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 J3>`e=e*n6&!Il63 diff --git a/MeshtasticClient/Helpers/BLEManager.swift b/MeshtasticClient/Helpers/BLEManager.swift index 87547c94..6506b552 100644 --- a/MeshtasticClient/Helpers/BLEManager.swift +++ b/MeshtasticClient/Helpers/BLEManager.swift @@ -811,6 +811,31 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph } fetchedNode[0].snr = decodedInfo.packet.rxSnr + + if let positionMessage = try? Position(serializedData: decodedInfo.packet.decoded.payload) { + let position = PositionEntity(context: context!) + position.latitudeI = positionMessage.latitudeI + position.longitudeI = positionMessage.longitudeI + position.altitude = positionMessage.altitude + position.batteryLevel = positionMessage.batteryLevel + position.time = Date(timeIntervalSince1970: TimeInterval(Int64(positionMessage.time))) + + let mutablePositions = fetchedNode[0].positions!.mutableCopy() as! NSMutableOrderedSet + mutablePositions.add(position) + + print("💾 Recieved a Position Packet") + + if position.coordinate == nil { + var newPostions = [PositionEntity]() + newPostions.append(position) + fetchedNode[0].positions? = NSOrderedSet(array: newPostions) + + } else { + + fetchedNode[0].positions = mutablePositions.copy() as? NSOrderedSet + } + } + } else { return diff --git a/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift b/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift index 2b967097..088f6365 100644 --- a/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift +++ b/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift @@ -9,12 +9,43 @@ import UIKit import MapKit import SQLite +extension MKMapRect { + init(coordinates: [CLLocationCoordinate2D]) { + self = MKMapRect() + var coordinates = coordinates + if !coordinates.isEmpty { + let first = coordinates.removeFirst() + var top = first.latitude + var bottom = first.latitude + var left = first.longitude + var right = first.longitude + coordinates.forEach { coordinate in + top = max(top, coordinate.latitude) + bottom = min(bottom, coordinate.latitude) + left = min(left, coordinate.longitude) + right = max(right, coordinate.longitude) + } + let topLeft = MKMapPoint(CLLocationCoordinate2D(latitude:top, longitude:left)) + let bottomRight = MKMapPoint(CLLocationCoordinate2D(latitude:bottom, longitude:right)) + self = MKMapRect(x:topLeft.x, y:topLeft.y, + width:bottomRight.x - topLeft.x, height:bottomRight.y - topLeft.y) + } + } +} + class LocalMBTileOverlay: MKTileOverlay { var path: String! var mb: Connection! + private var _boundingMapRect: MKMapRect! + override var boundingMapRect: MKMapRect { + get { + return _boundingMapRect + } + } + init(mbTilePath path: String) { super.init(urlTemplate: nil) @@ -35,19 +66,29 @@ class LocalMBTileOverlay: MKTileOverlay { self.isGeometryFlipped = true - //let boundingBoxString = try mb.pluck(metadata.select(value).filter(name == "bounds")) - //let boundCoords = boundingBoxString![value].split(separator: ",") - //self.boundingMapRect = MKMapRect(coordinates: [CLLocationCoordinate2D(latitude: Double(boundCoords[0]) ?? 0, longitude: Double(boundCoords[1]) ?? 0), CLLocationCoordinate2D(latitude: Double(boundCoords[2]) ?? 0, longitude: Double(boundCoords[3]) ?? 0)]) + let boundingBoxString = try mb.pluck(metadata.select(value).filter(name == "bounds")) + let boundCoords = boundingBoxString![value].split(separator: ",") + let coords = [ + CLLocationCoordinate2D(latitude: Double(boundCoords[1]) ?? 0, + longitude: Double(boundCoords[0]) ?? 0), + CLLocationCoordinate2D(latitude: Double(boundCoords[3]) ?? 0, + longitude: Double(boundCoords[2]) ?? 0) + ] + self._boundingMapRect = MKMapRect(coordinates: coords) } catch { - + //print("MAP ERROR \(error)") } } - override func loadTile(at path: MKTileOverlayPath) async throws -> Data { + override func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void) { + + //} + + //override func loadTile(at path: MKTileOverlayPath) async throws -> Data { let tileX = Int64(path.x) let tileY = Int64(path.y) @@ -58,14 +99,18 @@ class LocalMBTileOverlay: MKTileOverlay { let tileColumn = Expression("tile_column") let tileRow = Expression("tile_row") - if let dataQuery = try self.mb.pluck(Table("tiles").select(tileData).filter(zoomLevel == tileZ).filter(tileColumn == tileX).filter(tileRow == tileY)) { + if let dataQuery = try? self.mb.pluck(Table("tiles").select(tileData).filter(zoomLevel == tileZ).filter(tileColumn == tileX).filter(tileRow == tileY)) { let data = Data(bytes: dataQuery[tileData].bytes, count: dataQuery[tileData].bytes.count)//dataQuery![tileData].bytes - return data + //return data + result(data, nil) } else { - return Data() + print("💥 No tile here: x:\(tileX) y:\(tileY) z:\(tileZ)") + //return Data() + let error = NSError(domain: "LocalMBTileOverlay", code: 1, userInfo: ["reason": "no_tile"]) + result(nil, error) } } diff --git a/MeshtasticClient/Views/Map/MapViewModule.swift b/MeshtasticClient/Views/Map/MapViewModule.swift index 1cbb43c0..f7468edd 100644 --- a/MeshtasticClient/Views/Map/MapViewModule.swift +++ b/MeshtasticClient/Views/Map/MapViewModule.swift @@ -11,9 +11,9 @@ import CoreData #if canImport(MapKit) && canImport(UIKit) public struct MapView: UIViewRepresentable { - //@Environment(\.managedObjectContext) var context + @Environment(\.managedObjectContext) var context - var context: NSManagedObjectContext? + //var context: NSManagedObjectContext? //@Binding private var region: MKCoordinateRegion @@ -40,8 +40,11 @@ public struct MapView: UIViewRepresentable { private var overlays: [Overlay] - @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "lastHeard", ascending: false)], animation: .default) - private var locationNodes: FetchedResults + //@FetchRequest(sortDescriptors: [NSSortDescriptor(key: "lastHeard", ascending: false)], animation: .default) + // private var locationNodes: FetchedResults + + @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "time", ascending: false)], animation: .default) + private var positions: FetchedResults //@State private var locationNodes: [NodeInfoEntity] @@ -62,8 +65,8 @@ public struct MapView: UIViewRepresentable { userLocation: Binding = .constant(nil), //annotations: [MKPointAnnotation] = [], //locationNodes: [NodeInfoEntity] = [], - overlays: [Overlay] = [], - context: NSManagedObjectContext? = nil + overlays: [Overlay] = [] + //context: NSManagedObjectContext? = nil ) { //self._region = region @@ -111,7 +114,7 @@ public struct MapView: UIViewRepresentable { mapView.delegate = context.coordinator mapView.register(PositionAnnotationView.self, forAnnotationViewWithReuseIdentifier: NSStringFromClass(PositionAnnotationView.self)) - Timer.scheduledTimer(withTimeInterval: 10, repeats: true) { timer in + /*Timer.scheduledTimer(withTimeInterval: 10, repeats: true) { timer in for node in self.locationNodes { // try and get the last position if (node.positions?.count ?? 0) > 0 && (node.positions!.lastObject as! PositionEntity).coordinate != nil { @@ -123,7 +126,7 @@ public struct MapView: UIViewRepresentable { mapView.addAnnotation(annotation) } } - } + }*/ return mapView } @@ -139,18 +142,20 @@ public struct MapView: UIViewRepresentable { mapView.removeOverlays(mapView.overlays) if let customMapOverlay = self.customMapOverlay { - let overlay = LocalMBTileOverlay(mbTilePath: Bundle.main.path(forResource: "offline_map", ofType: "mbtiles")!) - - overlay.canReplaceMapContent = false//customMapOverlay.canReplaceMapContent - - mapView.addOverlay(overlay) + if let tilePath = Bundle.main.path(forResource: "offline_map", ofType: "mbtiles") { + let overlay = LocalMBTileOverlay(mbTilePath: tilePath) + + overlay.canReplaceMapContent = false//customMapOverlay.canReplaceMapContent + + mapView.addOverlay(overlay) + } } DispatchQueue.main.async { self.presentCustomMapOverlayHash = self.customMapOverlay } } - if mapView.overlays.count != (self.overlays.count + (self.customMapOverlay == nil ? 0 : 1)) { + /*if mapView.overlays.count != (self.overlays.count + (self.customMapOverlay == nil ? 0 : 1)) { context.coordinator.overlays = self.overlays mapView.overlays.forEach { overlay in if !(overlay is MKTileOverlay) { @@ -158,7 +163,7 @@ public struct MapView: UIViewRepresentable { } } mapView.addOverlays(self.overlays.map { overlay in overlay.shape }) - } + }*/ if mapView.mapType != self.mapType { mapView.mapType = self.mapType @@ -210,7 +215,7 @@ public struct MapView: UIViewRepresentable { shouldMoveRegion = true } - for node in self.locationNodes { + /*for node in self.locationNodes { // try and get the last position if (node.positions?.count ?? 0) > 0 && (node.positions!.lastObject as! PositionEntity).coordinate != nil { let annotation = PositionAnnotation() @@ -220,6 +225,22 @@ public struct MapView: UIViewRepresentable { mapView.addAnnotation(annotation) } + }*/ + + var displayedNodes: [Int64] = [] + for position in self.positions { + if position.nodePosition == nil || displayedNodes.contains(position.nodePosition!.num) || position.coordinate == nil { + continue + } + + let annotation = PositionAnnotation() + annotation.coordinate = position.coordinate! + annotation.title = position.nodePosition!.user?.longName ?? "Unknown" + annotation.shortName = position.nodePosition!.user?.shortName?.uppercased() ?? "???" + + mapView.addAnnotation(annotation) + + displayedNodes.append(position.nodePosition!.num) } if shouldMoveRegion { diff --git a/MeshtasticClient/Views/Nodes/NodeMap.swift b/MeshtasticClient/Views/Nodes/NodeMap.swift index be4918e1..c9e99e80 100644 --- a/MeshtasticClient/Views/Nodes/NodeMap.swift +++ b/MeshtasticClient/Views/Nodes/NodeMap.swift @@ -108,8 +108,8 @@ struct NodeMap: View { userLocation: self.$userLocation, //annotations: self.annotations, //locationNodes: self.locationNodes.map({ nodeinfo in return nodeinfo }), - overlays: self.overlays, - context: self.context + overlays: self.overlays + //context: self.context ) .frame(maxHeight: .infinity) From cabd407c0f3f6f76b886ca3ddb2dbbc6de85e7d8 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 20 Jan 2022 18:21:11 -0800 Subject: [PATCH 10/10] Hide tile server setting, remove map tiles --- Meshtastic Client.xcodeproj/project.pbxproj | 12 ++++-------- MeshtasticClient/Helpers/BLEManager.swift | 4 ++-- MeshtasticClient/Info.plist | 10 +++++----- MeshtasticClient/Views/Settings/AppSettings.swift | 2 +- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/Meshtastic Client.xcodeproj/project.pbxproj b/Meshtastic Client.xcodeproj/project.pbxproj index 84f3004b..980e4498 100644 --- a/Meshtastic Client.xcodeproj/project.pbxproj +++ b/Meshtastic Client.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ C9483F6D2773017500998F6B /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9483F6C2773017500998F6B /* MapView.swift */; }; - C9697F9B2793366500250207 /* offline_map.mbtiles in Resources */ = {isa = PBXBuildFile; fileRef = C9697F9A2793366500250207 /* offline_map.mbtiles */; }; C9697F9D279336B700250207 /* LocalMBTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */; }; C9697FA527933B8C00250207 /* SQLite in Frameworks */ = {isa = PBXBuildFile; productRef = C9697FA427933B8C00250207 /* SQLite */; }; C9697FA72793F9FB00250207 /* MTAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9697FA62793F9FB00250207 /* MTAppDelegate.swift */; }; @@ -78,7 +77,6 @@ /* Begin PBXFileReference section */ C9483F6C2773017500998F6B /* MapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = ""; }; - C9697F9A2793366500250207 /* offline_map.mbtiles */ = {isa = PBXFileReference; lastKnownFileType = file; path = offline_map.mbtiles; sourceTree = ""; }; C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalMBTileOverlay.swift; sourceTree = ""; }; C9697FA62793F9FB00250207 /* MTAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MTAppDelegate.swift; sourceTree = ""; }; C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionAnnotationView.swift; sourceTree = ""; }; @@ -326,7 +324,6 @@ DDC2E18926CE24F70042C5E4 /* Resources */ = { isa = PBXGroup; children = ( - C9697F9A2793366500250207 /* offline_map.mbtiles */, DDC2E15B26CE248F0042C5E4 /* Assets.xcassets */, ); path = Resources; @@ -490,7 +487,6 @@ files = ( DDC2E15F26CE248F0042C5E4 /* Preview Assets.xcassets in Resources */, DDC2E15C26CE248F0042C5E4 /* Assets.xcassets in Resources */, - C9697F9B2793366500250207 /* offline_map.mbtiles in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -740,9 +736,9 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MeshtasticClient/MeshtasticClient.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 18; DEVELOPMENT_ASSET_PATHS = "\"MeshtasticClient/Preview Content\""; - DEVELOPMENT_TEAM = 37C534H572; + DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = MeshtasticClient/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -770,9 +766,9 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MeshtasticClient/MeshtasticClient.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 18; DEVELOPMENT_ASSET_PATHS = "\"MeshtasticClient/Preview Content\""; - DEVELOPMENT_TEAM = 37C534H572; + DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = MeshtasticClient/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; diff --git a/MeshtasticClient/Helpers/BLEManager.swift b/MeshtasticClient/Helpers/BLEManager.swift index 6506b552..2545f807 100644 --- a/MeshtasticClient/Helpers/BLEManager.swift +++ b/MeshtasticClient/Helpers/BLEManager.swift @@ -822,9 +822,9 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph let mutablePositions = fetchedNode[0].positions!.mutableCopy() as! NSMutableOrderedSet mutablePositions.add(position) - + print("💾 Recieved a Position Packet") - + if position.coordinate == nil { var newPostions = [PositionEntity]() newPostions.append(position) diff --git a/MeshtasticClient/Info.plist b/MeshtasticClient/Info.plist index 74217155..5d7d0870 100644 --- a/MeshtasticClient/Info.plist +++ b/MeshtasticClient/Info.plist @@ -2,10 +2,6 @@ - UISupportsDocumentBrowser - - LSSupportsOpeningDocumentsInPlace - CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -43,10 +39,12 @@ public.app-category.utilities LSRequiresIPhoneOS + LSSupportsOpeningDocumentsInPlace + NSBluetoothAlwaysUsageDescription We use bluetooth to connect to nearby Meshtastic Devices NSBluetoothPeripheralUsageDescription - Bluetooth is used to connect an iPhone to a user's meshtastic device to allow text messaging and location data for the mesh network. + Bluetooth is used to connect an iPhone to a user's meshtastic device to allow text messaging and location data for the mesh network. NSLocationWhenInUseUsageDescription We use your location to center maps of the mesh Privacy – Bluetooth Always Usage Description @@ -82,6 +80,8 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UISupportsDocumentBrowser + UTImportedTypeDeclarations diff --git a/MeshtasticClient/Views/Settings/AppSettings.swift b/MeshtasticClient/Views/Settings/AppSettings.swift index 1a331f6c..686a333d 100644 --- a/MeshtasticClient/Views/Settings/AppSettings.swift +++ b/MeshtasticClient/Views/Settings/AppSettings.swift @@ -171,7 +171,7 @@ struct AppSettings: View { } } .pickerStyle(DefaultPickerStyle()) - TextField("Custom Tile Server", text: $userSettings.meshMapCustomTileServer) + // TextField("Custom Tile Server", text: $userSettings.meshMapCustomTileServer) } Section(header: Text("DEBUG")) { // Toggle(isOn: $userSettings.meshActivityLog) {

$Z&Pd8kPfblsY2BisMnMbO6_lHum75t4 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 J3>`e=e*n6&!Il63 delta 25388 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