Skip to content

Commit 85a47bd

Browse files
authored
Переезд на Xcode 16+ и Swift 6.0 (#315)
* Xcode 16 + Swift 6.0 * Обновил NetworkStatus (нужен тест) * Поднял версию приложения до 3.7.0
1 parent 7a6dcff commit 85a47bd

File tree

14 files changed

+141
-575
lines changed

14 files changed

+141
-575
lines changed

.swift-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.9
1+
6.0

SwiftUI-WorkoutApp.xcodeproj/project.pbxproj

Lines changed: 56 additions & 492 deletions
Large diffs are not rendered by default.

SwiftUI-WorkoutApp/Libraries/SWKeychain/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version: 5.9
1+
// swift-tools-version: 6.0
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription

SwiftUI-WorkoutApp/Libraries/SWModels/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version: 5.9
1+
// swift-tools-version: 6.0
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription

SwiftUI-WorkoutApp/Libraries/SWNetwork/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version: 5.9
1+
// swift-tools-version: 6.0
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription

SwiftUI-WorkoutApp/Libraries/SWNetworkClient/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version: 5.9
1+
// swift-tools-version: 6.0
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription

SwiftUI-WorkoutApp/Libraries/SWUtils/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version: 5.9
1+
// swift-tools-version: 6.0
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription

SwiftUI-WorkoutApp/Libraries/SWUtils/Sources/SWUtils/Extensions/Date+rawValue.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Foundation
22

3-
extension Date: RawRepresentable {
3+
extension Date: @retroactive RawRepresentable {
44
public var rawValue: String {
55
String(timeIntervalSinceReferenceDate)
66
}
Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,72 @@
11
import Foundation
22
import Network
33

4+
@MainActor
45
public final class NetworkStatus: ObservableObject {
5-
private let monitor = NWPathMonitor()
6-
private let queue = DispatchQueue.global(qos: .background)
7-
8-
/// `true` - there is a network connection, `false` - no network connection
96
@Published public private(set) var isConnected = false
7+
private let legacyMonitor = NWPathMonitor()
8+
private var monitorTask: Task<Void, Never>?
109

1110
public init() {
12-
monitor.pathUpdateHandler = { path in
13-
Task { @MainActor in
14-
self.isConnected = path.status == .satisfied
11+
if #available(iOS 17.0, *) {
12+
startModernMonitoring()
13+
} else {
14+
startLegacyMonitoring()
15+
}
16+
}
17+
18+
@available(iOS 17.0, *)
19+
private func startModernMonitoring() {
20+
let monitor = NetworkMonitorActor()
21+
monitorTask = Task {
22+
for await status in monitor.updates {
23+
self.isConnected = status
1524
}
1625
}
17-
monitor.start(queue: queue)
26+
}
27+
28+
private func startLegacyMonitoring() {
29+
let queue = DispatchQueue.global(qos: .background)
30+
legacyMonitor.pathUpdateHandler = { [weak self] path in
31+
DispatchQueue.main.async {
32+
self?.isConnected = path.status == .satisfied
33+
}
34+
}
35+
legacyMonitor.start(queue: queue)
36+
}
37+
38+
deinit {
39+
legacyMonitor.cancel()
40+
monitorTask?.cancel()
41+
}
42+
}
43+
44+
@available(iOS 17.0, *)
45+
private actor NetworkMonitorActor {
46+
private let monitor = NWPathMonitor()
47+
48+
nonisolated var updates: AsyncStream<Bool> {
49+
AsyncStream { continuation in
50+
let handle = Task {
51+
await startMonitoring(continuation: continuation)
52+
}
53+
continuation.onTermination = { @Sendable _ in
54+
handle.cancel()
55+
}
56+
}
57+
}
58+
59+
private func startMonitoring(continuation: AsyncStream<Bool>.Continuation) async {
60+
monitor.pathUpdateHandler = { path in
61+
continuation.yield(path.status == .satisfied)
62+
}
63+
monitor.start(queue: .global(qos: .background))
64+
await withTaskCancellationHandler {
65+
monitor.cancel()
66+
continuation.finish()
67+
} onCancel: {
68+
monitor.cancel()
69+
continuation.finish()
70+
}
1871
}
1972
}

SwiftUI-WorkoutApp/Libraries/SWUtils/Sources/SWUtils/SWAlert.swift

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import SwiftUI
22
import UIKit
33

4+
@MainActor
45
public final class SWAlert {
56
public static let shared = SWAlert()
67
private var currentAlert: UIViewController?
@@ -12,27 +13,25 @@ public final class SWAlert {
1213
/// - message: Текст сообщения
1314
/// - closeButtonTitle: Заголовок кнопки для закрытия алерта
1415
/// - closeButtonStyle: Стиль кнопки для закрытия алерта
15-
public nonisolated func presentDefaultUIKit(
16+
public func presentDefaultUIKit(
1617
title: String? = "",
1718
message: String,
1819
closeButtonTitle: String = "Ok",
1920
closeButtonStyle: UIAlertAction.Style = .default
2021
) {
21-
Task { @MainActor in
22-
guard currentAlert == nil, let topMostViewController else { return }
23-
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
24-
alert.addAction(
25-
.init(
26-
title: closeButtonTitle,
27-
style: closeButtonStyle,
28-
handler: { [weak self] _ in
29-
self?.dismiss()
30-
}
31-
)
22+
guard currentAlert == nil, let topMostViewController else { return }
23+
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
24+
alert.addAction(
25+
.init(
26+
title: closeButtonTitle,
27+
style: closeButtonStyle,
28+
handler: { [weak self] _ in
29+
self?.dismiss()
30+
}
3231
)
33-
currentAlert = alert
34-
topMostViewController.present(alert, animated: true)
35-
}
32+
)
33+
currentAlert = alert
34+
topMostViewController.present(alert, animated: true)
3635
}
3736

3837
/// Показывает стандартный алерт с сообщение об ошибке
@@ -53,7 +52,7 @@ public final class SWAlert {
5352
/// - Parameter isConnected: Состояние подключения к сети
5453
/// - Returns: `true` - нужно показать алерт (нет сети), `false` - алерт не нужен (сеть есть)
5554
@discardableResult
56-
public nonisolated func presentNoConnection(_ isConnected: Bool) -> Bool {
55+
public func presentNoConnection(_ isConnected: Bool) -> Bool {
5756
let showAlert = !isConnected
5857
if showAlert {
5958
presentDefaultUIKit(

0 commit comments

Comments
 (0)