Land Nav Developer Log
Every wonder what a dev goes through when building an app? Here is a raw dump of some of the notes I keep while building Land Nav.
I’m glad I didn’t know how much effort it was going to take before I started because I would have been too afraid to start.
A lot of the work was caused by figuring out how it should work and learning state management in Swift UI. I think I rebuilt the app 3 times before finally understanding how to efficiently architect a large scale SwiftUI app and come up with a design that I was happy with.
- 1.0.1 released and avialable on the app store
- Tested in-app purchase on my device. It works, yay, at leaset I’ve made one sale!
- Continued evaluating geocoding and geosearch APIs.
- Approved by Apple and released on the App Store 🎉 and then taken off because I didn’t submit the in-app purchase along with the app so the buy feature wouldn’t work :(
- Version 1.0.1 submitted
- Worked on search feature using openrouteservice.org for now. I don’t think I’ll be able to ship with that service because rate limits are too low. Geocoding APIs are surprisingly expensive…
- Create screenshots and other details for App Store
- Update website
- Submit 1.0.0 (107) for review
- Stop navigating if location not authorized
- Extract offline map state to prevent menu flashing when maps are downloading because of changing settings state
- Correctly collapse expanded badges in landscape
- Attempted to put elevation for map center and location expanded badges but rejected as it takes up too much room. Maybe distance and bearing section would be better?
- Improved haptic feedback. Was going to add haptic when alert shows but turned out to be too much and not needed, especially when using swipe to delete which already includes a system haptic.
- Hide Dark map behind developer setting
- Match map contour elevation unit to app elevation unit
- Add required location Info.plist entry
- Launch landnav.app and point app to that URL
- Restructure app state to prevent unneeded view updates
- Hide marker image on compass
- Fix selected badge action menus flashing when location updates
- Improve layout of numeric decimal degrees
- Improve layout of map action button
- Fix name, detail and color (item properties) doesn’t refresh item view in Items Tab while editing color or elevation (marker properties) does cause view to update. WTF?
- Correctly align data cell row label images
- Fix recover deleted item does not update view
- Move Zoom to Extents action into menu
- Select base map in move marker sheet
- Confirm to delete items
- Move marker sheet allows changing map style
- Fix menu flashing by refactor to use app state container: https://www.fivestars.blog/articles/app-state/
- Improve how external apps are handled
- Select Apple Maps or Google maps
- Select Apple Weather or Open Weather
- Fix view structure on Location tab to prevent flashing action menu caused by location updates
- Fix selecting offline map region on iPad
- Markers can open Apple Weather
- Initial work on fixing flashing menus by reworking views so that location service isn’t at a top level. Instead its brought into small views exactly where it’s needed.
- Add shortcut to map from items tab
- Post Creating your first map with Land Nav video
- Tried but failed at loading GPX file into Xcode to simulate location. File selector has .gpx files grayed out
- Show notes on drawing badge when expanded
- Show map cursor when my location badge is visible
- Only show date in title when it will fit
- Map Center item should always be visible in Items even when map has no markers. E.g., Items will only show a blank slate when there is no active map?
- Post an initial video talking about the app. It doesn’t have to be good but it shouldn’t be horrible.
- Update screenshots on lander site
- Send announcement to friends and SFSAR
- Fix parsing DM, DD, DMS separators
- Improve UTM parsing
- Experiment with only using a single text field for entering coordinates. I actually think the structured editors make things more complicated than it needs to be.
- Show coordinates, elevation, and notes in expanded badge
- Replace print calls to logging or remove
- Change IAP purchase to $19.99 lifetime
- Improve onboarding
- Remove unused Roboto fonts
- Only show Developer Mode option when app purchased
- Post test flight build 🎉
- GPX splits track segments into separate tracks. Temp until I determine exactly how drawing with multiple lines should be handled. Especially regarding editing.
- Reverse drawing operation always available
- Experiment with night vision mode. Decided against it.
- Change zoom button icons
- Setting to turn off zoom buttonsRename Map Widgets section back to Map
- Coordinate editor shows distance from original coordinate
- Numeric decimal degrees
- Support decimal seconds to DMS
- Correctly round minutes and seconds
- Coordinate editor can switch coordinate system
- Paste coordinates into coordinate editor
- Experimented with badge context menus. Neat but maybe something based on feedback from users. I’m not sure I need it. Need to resist the urge to keep sticking in features.
- Fix leading zeros in coordinate editors
- Experiment with coordinate format picker getting pushed as navigation view (vs sheet). Not as good so rejected it.
- Refactor coordinate editor to simplify and improve UX
- Import new map has unique menu icon
- When showing import info for zip use navigation link to view contents of each zip file
- Prevent importing ZIP files into an existing map
- Extract sheet state from scene state
- Refactor MapView and MapView.Content
- Extract new layer sheet into main sheet
- Use different text colors for different map styles
- Hide my location mark action when no active map
- Fix bug where heading can show as 360° N
- Fix bug where 60” can appear when showing DMS coordinates
- Simplify picking coordinate formats
- Easily copy coordinates to clipboard via long press
- Refactor notifications
- Add notification for import results (removes the need for custom toast). Why didn’t I think of this earlier?
- Improve map marker font
- Convert Export to use MainSheet
- Improve menu and action labels
- Import GPX into an existing map
- Refactor rename layer sheet
- Allow long press marker creating on drawings
- Allow long press to create marker over drawing
- Rounded top corners for bottom badge
- Hide ruler in developer mode until 2 finger tracking working
- Hide reset camera in map pitch context menu
- Add rename menu action in map menu
- Reorganize menu layouts
- Import URL in background, import without confirming with UI
- Remove showSelectedItemBadge state. Not needed now that mapSelection can be mapCenter.
- Fix bug where item is selected then tap on myLocation hides selected item badge
- No hepatic feedback when selecting item or map center in items tab
- Expandable item badge replaces item sheet
- Improve badge title font size
- Fix broken coordinate format sheet on map tab in item sheet caused by MainSheet not working with nested sheets.
- Add icon image for map center my location
- Map cursor uses image instead of shape
- Show map center item in layer view
- Experimented with customizing the large title but it uses a private API and really only allows putting an image on the trailing edge. This isn’t ideal and since it might get the app rejected I’ve dropped the idea.
- Set itemsTabPath to mapCenter when map center badge is shown. This might require mapCenter MapContentKind
- Coordinate Format and New Format sheet into MainSheet
- Move ruler badge to top
- Bottom badge uses full width
- Investigate using ShareLink but can’t use it because no way to dismiss the share sheet. Improved ActivityView instead by making a ShareLinkHelper module
- Started initial work on moving code to have only 1 MainSheet so that sceneState can dismiss it when importing (or for any other reason).
- Disable pitch and rotate on offline maps
- Correctly initialize map camera when selecting offline map region
- Import GPX saves date if entered
- Export layer data, route, regions, and tracks
- Improve formatted of layer row date and detail
- Use Link for Open in Apple Maps
- Investigated multitouch gestures for ruler so that both fingers could move points A and B but after 2 hours without a great end in site stopped working on the feature. I think there is a problem/conflict with the UIPanGesture that I installed and the dragging gesture originally added for the ruler
- Rename Copy to Other Map
- Replace visible layers with favorite maps
- Add optional date field to layers
- Always show items tab
- Always show location and compass tabs
- Location shows from my location
- Use P101 as default marker name
- Do not suggest item code names by default
- Tap coordinate badge to edit map camera
- Copy to Map replaces Move to Map
- Snap to markers
- Snap to my location puck
- Show item name on ruler badge
- Feedback when snapping to new item
- Show ruler badge independent of selected item badge
- Reset or turn on ruler vs toggle
- Sync map selection and items tab path
- Tweak marker annotation text
- Initialize based on view port coordinates so it always appear in bottom-left and top-right
- Save map coordinator so we can can get coordinates based on current map view left and right
- Inset view rect by 50% and take A = bottom left and B = top right
- Remove ruler annotations when is hidden
- Save ruler state correctly OR hide it on startup
- Move Show/Hide Ruler to action menu in top right (vs plus menu)
- Remove Mark map center action and entire + action button unless drawing is enabled
- Render thumb gripper annotations
- Initial 2 thumb ruler
- Rename map vs from in UI
- Fade base map changes
- Move marker action brings up new map sheet modal interface like maps
- Correctly show map center badge on map tap
- Fix select offline map initial camera (should be same as current map camera)
- Show map cursor if elevation or coordinates shown
- Do nothing when chasing map style to current style
- Fix Acquiring Location state lang on Location tab
- My location shows from (vs to) map center
- Don’t show map tab badge when location denied
- Compass should only tick on compass tab (not map tab after navigation state change)
- Do not dismiss map when deleting drawing
- Restore deleted items view
- Make title disclosure indicator smaller
- Rename Notes from Description
- Separate last used marker and drawing colors
- Clear items tab path when clearing map selection
- Fix selecting nothing doesn’t refresh selected marker or drawings
- Add loading overlay for maps
- Fix map camera state restoration
- Add loading screen to improve look of launch
- Upgrade Mapbox to see if camera glitch is fixed (not completely but maybe better, hard to tell)
- Move + button back from menu bar for map actions
- Add show all map items action
- Hide navigation when item on different layer
- Remove concept of unsaved items, markers should be savable
- Change items tab path when map selection changes
- Solved issues around restoring NavigationStack path issues. https://github.com/gshaw/notes/issues/10
- Introduce SceneState for improving view state restoration
- Rename views to match new app layout
- Rename operation on Items tab by clicking navigation bar title
- Rename operation on Map tab by clicking navigation bar title
- Fix issues with long layer names
- Determine if it’s possible to have 2 navigation stacks (Maps and Items) share the same path so they stay in sync. This way Location and Compass tabs don’t have a Navigation Stack but Map and Items do and they sync together.
- Yes, it’s possible but has a problem with Items tab when path is focused on a specific item.
- Try experiment with separate paths
- Still too confusing
- Try experiment with Maps tab selects the activeLayer and only where there is an active layer does the items tab appear.
- This appears to be working and I’m going to roll with it some more.
- Mark map center (or other places) smoothly flys camera to 2D location
- Add map style icons
- Simplify layer images in preparation to remove active layer concept
- Improve layer picker to use a save button
Apr 13: Field Testing Notes
- Long pressing to create waypoints is great
- Having to save waypoints sucks, most will want to be saved so that should be the default. It’s not hard to delete ones you don’t want.
- Really want to have a “map” document with easily editable notes. I’m thinking of going back to the nav bar for maps with the title a dropdown that makes it easier to Rename title (not that useful) and description (very useful).
- Interesting that the app will be shown to others so it needs to be intuitive and impressive quickly to people not used to using it. Maybe that is just pride for myself.
- Need to be able to answer: what will make Land Nav better in one sentence with a compelling reason.
- Land Nav is a good name
- Compact action buttons like Maps app
- Fix Publishing changes from within view updates is not allowed on HandleOnCameraChanged
- Design how active layer will be removed and new marker flow using default nil layer for dropped markers and a Move Marker action sheet.
- Accept that large data sets won’t work well for now so just disable features that will be slow for launch so that I can move on.
- Accept that it’s OK to update ruler while camera is in flight because eventually ruler will be independent of the camera and same with drawing.
- Correctly draw ruler when first shown without having to move camera
- Do not support measuring to/from drawings (performance on Hextrex and UX issues make this problematic)
- Improve performance of determining drawing point count
- Show point count on Edit Points action button
- For now prevent navigating drawings with > 2500 points
- For now ruler only measures between markers
- For now only snap to markers while drawing
- Make layer visible when editing points
- Drawing view reverse / edit points in view looks wrong
- Fix not working close button on edit drawing.
- Don’t include cursor point on drawing when camera in flight.
- Don’t show ruler annotation when camera in flight
- Investigate tap marker performance. No actual delay, just feels like it like because of the gesture recognizer fires on touch up I think.
- Investigate delay between actions and UI update. Caused by heavy work like saving a CoreData model on the UI thread. Resolution is to run code in Task block that can still happen on the main thread but be scheduled at a later time when UI is idle.
- Extract navigation annotations logic from MapView
- Rename BuildAnnotations module
- Map controls can be hidden
- Fix ruler between 2 drawings not unhighlighting hovered destination
- Moving ruler annotation to the navigation line layer
- Make it easier to tap on my location puck
- Add ability to refresh a set of annotations with refreshMapAnnotations
- Merge UpdateMapNextDrawPoint into UpdateMapCursorPoint
- Remove UpdateMapHoverKind
- Save map item sheet and badge state
- Ruler uses puck coordinate
- Extract from MainMap HandleOnCameraChanged
- Extract from MainMap HandleOnMapTap
- Ruler mode draws line annotation between points
- Compass Tab should be side by side if viewport is wider than height
- Upgrade to latest SwiftFormat and SwiftLint
- Improve map states and actions for navigate, show, delete, and edit points
- Reverse drawing operation
- Started looking into performance issues with CoreData. Not resolved. Could be a problem.
- Refactor map layers and state logic. I still can’t seem to get markers to render under line layers but since I don’t want that it’s OK to move one. I still don’t fully understand Mapbox layers code because when I make the change to move markers under lines it doesn’t work. This means I have a gap in knowledge.
- Simplified refresh logic so items that are removed from map don’t stay around if they were selected. E.g., when map items are refreshed the map selection and hover states are refreshed as well.
- Edit existing drawing
- When ruler mode ends clear hover kind
- Refactor selected item badge to be explicit about action closures
- Add Change Layer action for items
- Experimented with not showing close button on selected item badge but rejected idea. Felt odd that it was shown on the sheet but not the badge and I think there should be an obvious way to close the badge.
- Remove feedback hepatic when clearing selection
- Update hover kind when ruler is active
- Fix selected item badge sheet toolbar colors not using the accent color. Caused by badge setting foreground Color.
- Simplify map state annotations
- Upgrade Mapbox styles to v12
- Upgrade Mapbox package to latest release
- Fix UI glitch on selected item sheet bottom safe area
- Improve selected item badge and related views for rendering the compact and regular. Standardize on view names to make them predictable.
- Selected Item Badge for active drawing
- Allow editing name and color of active drawing
- Show and navigate actions show selected item badge
- Provide haptic feedback
- Only detect hover items while drawing
- Use system defined colors for markers and lines
- Improve My Location view when acquiring location
- Destination cell on compass tab functions like Show button
- Add swipe up (show details) and down (hide badge) gestures to selected item badge
- Fix bug with buy sheet and action button menu
- Remove selectedItemSheetDetent
- Tap selected item badge to show selected item sheet
- Limit text on selected item badge to 1 line
- Selected Item Badge for drawings
- Selected Item Badge for my location
- Selected Item Badge for map center
- Don’t adjust zoom when undoing a drawing point
- Improve zoom calculation when flying to coordinate
- Snap to drawing lines
- Introduce selected item badge UX to replace selected item sheet
- Use materials and colors for badge backgrounds
- Rename showSelectedItemSheet as showSelectedItemBadge
- Fix delay when adding drawing segments
- Snap to markers when drawing
- Fix bottom safe area for My Location
- Improve selecting and hover badge when creating new markers
- Improve Map Center and My Location distance and bearing sections
- Continue with drawing routes
- Improve navigate action icon
- Use accent color for layer states (vs green)
- Fix map badges to not overlap with buttons
- Tried showing marker image on subtitle line but doesn’t make sense. The image title pattern is so ingrained it looks odd to see image below the text.
- Navigate routes and tracks
- Navigate to closet perimeter coordinate on a region (vs center)
- Improve UX for navigate and show actions
- Improve importing by parsing content in background and showing progress indicator
- Group drawing items by kind in Layer View
- Move hover badge in badge stack instead of map center
- Badges toggle selected item sheet
- Fix La La island capital Island. Check each day to see when Map Box picks up update.
- Map action menu for mark map center and show ruler actions
- Show item shows the layer if not active or visible.
- Fix show drawing to use bounds vs bounds center
- Implement DrawingView for routes, tracks, and regions
- Fix marker name editor not updating shape and color
- Allow selecting drawing from hover badge to show drawing view on selected item sheet
- Highlight drawing when hovered on map
- Drawing route and track start/end points and region areas
- Fix bug where deleted layers were still showing items on the map.
- Import routes and tracks as red (vs green)
- Heavily refactor database design separating Items into Markers, Drawings, DrawlingLines, DrawingPoints only to revert it all back to a better Items implementation. Turns out syncing 10,000s of tiny point records is super inefficient in iCloud and using a ValueTransformer I can save an array with a 1000 points (I think - didn’t measure) very quickly. I based most of my impressions on the volume of iCloud logs. Not very scientific but the end result is pretty good. I still don’t like how there is now an item and markerPropertites or drawingProperties but I might be able to improve that with some helper structs/objects for some views.
- Improve measuring between markers and my location
- Show elevation on 3D maps
- Updated Mapbox map styles to latest versions
- Correctly format example coordinate in settings
- Change offline map zoom level to be menu badge
- Change options to be square or rectangle for download area.
- Align coordinate format title correctly
- Improve look of menu pickers
- Fix import file
- Remove map pitch and rotate restrictions
- Implement Project, Mark, and Show actions
- Fix map center coordinate alignment when value wraps (degree minutes on Map Center)
- Improve sheet buttons on devices with large text size
- New layer icon on layers root view
- Improve layers and items action menus
- Redesign map button stack
- Replace base map sheet with basic menu
- Remove outdoors 2D map style keeping only 3D version
- Add 3D/2D buttons to adjust pitch
- Add Zoom In/Out buttons to adjust zoom
Mar 3-8: (Mostly time off)
- Fix performance issues caused by building map items during render instead of building when something changed.
- Active layer badge
- Improve map badges
- Rename Overlay to Layer in code and data model
- Move item to new layer
- Move selected items to different layer
- Improve developer mode options
- Hide location and compass tabs if location services not available
- Show message on location tab when location is not available
- Improve elevation cell UI when value unknown
- Improve readability of status bar, badges, and buttons on map tab
- Right align UTM and MGRS when shown on two lines
- Prevent deleting active layer when using delete selected
- Make selected layers Visible/Hidden
- Show controls to make active and show/hide on LayerView. When layer is active or shown explain what that means and give the option to change it. Consider adding commands to action menu. Rejected idea, makes things more complicated. I think for now all layer controls happen in LayersView rather than moving to multiple views.
- Always show compass heading on map when navigating regardless of setting.
- Rename Visit Website on about
- Rename Contact Developer on About
- Fix buy map badge vertical padding when coordinates and compass is not visible
- Hide area unit unless experimental regions is enabled
- Improve hover badge UX
- Rename Customize for Edit Details on coordinate format row
- Fix compass tab not updating when location changes
- Toggle visible of layer should update UI to show eye icon
- Move checkmark (active) and eye (visible) to left column
- Show markers from all visible layers
- Separate active markers and visible markers, when adjusting camera after active layer changes, only zoom to bounds of markers on active layer
- Hide pinned/favorites layer feature
- Fix description of active layer footer text to mention that active and visible layers are visible on the map.
- Make Active & Visible / Make Visible / Make Hidden
- Rename views and models as appropriate for updates tab and layers UI
One year anniversay of devlopment. Should be finished any day now… 😵💫
- Redesign UI to use tabs because why not completely redesign the app again. 🎉
- Add overlay cell to item view
- Fix compass heading service getting enabled on compass and map tabs correctly
- Do not ask for always location tracking
- Tweak continent coordinates
- Support landscape mode
- Initial redesign work to use tabs
- Import new overlay from GPX file
- Import many overlays from selecting ZIP file using Import File
- Import from ZIP file using Files.app
- Refresh map annotations when Show Marker Names is changed in settings
- Export overlay as GPX
- Export selected items as GPX
- Show navigation info on compass sheet
- Use locale continent for default coordinates
- Use locale for setting initial units
- Use overlay bounds when suggesting overlay name
- Only show blank slate when overlay is truly blank
- Improve look of overlay sheet disclosure icon
- Tapping Mapbox compass stops map tracking
- Implement Navigate To
- Implement Stop Navigating
- Request notification permission when starting navigation
- Show navigation annotation on map
- Fix bug where creating new overlay results in navigation title being transparent.
- Optimize map updates so that map action menu does not flash because of location service updates
- Show navigate info on badge
- Add optimization to prevent too many updates when watching puck location (because puck smoothly animates)
- View extension to perform action when application moving to the background so that camera is saved correctly.
- Refactor camera logic to simplify and make more modular and come to a better understanding of it.
- Clamp map camera zoom when tracking location to reasonable range
- Select offline map uses last camera value
- Do not update coordinate when picking coordinate format OR editing a go to coordinate
- Implement show item on map action
- Show current location info on compass sheet
- Fix initial map camera bounds
- Fix turning off tracking state with user interaction
- Keep puck in map center when tracking location
- Fix overlay name not updating navigation title on overlay sheet after updating
- Show selected marker in SelectedFeatureSheet
- Add My Location action menu item
- Use current position in suggested names for overlays
- Fix determining new untitled overlay name
- Fix new overlay transparent navigation bar glitch
- Hover badge shows item name
- Fix zoom to bounds when changing overlays
- Fix target camera zoom to and map state problems
- Fix restore original camera bearing and pitch when returning to same overlay
- Add UI hooks to support import URL
- Show down chevron to bring up overlay sheet like Ivory and Apollo and others (vs trailing/right chevron)
- Remove unneeded hack with navigation stack and mapbox map view
- Continued smashing head. I’ve got a better understanding of state and list quirks but still not satisfied. I’m starting to document some of the issues that I find in GitHub under a new notes project using issues. This way I’ll be able to share a link to others to ask for help or use as a reference of stuff to ask for help on if I ever get a chance.
- Smashing my head with understanding SwiftUI state. I’m starting to get it but I really wish I would have somebody to confirm my mental model of it. It’s frustrating because I just want a pattern that I can use for views and a set of rules to follow and I still haven’t been able to figure that out. Everything seems to be working again.
- Show list of recently deleted items
- Restore recently deleted with confirmation
- Hard delete with confirmation
- Hard delete after 30 days
- Fix bugs related to overlays and items not updating correctly because of ObservedObject and related SwiftUI witchcraft.
- Generate predictable default marker name
- Remember last marker color and shape
- Edit overlay name and description via OverlayEditor
- Use OverlayEditor when creating new overlay
- Sort items by updated at by default
- Filter items name
- All sorting items by name or date
- Show blank slate when search text returns no results
- Rename Overlay/Item from Document, Project, Feature, Waypoint
- Edit item name, color, shape
- Create welcome project on first launch
- Fix toggling map between 2D & 3D
- Rename MapState from AppState and inject deeper into view tree
- Fix Launch action so that it only creates a single Welcome document on the first device and not on all devices
- Refactor FetchedResults from HomeView into AppView but keep it just publishing projectDictionary. HomeView will re-render and split up into different views on a db change.
- Rethink AppMain > AppView > ProjectView > DocumentView
- Research how to remove GRDB from coordinate formats and offline maps. Decided on using AppDefaults and JSON serialization because the amount of data is quite small.
- Refactor coordinate formats to save with AppDefaults as JSON
- Refactor offline maps to persist using AppDefaults saved as JSON (vs saving in GRDB)
- Fix file size not showing up after saving, likely not getting updated during progress?
- Fix hang/crash when resizing offline map region
- Deleting an offline map needs to cancel the download
- Fix fast download finishes as canceled - likely a race condition
- Fix app killed before download completed and download is left hanging but unable to Cancel
- Remove GRDB dependency and related code
- Fix flashing menu in document view by moving location service and heading service higher into the environment vs at the AppMain level. Eventually AppState should be renamed to MapState and moved there as well. Then consider renaming AppSettings back to AppState?
- Extract LocationServiceStatus() from LocationService
- Add point at map center
- Item description editor (fixing bug where edited items weren’t updating DocumentSheet correctly)
- Show coordinates for marker items
- Edit marker altitude
- Show markers on map
- Improve developer mode settings
- CoreData / iCloud working. Starting migrating code to use it. This is going to be huge.
- CoreData / iCloud experiment. Worked on a test app inside of Land Nav to see what it would be like using Core Data and iCloud. There are a few bumps but I’m convinced this is a better route than using GRDB and will now start converting the app to use it.
- Add Settings > Geofences and show list of all monitoredRegions with the ability to delete each one
- Make documents view use context menu like Freeform instead of lots of swipe actions
- Refactor database migrations
- Update welcome map text
- Handle case where user can’t make payments
- Make Land Nav test flight build to get App Store ID and IAP ids
Jan 2, 2023:
- Update new and edit icons
- Remove bottom toolbar from Documents view
- Show UI to confirm before import Zip file
- Disable new/import unless purchased when >= 2 maps present
- Unlock full app with in-app purchase
- Renamed as Land Nav
- Implement delete and export selected items
- Remove move selected items and document picker feature. Same feature can be done via Export/Import
- Replace app icon to not use SF Symbols (which aren’t allowed to be used in app icons)
- Clean up button labels and general UI tweaks
- Simplify map options, only show/hide names
- Remove fullscreen support
- Offline maps under settings
- Left handed map download map option or provide thumb tool on both sides
- Add quick access to mark map center
- Show Compass doesn’t hide navigate to compass badge (only the heading badge)
- Export/import GPX preserves all data
- Use natural naming (e.g., Point 1, Track 21) and ordering
- Clean up select, tracking, and editing state when deleting features
- Request to show notifications when tracking startsShow notification and stop recording when app is killed to indicate track recording as stopped
- Show notification when arriving at waypoint or end of feature
- Add setting to indicate distance to trigger alert when navigating
- Ask for notifications when navigate to is configured AND arrival distance is not nil
- Codename generator for waypoint and feature names
- Remove need for always accessing location - not needed
- Removed unneeded DebouncedChangeViewModifier because it isn’t needed in the app but keeping a link as I might need it in the future.
- Remove needless method parameters, mainly passing appState when in view methods
- Update SwiftLint and SwiftFormat to latest versions
- Update track recorder badge to update every second to give feedback that recording is still happening
- Red track recorder badge icon. Tried flashing it but I think that is too distracting. Having the second update is enough to provide feedback something is working.
- Upgrade to latest MapboxMaps and GRDB
- Show track recorder badge
- UI to show when track recording on different map
Dec 6-14: ??? Track recording research? Was feeling burnt out and disillusioned and needed a break.
- Add new map button to maps instead of toolbar
- Created at in footer
- Implement finish and resume track recording
- Improve UI for setting feature kind
- Improve UI for feature actions
Nov 27, 28, 30, Dec 1: Needed a break so played a bunch of Civ5 and chilled
- Initial track recorder (only works in foreground)
- Improved sheet UI
- Simplify feature description
- Hide modified at on Waypoints and Features details
- Show area instead of distance in region details
- Group features by kind
- Save document lastOpenedAt and allow sorting by that so we show the most recently used documents first
- Remove document date
- Show description in document list view
- Remove distance away document sheet view list view. Distance away is difficult for lines and regions and I’m not sure it provides a lot of value. Something that could be added later.
- Refactor how map annotations so areas are drawn differently than lines
- Draw region border for unmodified/modified using a line
- Hide features when selected, hovered, editing using new highlighted feature state
- Navigate to region navigates to center of region (easier to handle case when inside region than navigating to closets point on outside of region)
- Delete Marker and Delete Line messages
- Reverse line
- Initial region drawing
- Edit feature kind
- Area units
- Refactor how coordinates are managed for feature records
- Delete features with fewer than 2 points (3 for regions) when drawing is done
- Add custom region icon
- Tap to toggle Distance To Dest/To Next
- Show Distance and Bearing on top row
- Hide Duration
- Swap course and speed
- Closing My Location sheet inside nav sheet should not close nav sheet
- Navigate along routes
- Fix wrapping in document view title when name is long
- Fix location services turned off or reduced accuracy
- Hide cursor badge when highlighted = selected and sheet open.
- Only zoom to bounds when map changes
- Add start/end circle markers to lines
- Hide elevation profile and all other line actions (for now)
- Change line icon to be a single line without vertex and make it horizontal and not have a background halo
- Rename plus to cross for markers
- Reduce UX churn/flickering when location updates
- Improve UX when location services turned off
- Use smaller coordinates font
- Show feature and waypoint counts in documents view
- Rename Waypoint as Marker
- Add dot marker shape
- Fix map scale
- Improve map coordinates badge
- Edit feature record description
- Show feature record should select it
- Worked on hover and selection but still haven’t figured it out yet
- Show badge above cross hairs
- Hide map selection label in coordinates
- Open go to panel when tapping on coordinate
- Disable hepatics to see if it’s missed
- Import routes as red by default (vs cyan)
Oct 23-Nov 1:
- Efficiently editing maps with a large number of features (lines)
- Highlight routes on map when featureRecord selected (not just hovered)
- SelectedFeature sheet shows selected waypoint or feature (or nothing)
- Map selection to select myLocation and be prepared for it to select other POI
- Tap map, uses 32x32 rectangle (vs point) to detect features
- Tap map, if under mapCursor, if let hoverKind: select hoverKind; open sheet
- Provide hepatic feedback if tapping selects something
- Lots of investigation into understanding state and SwiftUI. I think I’m starting to get it. SwiftUI likes structs and keeping state simple. ViewModels make that difficult.
- Remove DocumentViewModel
- Rename SelectedFeatureSheet
- Lots of refactoring getting state and styles to work correctly so that hover detecting of waypoints and routes works correctly. I needed to completely rework WaypointView to not use a view model because the center point sheet that was calling the waypoint view was initializing the view model in the initializer but then when the waypoint changed for the view, the changes weren’t getting reflected. Also, when WaypointView was listing for database changes it seemed like it was listening to every waypoint in the document! I think I fixed all this by making WaypointView dumb. I’ll need to go through and look at all instances where database observation is happening to see if there is more of this going on but for now will focus on getting route drawing to work in hopes of getting to feature complete. Oct 7-8:
- I’m a stubborn mother fucker. Finally after reading the docs and going through example code I’ve been able to get FeatureState, Sources, Style layers and expressions all working to efficiently style specific features like tracks. This is going to make the app possible.
- Working on improving performance when dealing with large number of routes/tracks. Mapbox’s queryRenderedFeatures method allows using the built-in spatial index for fast look up of annotations.
- I still think there is a lot of performance issues that I’m messing up with SwitUI, and especially around LocationServices causing the view to update to frequently.
- Zoom to routes/bounds
- Improve drawing sheet UI
- Improve design of selected/not-selected drawing lines and vertices
- Show next vertex annotation when editing drawing in white
- Detect drawing vertex and segments under point
- Snap to route vertices when drawing
- Snap etc route edges when drawing
- Drawing OR Waypoint can be selected
- DeleteDrawing operation
- Done drawing operation
- Show routes in document sheet
- Improved Z-order of map annotations
- Draw route vertices with map annotations
- Route icons (based on color)
- Redesign drawing UI to use sheet instead of buttons/badges
- Save routes in database
- Fix bug with edit mode in DocumentsView not removing selection and changing editMode correctly.
- Decided (again) not to use pushed controllers for document sheet OR waypoint details. The app design revolves around the map for the document sheet so using a pushed controller feels too heavy. For waypoint editors the UI would be different when pushing a controller from the waypoint center point sheet vs the document sheet so didn’t even try it.
- Tried but rejected fading map on will disappear because it will require too much logic to handle when view might disappear but the user doesn’t complete the slide back gesture leaving a faded out view.
- Refactored code in prep for document view re-organization
- Consider Maps > Map (sheet contents) > mapbox map view. This would remove sheet. Allow putting a thumbnail of map bounds on details view. Tapping opens the full map. Back button from map to get contents. NO lots of work to make it functional I think and it feels more complicated. The goal is to get to the map fast.
- Bash head around state issues and other SwiftUI limitations
- Open GPX from Files.app and other apps via share screen, e.g., export from MilGPS
- Export description and date as GPX extension
- Fix crash when moving selected waypoints
- Import description and date from GPX
- Export selected documents from documents view
- Improved camera animations and app state code
- When tracking current location camera fly duration should be longer, e.g., about 1 second so that it smoothly animates between location updates. Using 200ms makes for jumps
- Investigate flashing doc menu caused by refreshing polyline annotations during GPS updates. Not sure why. Spent some time removing global access to heading, location, and motion services but it didn’t help.
- Possible bug with Done button when selecting documents. One time Done was shown but tapping wasn’t changing EditMode. Unable to reproduce.
- Add CloseButton to WaypointSheet
- Clean up bottomSheet code
- Try Swift 5.7 Regex, not worth changing working code
- Refresh map annotations when waypoint settings (e.g., show coordinates always) is modified
- Investigated published changes runtime warning: Likely a bug that will be fixed. Others are having issues with it so putting it on hold until guidance from Apple becomes available.
- Consider move of operations to AppState extensions - NO
- Difficult to separate helper methods on AppState from user operations. I fear this will be a huge logic soup if I go this direction.
- There is some value in having helper methods used by the operations for common actions but ideally each user action is its own Operation (or Action) enum.
- Upgrade Mapbox to 10.8.1
- Remove ToastUI dependency
- Upgrade GRDB to 6.0.0
- Redesign map bottom sheets
- Initial improvement on animating map camera
- Set deployment target to iOS 16
- Fix stuck selection in lists and wrong title in back button pattern on iOS16.
- Determine what to do about bottom bar problem
- Hide document details on document sheet when searching
- Fix publishing changes runtime warning caused by acknowledgeMapViewDidUpdate
- Fix offline maps initial download getting canceled has null requiredTileCount but while downloading it was present.
- Determined issues with iOS16 thanks to Stack Overflow. I’m considering going with iOS 16 but not required. A UI design tweak to not use toggling bottom bars will work around the problem and there is precedent with the Notes app in this behaviour.
- Rename onUpdate and onCancel to updateAction and cancelAction
- Hide share button from My Location and Map Center tabs
- Request location services access when viewing a map (not the map list)
- On first launch show Welcome map, not maps list. It will make for a more dramatic start to see a map up front. Learning about multiple maps is something that can come later.
- Rewrite welcome map description
- Investigate problems with Xcode 14 and iOS 16 :(
- Offset map center to make room for bottom sheets
- Fix swipe to move on sheet tries to delete
- Do not offset when drawing
- Fix coordinate for sorting after adding new format.
- Update migrations to use UUID for all records.
- Fix renaming offline maps while they are downloading
- Fix document updates from document sheet
- CoordinateFormats in database
- Remove waypoints from AppState. View model observes database for changes now
- Redesign DocumentsView to use MVVM architecture
- Rename activeDocument as currentDocument to match currentCoordinateFormat
- Understand SwiftUI. After many days of banging my head around SwiftUI and wondering why my list wasn’t animating because of where I would place objects I realized that when a list is annotated with animate(.default, viewModel.documentInfos) you can’t then get that documentInfos out of an EnvironmentObject and expect the list to animate correctly. Those documentInfos must be passed to the child struct and then all works as expected. This was an extremely expensive lesson to learn and I spent literally days trying to figure it out.
- Refactor to move all operations from reducer into view code and delete AppStore
- Rename Settings to AppState
- Clean up AppState
- Implement a good pattern for showing error messages but adopt “let it crash” for errors that should never fail (e.g., writes to the local database)
- Handle error when too big an area is downloaded
- Handle error when tile limit is exceeded
- Tile usage details
- Add ability to sort offline maps by created At, name, tile count, disk usage
- Suggest waypoint name button
- Cancel shows Retry or Delete buttons instead of immediately removing
- Don’t restrict downloads over cellular, use system settings for that
- Add OfflineMapDetailsView where it shows a map snapshot of the download region and buttons to delete, refresh, and rename.
Feb 10 - Aug 14, 2022
During this time I wasn’t keeping accurate notes because I thought the app was only going to take “a couple of months, I mean how hard could it be?”
- Improve Swift concurrency code and understanding 🎉
- Persist coordinate formats when saving a new format
- Rename Figures Only to Abbreviated
- Improve layout of UTM and MGRS coordinate editors
- Use abbreviated distance and bearing for map waypoint annotations
- Remove unneeded advanced settings header from dev mode
- Rename Go To as Move/Move To
- Left align coordinate editors to match how coordinates are displayed
- Allow changing format when editing coordinates in an editor.
- Use bold font in coordinate editor to match font used to displays. LargeTitle bold
- Add World Magnetic Model to show declination on navigate screen
- Use Turf for distance and bearing math
- Add swipe actions for waypoint table rows
- Add waypoint delete confirmation
- Add satellite and dark map styles
- Add full screen camera mode
- Add waypoint action button images
- Investigate slow changing colors and styles on waypoint details. Solution works but doesn’t make sense.
- Improve pattern for redux binding boilerplate code
- Render points with different colours, shapes, icons
- If current location is available show distance from points in points view
- Give names for coordinate systems instead of using abbreviations
- Add text clear button to text fields
- Selected point gets dark border
- Selected point is last drawn so it’s always on top
Draw line from current position to navigationWaypoint
- Show actual distance from current position on waypoints table (if available)
- Show color icon in waypoints table
- Allow editing point details, name, color, shape
- Points view subscribes to LocationManager for currentPosition?
- Show distance and bearing to point from current position (if available)
- Point name
- Coordinate location
- Bearing to point
- Distance to point
- Current heading
- Change state.waypoints back to dictionary of UUID: Waypoint for O(1) lookups of selected and navigation waypoints
- Fix bottom sheet dark mode not taking
- Replace Core Data with GRDB
- Filter waypoints by name
Map Waypoints Settings
[x] Show Waypoint Name (Always When Selected Never)
- Show Coordinates When Selected
- Show Distance and Bearing When Selected
- Show Help Text When Selected
- Add map waypoint visibility settings
- Render selected map waypoint on top of all others
- Selected point annotation bearing and distance updates as current position changes
- Fix deleting waypoint from map sheet while ensuring it also works from Waypoints table view.
- Tapping on selected waypoint shows waypoint details from map screen
- Deleting a waypoint checks to see if it is selected and unselects it.
- Show points in table view on Points tab
- Create point
- Implement location accuracy unit (feet or meters)
- Selected Point state. Tap on map point to get coordinates otherwise only show name.
- Tap on map but not annotation clears selected waypoint only if one is specified to prevent needless state changes.
- Show points on map view
- Fix Waypoints list/detail view. I think points needs to cached into an array from points model as the detail view isn’t showing the correct point details when a row is tapped
- Consider renaming Points to Waypoints in UI as that is the correct term
- Get point annotations looking good with color and shape on map and in points list and detail view
- Use fixed width font on map annotations (requires editing map style?)
- Save and restore created points into CoreData database
- Tap to scroll/zoom to current position
- Tap to show action menu buttons
- Show position in selected format map cursor
- Show distance and bearing “from me” to map centre cross hairs
- Click nav arrow to move map to current position at current zoom level
- Settings view changes AppStorage properties for user defaults
- Add formatters for UTM and other coordinate systems
- Fix location not showing updated coordinates
- Add ability for user to select number of fractional digits
- Add placeholder app icon
- Fix location font size to work with large device text sizes, current at large text sizes text is truncated
Jun 5: Fix: Edit document date and click save when date picker open doesn’t dismiss sheet. Document is updated but sheet needs to be dragged to be closed as even repeated clicks to Save does nothing.
- Jun 5: Move waypoints
- Consider adding document name to map hud and providing a setting to hide it along with other settings to hide other information. Rejected: adds clutter and no good reason (yet) to have it.
Sort waypoints and documents
- Jun 4: Add horizontal padding for description editor
- Remove edit icon for waypoint description, not needed nor is it standard
Hide compass cardinal letter if navigation waypoint bearing near the cardinal value causing overlap
Fix can’t edit position format because in position format details the view keeps getting updated. Related to location being updated??
Fix random crash bug somewhat related map interactions and maybe to cancel delete confirmation but might be more subtle. Not sure how to duplicate yet. Seems to have vanished after redesigning Settings and moving each setting form into it’s own view. Possibly related??
- Rethink waypoint actions
- Implement new waypoint menu
- Remove support for Project From in waypoint details
- Consider removing waypoint action menu and moving actions back to main view to make them easier to find. Action menu button could scroll view to the bottom
- Dashboard sheet
- Compass sheet
- Tracker Recorder sheet
- Settings sheet
- Map Style
- 3D Mode
- Tracking Mode
- Mark map center
- Mark my location
- Project from me
- Coordinate Format editor
- Copy coordinate
- Zoom to coordinate
- Share coordinate
Add sheet gripper to all bottom sheets (medium detents)
- Setting: Show Map Center Coordinates)
Setting: Delete help text on map waypoints
- Mark at coordinates (on map action menu)
- Stub draw and measure (on map action menu)
Stub plot photos (on map action menu)
- Consider subheadline vs caption for away, bearing on coordinate badge, check on device
Rethink all design map controls at top and under a top right menu
- Consider map type saved as part of the map document along with 3D status
- OR Consider having global settings separate from map settings and the global settings are in one area and the map settings are in another. This still might be possible with the 1 top right menu with all map settings under Map Details or Map Layers or Map Properties or Map Data and the rest of the stuff on that menu is setting global settings
- Toggle coordinate hud
- Toggle compass heading
- Toggle track recorder status
v2: Rethink coordinate formats. I think tapping on coordinates on bottom bar should quickly allow switching the format. From the format switcher it should be possible to configure coordinate formats from another page? Needs to work with Location sheet.
- v1: Re-think coordinate formats and editor to be something simpler. E.g., Have a primary format and setting to define how many alternative formats you want. Waypoint details then shows primary and all alternative formats. Menu picker allows switching primary format to any of the configured formats. I guess this is like what I have so …. Maybe too complicated
- Consider adding course arrow on compass
- Top left compass widget animates arrow, font is sub headline? Same as what is used for badges. Bold. Reserve space for 4 digits for mils or 359d
- Reduce size of compass wheel to at least have padding. Consider
- Improve design of waypoint sheet to look like Maps
- Coordinate HUD adds away, bearing text. E.g., 443m away, bearing 47d NE
- Fix light mode on compass
- Documents have user supplied date
- Remove concept date and UUID from app environment, it isn’t getting used consistently and so it should be removed since it only adds complexity at this time.
- Documents are used to organize waypoints, routes, tracks, notes, and drawings.
- New documents have default name rather than blank to speed up creating.
- Only one document is active.
- You can make any inactive document active but you cannot make the active document inactive.
- Waypoints in the active document are shown on the map.
- New waypoints are created by default in the active document.
- The active document cannot be deleted.
- Rename layer to document in code and database
App first launch creates Default and Welcome! 🎉 documents
- Build global alert state to handle errors
- Correctly read files in place from iCloud
- Share & export from action menu
- Improve action sheet menu headings
- Delete selected waypoint
- Share waypoint as text with links to Apple and Google maps
- Export waypoints as GPX file
- Import GPX
- Show course and speed on position tab
- Save last used color and shape
- Delete many waypoints
- Project waypoint
Go to map coordinate
Consider renaming app to Awesome GPS
- Refactor motion manager to act like location manger
- Fix waypoint editor bug when half shown on map sheet (and maybe compass). CPU seems to be running hot when doing this and changing color and shape doesn’t reliably work. Feels like something is going crazy in an update loop
Add compass to navigate screen
- Use Gyroscope API to show pitch and roll in centre of compass
- Add hepatic feedback when rotating compass through medium ticks, e.g., every 20-30 degrees
- Show level bubble indicator
- Show inclination gauge and read out
- Show declination on compass screen
- Rename navigation tab to “Compass”
- Fix declination calculation on navigate screen (sometimes is wrong when compass heading changes between 0..16 deg)
- Smoothly animate compass rotation
- Add concept of DistanceUnits
- Add concept of BearingUnit (degrees or mils)
- Rename Location Format to Position Format
- Use Figures Only for Abbreviated AND Signed
- Elevation on position screen in mono font
- Pager (vs table picker) for selecting position format on position screen
- Improve location format editing
- Add created and updated at time stamps to waypoint details
- Edit waypoint notes
Edit waypoint altitude
- Remove selected waypoint from document menu, it is confusing
- Tap map cursor to show MapCenterSheet
- Try PositionRow (FormattedCoordinateView) on Waypoint view instead of CoordinateStack and see how it feels to use that
Make coordinate and distance bearing badges expandable on map
- Snap to waypoint when scrolling map to show name on map and change distance and bearing badge content
- Tap current location blue dot to show MyLocationSheet
Refactor map tap callback to return MapContentKind
Determine why app is running at 35% CPU when doing nothing but showing the map or even list of maps
- I hate to see this because it’s easy to blame MapBox but I think it is MapBox…
- Try: Profile MapBox example app to see how it acts with energy
- Try: MapKit app with MapBox 2D tiles to see if that is the direction I should go. This means losing the 3D view.
- Even MapKit runs high CPU on basic example. Maps are energy drainers. Be aware!
Implement go to coordinate on map center sheet to find coordinates from 105 Hikes
- Course and speed on compass page always
- Consider document details getting pushed into nav stack instead of presented as a sheet. NO: Decided against because when clicking show on waypoint details to get back to map view it is much nicer to simply dismiss the sheet and reveal the map vs going back multiple levels to get to map.
Redesign My Location sheet to follow patterns in Map Center
- Settings all one screen. Link to coordinate formats as popup?
- Consider disclosure icon in menu for 4 edit items on waypoint menu. Nope, doesn’t make sense. Normally this would mean a sub menu is appearing so hard to justify why I should be using it.
- DocumentSheet details section, replace edit icon with disclosure icon
- Coordinate formats shows precision
- Swipe right to edit coordinate format
Replace Cancel with Close button on coordinate format picker
- Redesign Waypoint sheet to follow patterns in Map Center
- When pushed in table view
- Remove close button
- Show share button in toolbar
- Consider reducing negative margin adjustment, text seems almost too tight
- Confirm delete when using bottom delete button and change from red text to primary text, confirmation delete should be red
- Consider adding Edit Altitude and Edit Description menu items -or- removing Rename and Edit Coordinate menu items
- Consider spacer(minWidth: 0) for in title to see if Cafe au Clay waypoint title can have more room. Seems to wrap too early
- When pushed in table view
- Ensure dismiss works as expected in both contexts (bottom sheet and pushed from document sheet)
- Implement waypoint Project From
- Implement waypoint Rename
- Consider moving waypoint color and shape to rename editor
- Sunset/sunrise cell
- Moon phase cell
- Enable globe projection
- Change title to Rename for waypoint name and mark editor
- Waypoint delete button should be entire bubble?
- Always confirm before deleting waypoint and making button red (destructive)
- Add other actions as buttons at bottom
- Declination cell has disclosure indicator to popup declination picture
- GPS signal correctly shows last update and signal strength description
- Rotate the moon emoji to match the moon illumination angle. Date and time moon info does this.
- Consider not using monospaced for waypoint title. Just largeTitle might be fine. Yes, works well.
- Map center sheet should not show distance and bearing when tracking location because it doesn’t make sense when interpolating.
- My location badge should use map center when tracking to get interpolated coordinates. The sheet is doing this but the badge is not. But when not tracking use the current location coordinates. This isn’t happening which means my location sheet is not updating when not tracking.
- Reconsider gps signal strength. very good, good, OK, weak, very weak. V good is < 10m
- Add 2D Topo map custom url to turn on atmosphere and globe projection. Ensure globe and atmosphere is on for all map styles.
- Option to show only map cursor description but not coordinate but also distance and bearing. Actual coordinate isn’t that interesting.
- Info button top left of documents view brings up about sheet
Change accuracy to precision when dealing with coordinate formats. Accuracy should be for gps derived data. I don’t think they should be confused.
- Remove accuracy on coordinate format list
- Hide accuracy on coordinate for Waypoint view
- Hide accuracy on coordinate for Map Center sheet
- Show precision (renamed from accuracy) when editing a coordinate format under the fractional digits (not in the coordinate cell)
Fix bug: select waypoints on document sheet flashing and losing state
- Use same font size on nav to badge as compass badge
- Add my location button to compass when not navigating to waypoint. Remove altitude and declination from compass sheet since it is now available from my location. Consider always having my location be available from compass sheet.
- Switch waypoint view cells to match other sheets
Add hepatic feedback when tapping on map content
- Merge About and Settings leaving only Settings. Put the About page at the top of the settings. Settings gear icon in top left on Maps screen and in action menu in Map AND Maps menu so gear icon and Settings can be explicitly linked (replaces Amount menu item on Maps menu)
- Convert MapCenter and MyLocation sheets to Form to have same look as WaypointForm (rename WaypointView to WaypointForm). Or consider making them all List? Waypoint probably has to be a form as it can be pushed from DocumentSheet
Implement actions on MapCenter/MyLocation sheet button and menu actions
When editing waypoint name it’s possible to lose name changes if tapping navigate before saving. A good reason to move editing name to it’s own editor so as to get rid of clear text box and make sheet layout be without a navigation bar.
- Navigation waypoint map annotation not updating origin from current location. Sticks to where navigate was performed.
Feb 10, 2022
- Intial Commit, what have I started?