ソースを参照

Do not fetch if network is unreachable

Ivan Valkou 5 年 前
コミット
a1eb504434

+ 21 - 0
FreeAPS.xcodeproj/project.pbxproj

@@ -92,6 +92,8 @@
 		3811DF0525CAA62600A708ED /* DependeciesContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DF0425CAA62600A708ED /* DependeciesContainer.swift */; };
 		3811DF0525CAA62600A708ED /* DependeciesContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DF0425CAA62600A708ED /* DependeciesContainer.swift */; };
 		3811DF0825CAAA4700A708ED /* ServiceContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DF0725CAAA4700A708ED /* ServiceContainer.swift */; };
 		3811DF0825CAAA4700A708ED /* ServiceContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DF0725CAAA4700A708ED /* ServiceContainer.swift */; };
 		3811DF1025CAAAE200A708ED /* APSManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DF0F25CAAAE200A708ED /* APSManager.swift */; };
 		3811DF1025CAAAE200A708ED /* APSManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DF0F25CAAAE200A708ED /* APSManager.swift */; };
+		38192E01261B826A0094D973 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 38192E00261B826A0094D973 /* Alamofire */; };
+		38192E04261B82FA0094D973 /* ReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38192E03261B82FA0094D973 /* ReachabilityManager.swift */; };
 		3821ED4C25DD18BA00BC42AD /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3821ED4B25DD18BA00BC42AD /* Constants.swift */; };
 		3821ED4C25DD18BA00BC42AD /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3821ED4B25DD18BA00BC42AD /* Constants.swift */; };
 		382C133725F13A1E00715CE1 /* InsulinSensitivities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 382C133625F13A1E00715CE1 /* InsulinSensitivities.swift */; };
 		382C133725F13A1E00715CE1 /* InsulinSensitivities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 382C133625F13A1E00715CE1 /* InsulinSensitivities.swift */; };
 		382C134B25F14E3700715CE1 /* BGTargets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 382C134A25F14E3700715CE1 /* BGTargets.swift */; };
 		382C134B25F14E3700715CE1 /* BGTargets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 382C134A25F14E3700715CE1 /* BGTargets.swift */; };
@@ -382,6 +384,7 @@
 		3811DF0425CAA62600A708ED /* DependeciesContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DependeciesContainer.swift; sourceTree = "<group>"; };
 		3811DF0425CAA62600A708ED /* DependeciesContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DependeciesContainer.swift; sourceTree = "<group>"; };
 		3811DF0725CAAA4700A708ED /* ServiceContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceContainer.swift; sourceTree = "<group>"; };
 		3811DF0725CAAA4700A708ED /* ServiceContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceContainer.swift; sourceTree = "<group>"; };
 		3811DF0F25CAAAE200A708ED /* APSManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APSManager.swift; sourceTree = "<group>"; };
 		3811DF0F25CAAAE200A708ED /* APSManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APSManager.swift; sourceTree = "<group>"; };
+		38192E03261B82FA0094D973 /* ReachabilityManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReachabilityManager.swift; sourceTree = "<group>"; };
 		3821ED4B25DD18BA00BC42AD /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
 		3821ED4B25DD18BA00BC42AD /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
 		382C133625F13A1E00715CE1 /* InsulinSensitivities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsulinSensitivities.swift; sourceTree = "<group>"; };
 		382C133625F13A1E00715CE1 /* InsulinSensitivities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsulinSensitivities.swift; sourceTree = "<group>"; };
 		382C134A25F14E3700715CE1 /* BGTargets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BGTargets.swift; sourceTree = "<group>"; };
 		382C134A25F14E3700715CE1 /* BGTargets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BGTargets.swift; sourceTree = "<group>"; };
@@ -554,6 +557,7 @@
 				38887DF225F61F7500944304 /* NightscoutUploadKit.framework in Frameworks */,
 				38887DF225F61F7500944304 /* NightscoutUploadKit.framework in Frameworks */,
 				38887DE825F61F7500944304 /* MockKitUI.framework in Frameworks */,
 				38887DE825F61F7500944304 /* MockKitUI.framework in Frameworks */,
 				3811DE1025C9D37700A708ED /* Swinject in Frameworks */,
 				3811DE1025C9D37700A708ED /* Swinject in Frameworks */,
