react-native-nitro-geolocation 1.1.4 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -8
- package/android/build.gradle +6 -0
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidAccuracy.kt +105 -0
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidHeadingManager.kt +313 -0
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidLocationSettings.kt +313 -0
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/GetCurrentPosition.kt +46 -45
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/LocationMetadata.kt +26 -0
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/LocationValues.kt +31 -0
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/NitroGeolocation.kt +1025 -140
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/NitroGeolocationCompat.kt +11 -11
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/RequestAuthorization.kt +6 -6
- package/android/src/main/java/com/margelo/nitro/nitrogeolocation/WatchPosition.kt +46 -45
- package/ios/CLLocation+GeolocationMetadata.swift +32 -0
- package/ios/LocationManager.swift +205 -51
- package/ios/NitroGeolocation.swift +949 -110
- package/ios/NitroGeolocationCompat.swift +7 -7
- package/nitrogen/generated/android/c++/JAccuracyAuthorization.hpp +61 -0
- package/nitrogen/generated/android/c++/JAndroidAccuracyPreset.hpp +64 -0
- package/nitrogen/generated/android/c++/JAndroidGranularity.hpp +61 -0
- package/nitrogen/generated/android/c++/{JRNConfigurationInternal.hpp → JCompatGeolocationConfigurationInternal.hpp} +10 -10
- package/nitrogen/generated/android/c++/{JGeolocationError.hpp → JCompatGeolocationError.hpp} +10 -10
- package/nitrogen/generated/android/c++/JCompatGeolocationOptions.hpp +105 -0
- package/nitrogen/generated/android/c++/JCompatGeolocationResponse.hpp +67 -0
- package/nitrogen/generated/android/c++/JFunc_void_AccuracyAuthorization.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_CompatGeolocationError.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_CompatGeolocationResponse.hpp +84 -0
- package/nitrogen/generated/android/c++/JFunc_void_GeolocationResponse.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_Heading.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_LocationProviderStatus.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_PermissionStatus.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_GeocodedLocation_.hpp +97 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_ReverseGeocodedAddress_.hpp +98 -0
- package/nitrogen/generated/android/c++/JGeocodedLocation.hpp +65 -0
- package/nitrogen/generated/android/c++/JGeocodingCoordinates.hpp +61 -0
- package/nitrogen/generated/android/c++/{JModernGeolocationConfiguration.hpp → JGeolocationConfiguration.hpp} +10 -10
- package/nitrogen/generated/android/c++/JGeolocationResponse.hpp +13 -3
- package/nitrogen/generated/android/c++/JHeading.hpp +69 -0
- package/nitrogen/generated/android/c++/JHeadingOptions.hpp +57 -0
- package/nitrogen/generated/android/c++/JHybridNitroGeolocationCompatSpec.cpp +46 -30
- package/nitrogen/generated/android/c++/JHybridNitroGeolocationCompatSpec.hpp +4 -4
- package/nitrogen/generated/android/c++/JHybridNitroGeolocationSpec.cpp +169 -33
- package/nitrogen/generated/android/c++/JHybridNitroGeolocationSpec.hpp +14 -3
- package/nitrogen/generated/android/c++/JIOSAccuracyPreset.hpp +73 -0
- package/nitrogen/generated/android/c++/JIOSActivityType.hpp +67 -0
- package/nitrogen/generated/android/c++/JLocationAccuracyOptions.hpp +65 -0
- package/nitrogen/generated/android/c++/JLocationAvailability.hpp +62 -0
- package/nitrogen/generated/android/c++/JLocationProviderStatus.hpp +77 -0
- package/nitrogen/generated/android/c++/JLocationProviderUsed.hpp +67 -0
- package/nitrogen/generated/android/c++/JLocationRequestOptions.hpp +49 -3
- package/nitrogen/generated/android/c++/{JGeolocationOptions.hpp → JLocationSettingsOptions.hpp} +28 -22
- package/nitrogen/generated/android/c++/JReverseGeocodedAddress.hpp +82 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AccuracyAuthorization.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidAccuracyPreset.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidGranularity.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{RNConfigurationInternal.kt → CompatGeolocationConfigurationInternal.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{GeolocationError.kt → CompatGeolocationError.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/CompatGeolocationOptions.kt +68 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/CompatGeolocationResponse.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_AccuracyAuthorization.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{Func_void_GeolocationError.kt → Func_void_CompatGeolocationError.kt} +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_CompatGeolocationResponse.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_Heading.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_LocationProviderStatus.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_PermissionStatus.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_std__vector_GeocodedLocation_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_std__vector_ReverseGeocodedAddress_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeocodedLocation.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeocodingCoordinates.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{ModernGeolocationConfiguration.kt → GeolocationConfiguration.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeolocationResponse.kt +9 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Heading.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/HeadingOptions.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/HybridNitroGeolocationCompatSpec.kt +7 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/HybridNitroGeolocationSpec.kt +92 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSAccuracyPreset.kt +28 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSActivityType.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationAccuracyOptions.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationAvailability.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationProviderStatus.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationProviderUsed.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationRequestOptions.kt +30 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/{GeolocationOptions.kt → LocationSettingsOptions.kt} +11 -11
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/ReverseGeocodedAddress.kt +56 -0
- package/nitrogen/generated/android/nitrogeolocationOnLoad.cpp +18 -4
- package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Bridge.cpp +76 -12
- package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Bridge.hpp +519 -77
- package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Umbrella.hpp +61 -12
- package/nitrogen/generated/ios/c++/HybridNitroGeolocationCompatSpecSwift.hpp +28 -16
- package/nitrogen/generated/ios/c++/HybridNitroGeolocationSpecSwift.hpp +131 -13
- package/nitrogen/generated/ios/swift/AccuracyAuthorization.swift +44 -0
- package/nitrogen/generated/ios/swift/AndroidAccuracyPreset.swift +48 -0
- package/nitrogen/generated/ios/swift/AndroidGranularity.swift +44 -0
- package/nitrogen/generated/ios/swift/{RNConfigurationInternal.swift → CompatGeolocationConfigurationInternal.swift} +5 -5
- package/nitrogen/generated/ios/swift/{GeolocationError.swift → CompatGeolocationError.swift} +5 -5
- package/nitrogen/generated/ios/swift/CompatGeolocationOptions.swift +208 -0
- package/nitrogen/generated/ios/swift/CompatGeolocationResponse.swift +34 -0
- package/nitrogen/generated/ios/swift/Func_void_AccuracyAuthorization.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_CompatGeolocationError.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_CompatGeolocationResponse.swift +46 -0
- package/nitrogen/generated/ios/swift/{Func_void_GeolocationError.swift → Func_void_Heading.swift} +11 -11
- package/nitrogen/generated/ios/swift/Func_void_LocationAvailability.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_LocationProviderStatus.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_GeocodedLocation_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_ReverseGeocodedAddress_.swift +46 -0
- package/nitrogen/generated/ios/swift/GeocodedLocation.swift +52 -0
- package/nitrogen/generated/ios/swift/GeocodingCoordinates.swift +34 -0
- package/nitrogen/generated/ios/swift/{ModernGeolocationConfiguration.swift → GeolocationConfiguration.swift} +5 -5
- package/nitrogen/generated/ios/swift/GeolocationResponse.swift +31 -2
- package/nitrogen/generated/ios/swift/Heading.swift +70 -0
- package/nitrogen/generated/ios/swift/HeadingOptions.swift +42 -0
- package/nitrogen/generated/ios/swift/HybridNitroGeolocationCompatSpec.swift +4 -4
- package/nitrogen/generated/ios/swift/HybridNitroGeolocationCompatSpec_cxx.swift +28 -28
- package/nitrogen/generated/ios/swift/HybridNitroGeolocationSpec.swift +14 -3
- package/nitrogen/generated/ios/swift/HybridNitroGeolocationSpec_cxx.swift +318 -15
- package/nitrogen/generated/ios/swift/IOSAccuracyPreset.swift +60 -0
- package/nitrogen/generated/ios/swift/IOSActivityType.swift +52 -0
- package/nitrogen/generated/ios/swift/LocationAccuracyOptions.swift +46 -0
- package/nitrogen/generated/ios/swift/LocationAvailability.swift +47 -0
- package/nitrogen/generated/ios/swift/LocationProviderStatus.swift +106 -0
- package/nitrogen/generated/ios/swift/LocationProviderUsed.swift +52 -0
- package/nitrogen/generated/ios/swift/LocationRequestOptions.swift +142 -1
- package/nitrogen/generated/ios/swift/{GeolocationOptions.swift → LocationSettingsOptions.swift} +39 -46
- package/nitrogen/generated/ios/swift/ReverseGeocodedAddress.swift +150 -0
- package/nitrogen/generated/shared/c++/AccuracyAuthorization.hpp +80 -0
- package/nitrogen/generated/shared/c++/AndroidAccuracyPreset.hpp +84 -0
- package/nitrogen/generated/shared/c++/AndroidGranularity.hpp +80 -0
- package/nitrogen/generated/shared/c++/{RNConfigurationInternal.hpp → CompatGeolocationConfigurationInternal.hpp} +11 -11
- package/nitrogen/generated/shared/c++/{GeolocationError.hpp → CompatGeolocationError.hpp} +11 -11
- package/nitrogen/generated/shared/c++/CompatGeolocationOptions.hpp +128 -0
- package/nitrogen/generated/shared/c++/CompatGeolocationResponse.hpp +88 -0
- package/nitrogen/generated/shared/c++/GeocodedLocation.hpp +91 -0
- package/nitrogen/generated/shared/c++/GeocodingCoordinates.hpp +87 -0
- package/nitrogen/generated/shared/c++/{ModernGeolocationConfiguration.hpp → GeolocationConfiguration.hpp} +11 -11
- package/nitrogen/generated/shared/c++/GeolocationResponse.hpp +14 -2
- package/nitrogen/generated/shared/c++/Heading.hpp +95 -0
- package/nitrogen/generated/shared/c++/HeadingOptions.hpp +83 -0
- package/nitrogen/generated/shared/c++/HybridNitroGeolocationCompatSpec.hpp +16 -16
- package/nitrogen/generated/shared/c++/HybridNitroGeolocationSpec.cpp +11 -0
- package/nitrogen/generated/shared/c++/HybridNitroGeolocationSpec.hpp +51 -12
- package/nitrogen/generated/shared/c++/IOSAccuracyPreset.hpp +96 -0
- package/nitrogen/generated/shared/c++/IOSActivityType.hpp +88 -0
- package/nitrogen/generated/shared/c++/LocationAccuracyOptions.hpp +92 -0
- package/nitrogen/generated/shared/c++/LocationAvailability.hpp +88 -0
- package/nitrogen/generated/shared/c++/LocationProviderStatus.hpp +103 -0
- package/nitrogen/generated/shared/c++/LocationProviderUsed.hpp +88 -0
- package/nitrogen/generated/shared/c++/LocationRequestOptions.hpp +47 -3
- package/nitrogen/generated/shared/c++/{GeolocationOptions.hpp → LocationSettingsOptions.hpp} +26 -24
- package/nitrogen/generated/shared/c++/ReverseGeocodedAddress.hpp +108 -0
- package/package.json +1 -1
- package/src/NitroGeolocation.nitro.ts +291 -17
- package/src/NitroGeolocationCompat.nitro.ts +12 -12
- package/src/api/geocode.ts +18 -0
- package/src/api/getAccuracyAuthorization.ts +12 -0
- package/src/api/getCurrentPosition.ts +5 -3
- package/src/api/getHeading.ts +13 -0
- package/src/api/getLastKnownPosition.ts +28 -0
- package/src/api/getLocationAvailability.ts +11 -0
- package/src/api/getProviderStatus.ts +16 -0
- package/src/api/hasServicesEnabled.ts +13 -0
- package/src/api/index.ts +11 -0
- package/src/api/requestLocationSettings.ts +29 -0
- package/src/api/requestPermission.ts +3 -1
- package/src/api/requestTemporaryFullAccuracy.ts +21 -0
- package/src/api/reverseGeocode.ts +23 -0
- package/src/api/setConfiguration.ts +8 -4
- package/src/api/watchHeading.ts +19 -0
- package/src/api/watchPosition.ts +2 -2
- package/src/compat/getCurrentPosition.ts +7 -7
- package/src/compat/index.tsx +5 -5
- package/src/compat/requestAuthorization.ts +2 -2
- package/src/compat/setRNConfiguration.ts +7 -5
- package/src/compat/watchPosition.ts +7 -7
- package/src/devtools/getCurrentPosition.ts +5 -3
- package/src/devtools/index.ts +1 -1
- package/src/devtools/watchPosition.ts +6 -7
- package/src/hooks/useWatchPosition.ts +2 -2
- package/src/index.tsx +35 -6
- package/src/publicTypes.ts +96 -0
- package/src/types.ts +113 -37
- package/src/utils/errors.test.ts +65 -0
- package/src/utils/errors.ts +45 -18
- package/src/utils/index.ts +2 -2
- package/src/utils/provider.test.ts +172 -1
- package/src/utils/provider.ts +50 -5
- package/nitrogen/generated/android/c++/JFunc_void_GeolocationError.hpp +0 -78
|
@@ -11,15 +11,15 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
11
11
|
|
|
12
12
|
private struct LocationRequest {
|
|
13
13
|
let id: UUID = UUID()
|
|
14
|
-
let success: (
|
|
15
|
-
let error: ((
|
|
14
|
+
let success: (CompatGeolocationResponse) -> Void
|
|
15
|
+
let error: ((CompatGeolocationError) -> Void)?
|
|
16
16
|
let options: ParsedOptions
|
|
17
17
|
var timer: DispatchSourceTimer?
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
private struct WatchSubscription {
|
|
21
|
-
let success: (
|
|
22
|
-
let error: ((
|
|
21
|
+
let success: (CompatGeolocationResponse) -> Void
|
|
22
|
+
let error: ((CompatGeolocationError) -> Void)?
|
|
23
23
|
let options: ParsedOptions
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -29,13 +29,18 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
29
29
|
let accuracy: CLLocationAccuracy
|
|
30
30
|
let distanceFilter: CLLocationDistance
|
|
31
31
|
let useSignificantChanges: Bool
|
|
32
|
+
let activityType: CLActivityType?
|
|
33
|
+
let pausesLocationUpdatesAutomatically: Bool?
|
|
34
|
+
let showsBackgroundLocationIndicator: Bool?
|
|
32
35
|
|
|
33
|
-
static func parse(from options:
|
|
36
|
+
static func parse(from options: CompatGeolocationOptions?) -> ParsedOptions {
|
|
34
37
|
let timeout = options?.timeout ?? DEFAULT_TIMEOUT
|
|
35
38
|
let maximumAge = options?.maximumAge ?? DEFAULT_MAXIMUM_AGE
|
|
36
39
|
let enableHighAccuracy = options?.enableHighAccuracy ?? false
|
|
37
|
-
let accuracy =
|
|
38
|
-
|
|
40
|
+
let accuracy = resolveAccuracy(
|
|
41
|
+
preset: options?.accuracy?.ios,
|
|
42
|
+
enableHighAccuracy: enableHighAccuracy
|
|
43
|
+
)
|
|
39
44
|
let distanceFilter = options?.distanceFilter ?? kCLDistanceFilterNone
|
|
40
45
|
let useSignificantChanges = options?.useSignificantChanges ?? false
|
|
41
46
|
|
|
@@ -44,9 +49,59 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
44
49
|
maximumAge: maximumAge,
|
|
45
50
|
accuracy: accuracy,
|
|
46
51
|
distanceFilter: distanceFilter,
|
|
47
|
-
useSignificantChanges: useSignificantChanges
|
|
52
|
+
useSignificantChanges: useSignificantChanges,
|
|
53
|
+
activityType: resolveActivityType(options?.activityType),
|
|
54
|
+
pausesLocationUpdatesAutomatically: options?.pausesLocationUpdatesAutomatically,
|
|
55
|
+
showsBackgroundLocationIndicator: options?.showsBackgroundLocationIndicator
|
|
48
56
|
)
|
|
49
57
|
}
|
|
58
|
+
|
|
59
|
+
private static func resolveAccuracy(
|
|
60
|
+
preset: IOSAccuracyPreset?,
|
|
61
|
+
enableHighAccuracy: Bool
|
|
62
|
+
) -> CLLocationAccuracy {
|
|
63
|
+
guard let preset else {
|
|
64
|
+
return enableHighAccuracy
|
|
65
|
+
? kCLLocationAccuracyBest
|
|
66
|
+
: kCLLocationAccuracyHundredMeters
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
switch preset {
|
|
70
|
+
case .bestfornavigation:
|
|
71
|
+
return kCLLocationAccuracyBestForNavigation
|
|
72
|
+
case .best:
|
|
73
|
+
return kCLLocationAccuracyBest
|
|
74
|
+
case .nearesttenmeters:
|
|
75
|
+
return kCLLocationAccuracyNearestTenMeters
|
|
76
|
+
case .hundredmeters:
|
|
77
|
+
return kCLLocationAccuracyHundredMeters
|
|
78
|
+
case .kilometer:
|
|
79
|
+
return kCLLocationAccuracyKilometer
|
|
80
|
+
case .threekilometers:
|
|
81
|
+
return kCLLocationAccuracyThreeKilometers
|
|
82
|
+
case .reduced:
|
|
83
|
+
return kCLLocationAccuracyReduced
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private static func resolveActivityType(_ activityType: IOSActivityType?) -> CLActivityType? {
|
|
88
|
+
guard let activityType else {
|
|
89
|
+
return nil
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
switch activityType {
|
|
93
|
+
case .other:
|
|
94
|
+
return .other
|
|
95
|
+
case .automotivenavigation:
|
|
96
|
+
return .automotiveNavigation
|
|
97
|
+
case .fitness:
|
|
98
|
+
return .fitness
|
|
99
|
+
case .othernavigation:
|
|
100
|
+
return .otherNavigation
|
|
101
|
+
case .airborne:
|
|
102
|
+
return .airborne
|
|
103
|
+
}
|
|
104
|
+
}
|
|
50
105
|
}
|
|
51
106
|
|
|
52
107
|
// MARK: - Properties
|
|
@@ -57,7 +112,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
57
112
|
|
|
58
113
|
// Authorization
|
|
59
114
|
private var queuedAuthorizationCallbacks:
|
|
60
|
-
[(success: (() -> Void)?, error: ((
|
|
115
|
+
[(success: (() -> Void)?, error: ((CompatGeolocationError) -> Void)?)] = []
|
|
61
116
|
|
|
62
117
|
// getCurrentPosition
|
|
63
118
|
private var pendingRequests: [LocationRequest] = []
|
|
@@ -83,7 +138,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
83
138
|
skipPermissionRequests: Bool,
|
|
84
139
|
enableBackgroundLocationUpdates: Bool,
|
|
85
140
|
success: (() -> Void)?,
|
|
86
|
-
error: ((
|
|
141
|
+
error: ((CompatGeolocationError) -> Void)?
|
|
87
142
|
) {
|
|
88
143
|
initializeLocationManagerIfNeeded()
|
|
89
144
|
enqueueAuthorizationCallbacks(success: success, error: error)
|
|
@@ -114,7 +169,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
114
169
|
}
|
|
115
170
|
|
|
116
171
|
private func enqueueAuthorizationCallbacks(
|
|
117
|
-
success: (() -> Void)?, error: ((
|
|
172
|
+
success: (() -> Void)?, error: ((CompatGeolocationError) -> Void)?
|
|
118
173
|
) {
|
|
119
174
|
guard success != nil || error != nil else { return }
|
|
120
175
|
queuedAuthorizationCallbacks.append((success: success, error: error))
|
|
@@ -146,9 +201,9 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
146
201
|
// MARK: - Get Current Position
|
|
147
202
|
|
|
148
203
|
func getCurrentPosition(
|
|
149
|
-
success: @escaping (
|
|
150
|
-
error: ((
|
|
151
|
-
options:
|
|
204
|
+
success: @escaping (CompatGeolocationResponse) -> Void,
|
|
205
|
+
error: ((CompatGeolocationError) -> Void)?,
|
|
206
|
+
options: CompatGeolocationOptions?
|
|
152
207
|
) {
|
|
153
208
|
let parsedOptions = ParsedOptions.parse(from: options)
|
|
154
209
|
|
|
@@ -170,10 +225,6 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
170
225
|
|
|
171
226
|
initializeLocationManagerIfNeeded()
|
|
172
227
|
|
|
173
|
-
// Configure location manager
|
|
174
|
-
locationManager?.desiredAccuracy = parsedOptions.accuracy
|
|
175
|
-
locationManager?.distanceFilter = parsedOptions.distanceFilter
|
|
176
|
-
|
|
177
228
|
// Create request
|
|
178
229
|
var request = LocationRequest(
|
|
179
230
|
success: success,
|
|
@@ -193,16 +244,17 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
193
244
|
|
|
194
245
|
pendingRequests.append(request)
|
|
195
246
|
|
|
196
|
-
//
|
|
247
|
+
// Update configuration and start location updates
|
|
248
|
+
updateLocationManagerConfiguration()
|
|
197
249
|
startMonitoring()
|
|
198
250
|
}
|
|
199
251
|
|
|
200
252
|
// MARK: - Watch Position
|
|
201
253
|
|
|
202
254
|
func watchPosition(
|
|
203
|
-
success: @escaping (
|
|
204
|
-
error: ((
|
|
205
|
-
options:
|
|
255
|
+
success: @escaping (CompatGeolocationResponse) -> Void,
|
|
256
|
+
error: ((CompatGeolocationError) -> Void)?,
|
|
257
|
+
options: CompatGeolocationOptions?
|
|
206
258
|
) -> Double {
|
|
207
259
|
let parsedOptions = ParsedOptions.parse(from: options)
|
|
208
260
|
let watchId = nextWatchId
|
|
@@ -218,10 +270,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
218
270
|
|
|
219
271
|
initializeLocationManagerIfNeeded()
|
|
220
272
|
|
|
221
|
-
|
|
222
|
-
locationManager?.desiredAccuracy = parsedOptions.accuracy
|
|
223
|
-
locationManager?.distanceFilter = parsedOptions.distanceFilter
|
|
224
|
-
|
|
273
|
+
updateLocationManagerConfiguration()
|
|
225
274
|
startMonitoring()
|
|
226
275
|
|
|
227
276
|
return watchId
|
|
@@ -233,6 +282,8 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
233
282
|
// Stop monitoring if no more watches or pending requests
|
|
234
283
|
if activeWatches.isEmpty && pendingRequests.isEmpty {
|
|
235
284
|
stopMonitoring()
|
|
285
|
+
} else {
|
|
286
|
+
updateLocationManagerConfiguration()
|
|
236
287
|
}
|
|
237
288
|
}
|
|
238
289
|
|
|
@@ -242,6 +293,8 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
242
293
|
// Stop monitoring if no pending requests
|
|
243
294
|
if pendingRequests.isEmpty {
|
|
244
295
|
stopMonitoring()
|
|
296
|
+
} else {
|
|
297
|
+
updateLocationManagerConfiguration()
|
|
245
298
|
}
|
|
246
299
|
}
|
|
247
300
|
|
|
@@ -284,11 +337,13 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
284
337
|
// 3. Stop monitoring if no more watches or pending requests
|
|
285
338
|
if activeWatches.isEmpty && pendingRequests.isEmpty {
|
|
286
339
|
stopMonitoring()
|
|
340
|
+
} else {
|
|
341
|
+
updateLocationManagerConfiguration()
|
|
287
342
|
}
|
|
288
343
|
}
|
|
289
344
|
|
|
290
345
|
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
|
|
291
|
-
let geoError:
|
|
346
|
+
let geoError: CompatGeolocationError
|
|
292
347
|
|
|
293
348
|
if let clError = error as? CLError {
|
|
294
349
|
switch clError.code {
|
|
@@ -345,26 +400,55 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
345
400
|
guard let manager = locationManager else { return }
|
|
346
401
|
|
|
347
402
|
// Find the best (most accurate) settings from all pending requests and active watches
|
|
348
|
-
var bestAccuracy
|
|
349
|
-
var smallestDistanceFilter
|
|
403
|
+
var bestAccuracy: CLLocationAccuracy?
|
|
404
|
+
var smallestDistanceFilter: CLLocationDistance?
|
|
405
|
+
var activityType: CLActivityType?
|
|
406
|
+
var pausesLocationUpdatesAutomatically: Bool?
|
|
407
|
+
var showsBackgroundLocationIndicator = false
|
|
350
408
|
var shouldUseSignificantChanges = false
|
|
351
409
|
|
|
352
410
|
for request in pendingRequests {
|
|
353
|
-
bestAccuracy =
|
|
354
|
-
smallestDistanceFilter =
|
|
411
|
+
bestAccuracy = mergeAccuracy(bestAccuracy, request.options.accuracy)
|
|
412
|
+
smallestDistanceFilter = mergeDistanceFilter(
|
|
413
|
+
smallestDistanceFilter,
|
|
414
|
+
request.options.distanceFilter
|
|
415
|
+
)
|
|
416
|
+
activityType = mergeActivityType(activityType, request.options.activityType)
|
|
417
|
+
pausesLocationUpdatesAutomatically = mergePausesLocationUpdatesAutomatically(
|
|
418
|
+
pausesLocationUpdatesAutomatically,
|
|
419
|
+
request.options.pausesLocationUpdatesAutomatically
|
|
420
|
+
)
|
|
421
|
+
showsBackgroundLocationIndicator = showsBackgroundLocationIndicator ||
|
|
422
|
+
(request.options.showsBackgroundLocationIndicator ?? false)
|
|
355
423
|
shouldUseSignificantChanges =
|
|
356
424
|
shouldUseSignificantChanges || request.options.useSignificantChanges
|
|
357
425
|
}
|
|
358
426
|
|
|
359
427
|
for (_, watch) in activeWatches {
|
|
360
|
-
bestAccuracy =
|
|
361
|
-
smallestDistanceFilter =
|
|
428
|
+
bestAccuracy = mergeAccuracy(bestAccuracy, watch.options.accuracy)
|
|
429
|
+
smallestDistanceFilter = mergeDistanceFilter(
|
|
430
|
+
smallestDistanceFilter,
|
|
431
|
+
watch.options.distanceFilter
|
|
432
|
+
)
|
|
433
|
+
activityType = mergeActivityType(activityType, watch.options.activityType)
|
|
434
|
+
pausesLocationUpdatesAutomatically = mergePausesLocationUpdatesAutomatically(
|
|
435
|
+
pausesLocationUpdatesAutomatically,
|
|
436
|
+
watch.options.pausesLocationUpdatesAutomatically
|
|
437
|
+
)
|
|
438
|
+
showsBackgroundLocationIndicator = showsBackgroundLocationIndicator ||
|
|
439
|
+
(watch.options.showsBackgroundLocationIndicator ?? false)
|
|
362
440
|
shouldUseSignificantChanges =
|
|
363
441
|
shouldUseSignificantChanges || watch.options.useSignificantChanges
|
|
364
442
|
}
|
|
365
443
|
|
|
366
|
-
manager.desiredAccuracy = bestAccuracy
|
|
367
|
-
manager.distanceFilter = smallestDistanceFilter
|
|
444
|
+
manager.desiredAccuracy = bestAccuracy ?? kCLLocationAccuracyHundredMeters
|
|
445
|
+
manager.distanceFilter = smallestDistanceFilter ?? kCLDistanceFilterNone
|
|
446
|
+
manager.activityType = activityType ?? .other
|
|
447
|
+
manager.pausesLocationUpdatesAutomatically = pausesLocationUpdatesAutomatically ?? true
|
|
448
|
+
|
|
449
|
+
if #available(iOS 11.0, *) {
|
|
450
|
+
manager.showsBackgroundLocationIndicator = showsBackgroundLocationIndicator
|
|
451
|
+
}
|
|
368
452
|
|
|
369
453
|
// Update significant changes mode if changed
|
|
370
454
|
if shouldUseSignificantChanges != usingSignificantChanges {
|
|
@@ -374,6 +458,79 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
374
458
|
}
|
|
375
459
|
}
|
|
376
460
|
|
|
461
|
+
private func mergeAccuracy(
|
|
462
|
+
_ current: CLLocationAccuracy?,
|
|
463
|
+
_ next: CLLocationAccuracy
|
|
464
|
+
) -> CLLocationAccuracy {
|
|
465
|
+
guard let current else {
|
|
466
|
+
return next
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
return min(current, next)
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
private func mergeActivityType(
|
|
473
|
+
_ current: CLActivityType?,
|
|
474
|
+
_ next: CLActivityType?
|
|
475
|
+
) -> CLActivityType? {
|
|
476
|
+
guard let next else {
|
|
477
|
+
return current
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
guard let current else {
|
|
481
|
+
return next
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
return activityTypeRank(next) > activityTypeRank(current) ? next : current
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
private func activityTypeRank(_ activityType: CLActivityType) -> Int {
|
|
488
|
+
switch activityType {
|
|
489
|
+
case .other:
|
|
490
|
+
return 0
|
|
491
|
+
case .otherNavigation:
|
|
492
|
+
return 1
|
|
493
|
+
case .automotiveNavigation:
|
|
494
|
+
return 2
|
|
495
|
+
case .fitness:
|
|
496
|
+
return 3
|
|
497
|
+
case .airborne:
|
|
498
|
+
return 4
|
|
499
|
+
@unknown default:
|
|
500
|
+
return 0
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
private func mergePausesLocationUpdatesAutomatically(
|
|
505
|
+
_ current: Bool?,
|
|
506
|
+
_ next: Bool?
|
|
507
|
+
) -> Bool? {
|
|
508
|
+
guard let next else {
|
|
509
|
+
return current
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
guard let current else {
|
|
513
|
+
return next
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
return current && next
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
private func mergeDistanceFilter(
|
|
520
|
+
_ current: CLLocationDistance?,
|
|
521
|
+
_ next: CLLocationDistance
|
|
522
|
+
) -> CLLocationDistance {
|
|
523
|
+
guard let current else {
|
|
524
|
+
return next
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
if current == kCLDistanceFilterNone || next == kCLDistanceFilterNone {
|
|
528
|
+
return kCLDistanceFilterNone
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
return min(current, next)
|
|
532
|
+
}
|
|
533
|
+
|
|
377
534
|
private func startMonitoring() {
|
|
378
535
|
if usingSignificantChanges {
|
|
379
536
|
locationManager?.startMonitoringSignificantLocationChanges()
|
|
@@ -427,6 +584,8 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
427
584
|
// Stop monitoring if no more watches or pending requests
|
|
428
585
|
if activeWatches.isEmpty && pendingRequests.isEmpty {
|
|
429
586
|
stopMonitoring()
|
|
587
|
+
} else {
|
|
588
|
+
updateLocationManagerConfiguration()
|
|
430
589
|
}
|
|
431
590
|
}
|
|
432
591
|
}
|
|
@@ -450,13 +609,13 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
450
609
|
invokeQueuedAuthorizationCallbacks(error: error)
|
|
451
610
|
}
|
|
452
611
|
|
|
453
|
-
private func createGeolocationError(for status: CLAuthorizationStatus) ->
|
|
612
|
+
private func createGeolocationError(for status: CLAuthorizationStatus) -> CompatGeolocationError {
|
|
454
613
|
let message =
|
|
455
614
|
status == .restricted
|
|
456
615
|
? "This application is not authorized to use location services"
|
|
457
616
|
: "User denied access to location services."
|
|
458
617
|
|
|
459
|
-
return
|
|
618
|
+
return CompatGeolocationError(
|
|
460
619
|
code: Double(PERMISSION_DENIED),
|
|
461
620
|
message: message,
|
|
462
621
|
PERMISSION_DENIED: Double(PERMISSION_DENIED),
|
|
@@ -466,7 +625,7 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
466
625
|
}
|
|
467
626
|
|
|
468
627
|
private func invokeQueuedAuthorizationCallbacks(
|
|
469
|
-
success: Bool = false, error:
|
|
628
|
+
success: Bool = false, error: CompatGeolocationError? = nil
|
|
470
629
|
) {
|
|
471
630
|
for callback in queuedAuthorizationCallbacks {
|
|
472
631
|
if success {
|
|
@@ -478,23 +637,18 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
478
637
|
queuedAuthorizationCallbacks.removeAll()
|
|
479
638
|
}
|
|
480
639
|
|
|
481
|
-
func locationToPosition(_ location: CLLocation) ->
|
|
482
|
-
let altitude = location.verticalAccuracy < 0 ? 0.0 : location.altitude
|
|
483
|
-
let altitudeAccuracy = location.verticalAccuracy < 0 ? 0.0 : location.verticalAccuracy
|
|
484
|
-
let heading = location.course >= 0 ? location.course : -1.0
|
|
485
|
-
let speed = location.speed >= 0 ? location.speed : 0.0
|
|
486
|
-
|
|
640
|
+
func locationToPosition(_ location: CLLocation) -> CompatGeolocationResponse {
|
|
487
641
|
let coordsObj = GeolocationCoordinates(
|
|
488
642
|
latitude: location.coordinate.latitude,
|
|
489
643
|
longitude: location.coordinate.longitude,
|
|
490
|
-
altitude: .
|
|
644
|
+
altitude: location.nitroGeolocationAltitude,
|
|
491
645
|
accuracy: location.horizontalAccuracy,
|
|
492
|
-
altitudeAccuracy: .
|
|
493
|
-
heading: .
|
|
494
|
-
speed: .
|
|
646
|
+
altitudeAccuracy: location.nitroGeolocationAltitudeAccuracy,
|
|
647
|
+
heading: location.nitroGeolocationHeading,
|
|
648
|
+
speed: location.nitroGeolocationSpeed
|
|
495
649
|
)
|
|
496
650
|
|
|
497
|
-
let position =
|
|
651
|
+
let position = CompatGeolocationResponse(
|
|
498
652
|
coords: coordsObj,
|
|
499
653
|
timestamp: location.timestamp.timeIntervalSince1970 * 1000
|
|
500
654
|
)
|
|
@@ -502,8 +656,8 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
|
|
|
502
656
|
return position
|
|
503
657
|
}
|
|
504
658
|
|
|
505
|
-
private func createError(code: Int, message: String) ->
|
|
506
|
-
return
|
|
659
|
+
private func createError(code: Int, message: String) -> CompatGeolocationError {
|
|
660
|
+
return CompatGeolocationError(
|
|
507
661
|
code: Double(code),
|
|
508
662
|
message: message,
|
|
509
663
|
PERMISSION_DENIED: Double(PERMISSION_DENIED),
|