/
CLLocationManager.swift
55 lines (49 loc) 路 2.03 KB
/
CLLocationManager.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import Combine
import CoreLocation
public extension CLLocationManager {
/// Request locaton authorization and subscribe to `CLAuthorizationStatus` updates
/// - Parameters:
/// - manager: `CLLocationManager`
/// - type: `AuthorizationType`
/// - Returns: Publisher with `AuthorizationType`
static func requestLocationAuthorization(
with manager: CLLocationManager = .init(),
type: AuthorizationType
) -> AnyPublisher<CLAuthorizationStatus, Never> {
AuthorizationPublisher(manager: manager, authorizationType: type)
.eraseToAnyPublisher()
}
/// Request locaton **always** authorization `CLAuthorizationStatus` with **upgrade** prompt (experimental)
/// - Parameters:
/// - manager: `CLLocationManager`
/// - Returns: Publisher with `AuthorizationType`
static func requestLocationAlwaysAuthorization(
with manager: CLLocationManager = .init()
) -> AnyPublisher<CLAuthorizationStatus, Never> {
AuthorizationPublisher(manager: manager, authorizationType: .always)
.flatMap { status -> AnyPublisher<CLAuthorizationStatus, Never> in
if status == CLAuthorizationStatus.authorizedAlways {
return AuthorizationPublisher(
manager: manager,
authorizationType: .always
)
.eraseToAnyPublisher()
}
return Just(status).eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
/// Receive location updates from the `CLLocationManager`
/// - Parameter manager: `CLLocationManager`
/// - Returns: Publisher with `[CLLocation]` or `Error`
static func receiveLocationUpdates(
from manager: CLLocationManager = .init()
) -> AnyPublisher<[CLLocation], Error> {
LocationPublisher(manager: manager)
.eraseToAnyPublisher()
}
/// Authorization access level
enum AuthorizationType: String {
case always, whenInUse
}
}