+				38192E01261B826A0094D973 /* Alamofire in Frameworks */,
 				383948D325CD4D6D00E91849 /* Disk in Frameworks */,
 				383948D325CD4D6D00E91849 /* Disk in Frameworks */,
 				38887DF825F61F7600944304 /* RileyLinkBLEKit.framework in Frameworks */,
 				38887DF825F61F7600944304 /* RileyLinkBLEKit.framework in Frameworks */,
 				38887DEC25F61F7500944304 /* Crypto.framework in Frameworks */,
 				38887DEC25F61F7500944304 /* Crypto.framework in Frameworks */,
@@ -853,6 +857,7 @@
 		3811DE9425C9D88200A708ED /* Network */ = {
 		3811DE9425C9D88200A708ED /* Network */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				38192E03261B82FA0094D973 /* ReachabilityManager.swift */,
 				3811DE9625C9D88300A708ED /* HTTPResponseStatus.swift */,
 				3811DE9625C9D88300A708ED /* HTTPResponseStatus.swift */,
 				3811DE9725C9D88300A708ED /* NightscoutManager.swift */,
 				3811DE9725C9D88300A708ED /* NightscoutManager.swift */,
 				38FE826925CC82DB001FF17A /* NetworkService.swift */,
 				38FE826925CC82DB001FF17A /* NetworkService.swift */,
@@ -1487,6 +1492,7 @@
 				383948D225CD4D6D00E91849 /* Disk */,
 				383948D225CD4D6D00E91849 /* Disk */,
 				38B17B6525DD90E0005CAE3D /* SwiftDate */,
 				38B17B6525DD90E0005CAE3D /* SwiftDate */,
 				3833B46C26012030003021B3 /* Algorithms */,
 				3833B46C26012030003021B3 /* Algorithms */,
+				38192E00261B826A0094D973 /* Alamofire */,
 			);
 			);
 			productName = FreeAPS;
 			productName = FreeAPS;
 			productReference = 388E595825AD948C0019842D /* FreeAPS.app */;
 			productReference = 388E595825AD948C0019842D /* FreeAPS.app */;
@@ -1542,6 +1548,7 @@
 				383948D125CD4D6D00E91849 /* XCRemoteSwiftPackageReference "Disk" */,
 				383948D125CD4D6D00E91849 /* XCRemoteSwiftPackageReference "Disk" */,
 				38B17B6425DD90E0005CAE3D /* XCRemoteSwiftPackageReference "SwiftDate" */,
 				38B17B6425DD90E0005CAE3D /* XCRemoteSwiftPackageReference "SwiftDate" */,
 				3833B46B26012030003021B3 /* XCRemoteSwiftPackageReference "swift-algorithms" */,
 				3833B46B26012030003021B3 /* XCRemoteSwiftPackageReference "swift-algorithms" */,
+				38192DFF261B826A0094D973 /* XCRemoteSwiftPackageReference "Alamofire" */,
 			);
 			);
 			productRefGroup = 388E595925AD948C0019842D /* Products */;
 			productRefGroup = 388E595925AD948C0019842D /* Products */;
 			projectDirPath = "";
 			projectDirPath = "";
@@ -1645,6 +1652,7 @@
 				3811DE7B25C9D6D300A708ED /* LoginProvider.swift in Sources */,
 				3811DE7B25C9D6D300A708ED /* LoginProvider.swift in Sources */,
 				383948D625CD4D8900E91849 /* FileStorage.swift in Sources */,
 				383948D625CD4D8900E91849 /* FileStorage.swift in Sources */,
 				3811DE4125C9D4A100A708ED /* SettingsRootView.swift in Sources */,
 				3811DE4125C9D4A100A708ED /* SettingsRootView.swift in Sources */,
