From a0b8294e7a85376b51e19c9d9317b0d45d1c24c4 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Fri, 1 Nov 2024 13:00:17 -0400 Subject: [PATCH 1/4] fix isLowerPowerModeEnabled deadlock crash --- .../providers/LowPowerStateProvider.swift | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift b/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift index 1b4f10fbe..959df91a0 100644 --- a/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift +++ b/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift @@ -9,11 +9,31 @@ import Foundation import UIKit final class LowPowerStateProvider { - private let processInfo = ProcessInfo.processInfo + private let isLowerPowerModeEnabled = Atomic(ProcessInfo.processInfo.isLowPowerModeEnabled) + + init() { + NotificationCenter + .default + .addObserver( + self, + selector: #selector(powerStateDidChange(_:)), + name: Notification.Name.NSProcessInfoPowerStateDidChange, + object: nil + ) + } + + @objc + private func powerStateDidChange(_ userInfo: Any) { + self.isLowerPowerModeEnabled.update { $0 = ProcessInfo.processInfo.isLowPowerModeEnabled } + } + + deinit { + NotificationCenter.default.removeObserver(self) + } } extension LowPowerStateProvider: ResourceSnapshotProvider { func makeSnapshot() -> ResourceSnapshot? { - return LowPowerStateSnapshot(lowPowerModeEnabled: self.processInfo.isLowPowerModeEnabled) + return LowPowerStateSnapshot(lowPowerModeEnabled: self.isLowerPowerModeEnabled.load()) } } From 41e5fb4388c697aa28e27e5ce4f2de35ab9e47c9 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Fri, 1 Nov 2024 14:21:35 -0400 Subject: [PATCH 2/4] add doc string --- .../events/resource/providers/LowPowerStateProvider.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift b/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift index 959df91a0..c16b0f499 100644 --- a/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift +++ b/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift @@ -12,6 +12,11 @@ final class LowPowerStateProvider { private let isLowerPowerModeEnabled = Atomic(ProcessInfo.processInfo.isLowPowerModeEnabled) init() { + // Accessing `ProcessInfo.processInfo.isLowPowerModeEnabled` frequently causes occasional crashes + // on iOS 15 (up to at least version 15.2). To reduce these calls, subscribe to + // `NSProcessInfoPowerStateDidChange` notifications and track the state of `isLowPowerModeEnabled` + // locally. This minimizes the need to call `ProcessInfo.processInfo.isLowPowerModeEnabled` here + // more than once. NotificationCenter .default .addObserver( From fd2530b62350631459b7ab6e91227c5691f71391 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Fri, 1 Nov 2024 14:49:13 -0400 Subject: [PATCH 3/4] fix doc string --- .../events/resource/providers/LowPowerStateProvider.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift b/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift index c16b0f499..1c8cc4e52 100644 --- a/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift +++ b/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift @@ -15,8 +15,8 @@ final class LowPowerStateProvider { // Accessing `ProcessInfo.processInfo.isLowPowerModeEnabled` frequently causes occasional crashes // on iOS 15 (up to at least version 15.2). To reduce these calls, subscribe to // `NSProcessInfoPowerStateDidChange` notifications and track the state of `isLowPowerModeEnabled` - // locally. This minimizes the need to call `ProcessInfo.processInfo.isLowPowerModeEnabled` here - // more than once. + // locally. This minimizes the number of `ProcessInfo.processInfo.isLowPowerModeEnabled` calls here + // to one. NotificationCenter .default .addObserver( From c5af6233b76ed7fcf4818c1104463ecea855f2d7 Mon Sep 17 00:00:00 2001 From: Rafal Augustyniak Date: Fri, 1 Nov 2024 14:54:00 -0400 Subject: [PATCH 4/4] fix format --- .../events/resource/providers/LowPowerStateProvider.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift b/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift index 1c8cc4e52..a52ecf442 100644 --- a/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift +++ b/platform/swift/source/default/events/resource/providers/LowPowerStateProvider.swift @@ -14,7 +14,7 @@ final class LowPowerStateProvider { init() { // Accessing `ProcessInfo.processInfo.isLowPowerModeEnabled` frequently causes occasional crashes // on iOS 15 (up to at least version 15.2). To reduce these calls, subscribe to - // `NSProcessInfoPowerStateDidChange` notifications and track the state of `isLowPowerModeEnabled` + // `NSProcessInfoPowerStateDidChange` notifications and track the state of `isLowPowerModeEnabled` // locally. This minimizes the number of `ProcessInfo.processInfo.isLowPowerModeEnabled` calls here // to one. NotificationCenter