Skip to content

Commit d381acf

Browse files
committed
update
1 parent 6bcbcdf commit d381acf

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

Sources/d3-async-location/LocationManagerAsync.swift

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ public final class LocationManagerAsync: NSObject, CLLocationManagerDelegate, IL
1616
/// Location manager
1717
private let manager : CLLocationManager
1818

19-
/// Authorization Permission helper
20-
private var permission : Permission
21-
2219
// Streaming locations
2320

2421
/// Async stream of ``CLLocation``
@@ -56,8 +53,6 @@ public final class LocationManagerAsync: NSObject, CLLocationManagerDelegate, IL
5653

5754
manager = .init()
5855

59-
permission = .init(with: manager.authorizationStatus)
60-
6156
super.init()
6257

6358
}
@@ -67,6 +62,8 @@ public final class LocationManagerAsync: NSObject, CLLocationManagerDelegate, IL
6762
/// Check status and get stream of async data Throw an error ``AsyncLocationErrors`` if permission is not granted
6863
public var start : AsyncThrowingStream<CLLocation, Error>{
6964
get async throws {
65+
let permission = Permission(with: manager.authorizationStatus)
66+
7067
if await permission.isGranted(for: manager){
7168
#if DEBUG
7269
print("start")
@@ -138,12 +135,11 @@ public final class LocationManagerAsync: NSObject, CLLocationManagerDelegate, IL
138135
/// Determine status after the request permission
139136
/// - Parameter manager: Location manager
140137
public func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
141-
permission.locationManagerDidChangeAuthorization(manager)
138+
NotificationCenter.default.post(name: Permission.authorizationStatus, object: manager.authorizationStatus)
142139
}
143140
}
144141

145142
// MARK: - Alias types -
146143

147144
fileprivate typealias Termination = AsyncThrowingStream<CLLocation, Error>.Continuation.Termination
148-
149145
fileprivate typealias Streaming = AsyncThrowingStream<CLLocation, Error>.Continuation

Sources/d3-async-location/Permission.swift

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@
66
//
77

88
import CoreLocation
9+
import Combine
10+
import SwiftUI
911

1012
/// Helper class to determine permission to get access for streaming ``CLLocation``
1113
@available(iOS 15.0, watchOS 7.0, *)
1214
final class Permission{
1315

16+
static let authorizationStatus = Notification.Name("authorizationStatus")
17+
1418
// MARK: - Private properties
1519

1620
/// Current status
@@ -22,10 +26,14 @@ final class Permission{
2226
/// Check if status is determined
2327
private var isDetermined : Bool{ status != .notDetermined }
2428

29+
/// Subscription to authorization status changes
30+
private var canellable : AnyCancellable?
31+
2532
// MARK: - Life circle
2633

2734
init(with status: CLAuthorizationStatus){
2835
self.status = status
36+
initSubscription()
2937
}
3038

3139
// MARK: - API
@@ -34,18 +42,27 @@ final class Permission{
3442
public func isGranted(for manager: CLLocationManager) async -> Bool{
3543
let status = await requestPermission(manager)
3644
return isAuthorized(status)
45+
}
46+
47+
// MARK: - Private methods
48+
49+
private func initSubscription(){
50+
canellable = NotificationCenter.default.publisher(for: Permission.authorizationStatus, object: nil)
51+
.sink { [weak self] value in
52+
self?.authorizationChanged(value)
53+
}
3754
}
3855

3956
/// Determine status after the request permission
4057
/// - Parameter manager: Location manager
41-
public func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
42-
status = manager.authorizationStatus
43-
44-
permissioning?.resume(returning: status)
58+
private func authorizationChanged(_ value: Output) {
59+
if let s = value.object as? CLAuthorizationStatus{
60+
status = s
61+
permissioning?.resume(returning: status)
62+
print(status, "authorizationStatus")
63+
}
4564
}
4665

47-
// MARK: - Private methods
48-
4966
/// Check permission status
5067
/// - Parameter status: Status for checking
5168
/// - Returns: Return `True` if is allowed
@@ -68,3 +85,7 @@ final class Permission{
6885
}
6986
}
7087
}
88+
89+
// MARK: - Alias types -
90+
91+
fileprivate typealias Output = NotificationCenter.Publisher.Output

0 commit comments

Comments
 (0)