+				38192E04261B82FA0094D973 /* ReachabilityManager.swift in Sources */,
 				388E595C25AD948C0019842D /* FreeAPSApp.swift in Sources */,
 				388E595C25AD948C0019842D /* FreeAPSApp.swift in Sources */,
 				3811DE8925C9D6DD00A708ED /* RequestPermissionsProvider.swift in Sources */,
 				3811DE8925C9D6DD00A708ED /* RequestPermissionsProvider.swift in Sources */,
 				3811DE4225C9D4A100A708ED /* SettingsDataFlow.swift in Sources */,
 				3811DE4225C9D4A100A708ED /* SettingsDataFlow.swift in Sources */,
@@ -2093,6 +2101,14 @@
 				minimumVersion = 2.7.1;
 				minimumVersion = 2.7.1;
 			};
 			};
 		};
 		};
+		38192DFF261B826A0094D973 /* XCRemoteSwiftPackageReference "Alamofire" */ = {
+			isa = XCRemoteSwiftPackageReference;
+			repositoryURL = "https://github.com/Alamofire/Alamofire";
+			requirement = {
+				kind = upToNextMajorVersion;
+				minimumVersion = 5.4.2;
+			};
+		};
 		3833B46B26012030003021B3 /* XCRemoteSwiftPackageReference "swift-algorithms" */ = {
 		3833B46B26012030003021B3 /* XCRemoteSwiftPackageReference "swift-algorithms" */ = {
 			isa = XCRemoteSwiftPackageReference;
 			isa = XCRemoteSwiftPackageReference;
 			repositoryURL = "https://github.com/apple/swift-algorithms";
 			repositoryURL = "https://github.com/apple/swift-algorithms";
@@ -2125,6 +2141,11 @@
 			package = 3811DE0E25C9D37700A708ED /* XCRemoteSwiftPackageReference "Swinject" */;
 			package = 3811DE0E25C9D37700A708ED /* XCRemoteSwiftPackageReference "Swinject" */;
 			productName = Swinject;
 			productName = Swinject;
 		};
 		};
