Skip to content

ezefranca/SpeedManagerModule

Repository files navigation

SPM compatible github workflow License Twitter

SpeedManagerModule

Simple Speedometer class to iOS and WatchOS.

Measure the speed using an iPhone or Apple Watch.

speedmanager.mov

Note

The Demo UI was created using LidorFadida package SpeedometerSwiftUI

Motivation

I like to measure my speed inside trains and buses. When I was searching for a speedometer app, the majority of them were ugly, with tons of ads. I was searching for an Apple Watch Speedometer with complications, iOS App with Widgets and did not found. Because of that I decided to create my own app. First thing was measure speed using CLLocationManager.

Installation

The Swift Package Manager is the easiest way to install and manage SpeedManagerModule as a dependency. Simply add SpeedManagerModule to your dependencies in your Package.swift file:

dependencies: [
    .package(url: "https://github.com/ezefranca/SpeedManagerModule.git")
]

Update Info.plist

Add the correct permission descriptions

    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>Your description why you should use NSLocationAlwaysAndWhenInUseUsageDescription</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Your description why you should use NSLocationAlwaysAndWhenInUseUsageDescription</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Your description why you should use NSLocationAlwaysAndWhenInUseUsageDescription</string>

Add the background location updates in xcode

Or add the info to the Info.plist

    <key>UIBackgroundModes</key>
    <array>
        <string>location</string>
    </array>

Usage example

@StateObject

import SwiftUI

struct ContentView: View {
    
    @StateObject var speedManager = SpeedManager(.kilometersPerHour)
    
    var body: some View {
        VStack {
            switch speedManager.authorizationStatus {
            case .authorized:
                Text("Your current speed is:")
                Text("\(speedManager.speed)")
            default:
                Spacer()
            }
        }
    }
}

Using Delegates

import UIKit

class SpeedViewController: UIViewController {

    var speedManager = SpeedManager(.kilometersPerHour)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.speedManager.delegate = self
        self.speedManager.startUpdatingSpeed()
    }
}

extension SpeedViewController: SpeedManagerDelegate {
    
    func speedManager(_ manager: SpeedManager, didUpdateSpeed speed: Double, speedAccuracy: Double) {
        // Update UI with the current speed and accuracy
    }
    
    func speedManager(_ manager: SpeedManager, didFailWithError error: Error) {
        // Handle error
    }
    
    func speedManager(_ speedManager: SpeedManager, didUpdateAuthorizationStatus status: SpeedManagerAuthorizationStatus) {
        // Handle authorization status update
    }
    
    func speedManagerDidFailWithLocationServicesUnavailable(_ speedManager: SpeedManager) {
        // Handle location services unavailable
    }
}

Changing Unit

Just choose the unit during the class init.

    var speedManagerKmh = SpeedManager(.kilometersPerHour)
    var speedManagerMs = SpeedManager(.metersPerSecond)
    var speedManagerMph = SpeedManager(.milesPerHour)

Demo

Check the Demo folder to see it in action.

Meta

@ezefranca – @ezefranca

Distributed under the MIT license. See LICENSE for more information.

https://github.com/ezefranca/SpeedManagerModule