+		38192E00261B826A0094D973 /* Alamofire */ = {
+			isa = XCSwiftPackageProductDependency;
+			package = 38192DFF261B826A0094D973 /* XCRemoteSwiftPackageReference "Alamofire" */;
+			productName = Alamofire;
+		};
 		3833B46C26012030003021B3 /* Algorithms */ = {
 		3833B46C26012030003021B3 /* Algorithms */ = {
 			isa = XCSwiftPackageProductDependency;
 			isa = XCSwiftPackageProductDependency;
 			package = 3833B46B26012030003021B3 /* XCRemoteSwiftPackageReference "swift-algorithms" */;
 			package = 3833B46B26012030003021B3 /* XCRemoteSwiftPackageReference "swift-algorithms" */;

+ 9 - 0
FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -2,6 +2,15 @@
   "object": {
   "object": {
     "pins": [
     "pins": [
       {
       {
+        "package": "Alamofire",
+        "repositoryURL": "https://github.com/Alamofire/Alamofire",
+        "state": {
+          "branch": null,
+          "revision": "4d19ad82f80cc71ff829b941ded114c56f4f604c",
+          "version": "5.4.2"
+        }
+      },
+      {
         "package": "Disk",
         "package": "Disk",
         "repositoryURL": "https://github.com/saoudrizwan/Disk",
         "repositoryURL": "https://github.com/saoudrizwan/Disk",
         "state": {
         "state": {

+ 5 - 0
FreeAPS/Sources/Containers/NetworkContainer.swift

@@ -1,3 +1,4 @@
+import Alamofire
 import Swinject
 import Swinject
 import UIKit
 import UIKit
 
 
@@ -5,6 +6,10 @@ private let resolver = FreeAPSApp.resolver
 
 
 enum NetworkContainer: DependeciesContainer {
 enum NetworkContainer: DependeciesContainer {
     static func register(container: Container) {
     static func register(container: Container) {
+        container.register(ReachabilityManager.self) { _ in
+            NetworkReachabilityManager()!
+        }.inObjectScope(.transient)
+
         container.register(NightscoutManager.self) { _ in BaseNightscoutManager(resolver: resolver) }
         container.register(NightscoutManager.self) { _ in BaseNightscoutManager(resolver: resolver) }
         container.register(AuthorizationManager.self) { _ in BaseAuthorizationManager(resolver: resolver) }
         container.register(AuthorizationManager.self) { _ in BaseAuthorizationManager(resolver: resolver) }
     }
     }

+ 8 - 3
FreeAPS/Sources/Services/Network/NightscoutManager.swift

@@ -23,11 +23,16 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     @Injected() private var announcementsStorage: AnnouncementsStorage!
     @Injected() private var announcementsStorage: AnnouncementsStorage!
     @Injected() private var settingsManager: SettingsManager!
     @Injected() private var settingsManager: SettingsManager!
     @Injected() private var broadcaster: Broadcaster!
     @Injected() private var broadcaster: Broadcaster!
+    @Injected() private var reachabilityManager: ReachabilityManager!
 
 
     private let processQueue = DispatchQueue(label: "BaseNetworkManager.processQueue")
     private let processQueue = DispatchQueue(label: "BaseNetworkManager.processQueue")
 
 
     private var lifetime = Set<AnyCancellable>()
     private var lifetime = Set<AnyCancellable>()
 
 
+    private var isNetworkReachable: Bool {
+        reachabilityManager.isReachable
+    }
+
     private var isUploadEnabled: Bool {
     private var isUploadEnabled: Bool {
         settingsManager.settings.isUploadEnabled ?? false
         settingsManager.settings.isUploadEnabled ?? false
     }
     }
@@ -87,7 +92,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     }
     }
 
 
     func fetchCarbs() -> AnyPublisher<Void, Never> {
     func fetchCarbs() -> AnyPublisher<Void, Never> {
-        guard let nightscout = nightscoutAPI else {
+        guard let nightscout = nightscoutAPI, isNetworkReachable else {
             return Just(()).eraseToAnyPublisher()
             return Just(()).eraseToAnyPublisher()
         }
         }
 
 
@@ -101,7 +106,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     }
     }
 
 
     func fetchTempTargets() -> AnyPublisher<Void, Never> {
     func fetchTempTargets() -> AnyPublisher<Void, Never> {
-        guard let nightscout = nightscoutAPI else {
+        guard let nightscout = nightscoutAPI, isNetworkReachable else {
             return Just(()).eraseToAnyPublisher()
             return Just(()).eraseToAnyPublisher()
         }
         }
 
 
@@ -115,7 +120,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     }
     }
 
 
     func fetchAnnouncements() -> AnyPublisher<Void, Never> {
     func fetchAnnouncements() -> AnyPublisher<Void, Never> {
-        guard let nightscout = nightscoutAPI else {
+        guard let nightscout = nightscoutAPI, isNetworkReachable else {
             return Just(()).eraseToAnyPublisher()
             return Just(()).eraseToAnyPublisher()
         }
         }
 
 

+ 27 - 0
FreeAPS/Sources/Services/Network/ReachabilityManager.swift

@@ -0,0 +1,27 @@
+import Alamofire
+import Foundation
+
+typealias ReachabilityStatus = NetworkReachabilityManager.NetworkReachabilityStatus
+typealias Listener = NetworkReachabilityManager.Listener
+
+protocol ReachabilityManager: AnyObject {
+    var status: ReachabilityStatus { get }
+    var isReachable: Bool { get }
+    func startListening(onQueue: DispatchQueue, onUpdatePerforming: @escaping Listener) -> Bool
+    func stopListening()
+}
+
+extension NetworkReachabilityManager: ReachabilityManager {}
+
+extension ReachabilityStatus: CustomStringConvertible {
+    public var description: String {
+        switch self {
+        case .unknown:
+            return "unknown"
+        case .notReachable:
+            return "NOT reachable"
+        case let .reachable(connectionType):
+            return "reachable by " + (connectionType == .cellular ? "Cellular" : "WiFi")
+        }
+    }
+}