Я столкнулся с проблемой в DeviceActivityCenter, из-за которой мое приложение иногда зависает на следующих строках:
center.stopMonitoring()
center.startMonitoring(.locked, during: defaultSchedule, events: events)
center.startMonitoring(.unlocked, during: schedule, events: events)
Это поведение происходит непоследовательно, примерно в 50 % случаев, и приводит к задержке перед запуском мониторинга. В конце концов код выполняется, но может зависнуть на несколько секунд. Эта проблема является новой для iOS 18 — она никогда не возникала в iOS 17.
Она периодически зависает при вызовах stopMonitoring() и startMonitoring(). Я добавил операторы print(), чтобы подтвердить, что именно здесь происходит задержка.
Кто-нибудь еще сталкивался с этим в iOS 18? Будем признательны за любые идеи и предложения!
Дополнительная информация:
Проблема началась после обновления до iOS 18.
Происходит примерно в 50% случаев. время без четкой закономерности.
В этой части кода между iOS 17 и iOS 18 не было внесено никаких изменений.
Эта задержка может длиться до минуты, прежде чем она продолжится.
Вот мой код:
import DeviceActivity
import SwiftUI
extension DeviceActivityName {
static let locked = Self("locked")
static let unlocked = Self("unlocked")
}
extension DeviceActivityEvent.Name {
static let locked = Self("locked")
static let unlocked = Self("unlocked")
}
class MySchedule {
static let shared = MySchedule()
let center = DeviceActivityCenter()
@AppStorage("unlockedStartDate", store: UserDefaults(suiteName: "group.com.app.appname")) private var unlockedStartDateData: Data?
var unlockedStartDate: Date? {
get {
if let data = unlockedStartDateData {
let decoder = JSONDecoder()
if let decodedDate = try? decoder.decode(Date.self, from: data) {
return decodedDate
}
}
return nil
}
set {
if let newDate = newValue {
let encoder = JSONEncoder()
if let encodedData = try? encoder.encode(newDate) {
unlockedStartDateData = encodedData
} else {
unlockedStartDateData = nil
}
} else {
unlockedStartDateData = nil
}
}
}
@AppStorage("unlockedEndDate", store: UserDefaults(suiteName: "group.com.app.appname")) private var unlockedEndDateData: Data?
var unlockedEndDate: Date? {
get {
if let data = unlockedEndDateData {
let decoder = JSONDecoder()
if let decodedDate = try? decoder.decode(Date.self, from: data) {
return decodedDate
}
}
return nil
}
set {
if let newDate = newValue {
let encoder = JSONEncoder()
if let encodedData = try? encoder.encode(newDate) {
unlockedEndDateData = encodedData
} else {
unlockedEndDateData = nil
}
} else {
unlockedEndDateData = nil
}
}
}
// Save schedule start and end times
public func setSchedule(timeLimitMinutes: Int = 0) {
print("center.stopMonitoring().start")
center.stopMonitoring([.locked, .unlocked])
print("center.stopMonitoring().complete")
if timeLimitMinutes == 0 {
// Schedule to block apps (locked state)
let startTime = DateComponents(hour: 0, minute: 0)
let endTime = DateComponents(hour: 23, minute: 59)
let defaultSchedule = DeviceActivitySchedule(
intervalStart: startTime,
intervalEnd: endTime,
repeats: true
)
unlockedStartDate = nil
unlockedEndDate = nil
let events: [DeviceActivityEvent.Name: DeviceActivityEvent] = [
.locked: DeviceActivityEvent(
applications: MyModel.shared.selectionToDiscourage.applicationTokens,
categories: MyModel.shared.selectionToDiscourage.categoryTokens,
webDomains: MyModel.shared.selectionToDiscourage.webDomainTokens,
threshold: DateComponents(minute: timeLimitMinutes)
)
]
do {
print("center.startMonitoring(.locked).start")
try center.startMonitoring(.locked, during: defaultSchedule, events: events)
print("center.startMonitoring(.locked).complete")
} catch {
print("Error starting locked schedule: \(error.localizedDescription)")
}
} else {
// Schedule to unlock apps (unlocked state)
let schedule = getUnlockedSchedule(forMinutes: timeLimitMinutes)
let events: [DeviceActivityEvent.Name: DeviceActivityEvent] = [
.unlocked: DeviceActivityEvent(threshold: DateComponents(minute: timeLimitMinutes))
]
do {
print("center.startMonitoring(.unlocked).start")
try center.startMonitoring(.unlocked, during: schedule, events: events)
print("center.startMonitoring(.unlocked).complete")
} catch {
print("Error starting unlocked schedule: \(error.localizedDescription)")
}
}
}
// Create a schedule based on the current time and specified minutes
func getUnlockedSchedule(forMinutes minutes: Int) -> DeviceActivitySchedule {
let calendar = Calendar.current
let currentDate = Date()
// Start is now
let startComponents = calendar.dateComponents([.hour, .minute, .second], from: currentDate)
// End is 'minutes' from now
let intervalEnd = calendar.date(byAdding: .minute, value: minutes, to: currentDate)!
let endComponents = calendar.dateComponents([.hour, .minute, .second], from: intervalEnd)
unlockedStartDate = currentDate
unlockedEndDate = intervalEnd
return DeviceActivitySchedule(
intervalStart: startComponents,
intervalEnd: endComponents,
repeats: false
)
}
// Check if the current time is within the schedule
func isScheduleUnlocked() -> Bool {
let now = Date()
guard let intervalStartDate = unlockedStartDate, let intervalEndDate = unlockedEndDate else { return false }
return now >= intervalStartDate && now
Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-ios-18
DeviceActivityCenter startMonitoring периодически зависает в iOS 18 ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Клавиатура (TextField) в приложении SwiftUI для iOS зависает/зависает, почему?
Anonymous » » в форуме IOS - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Клавиатура (TextField) в приложении SwiftUI для iOS зависает/зависает, почему?
Anonymous » » в форуме IOS - 0 Ответы
- 36 Просмотры
-
Последнее сообщение Anonymous
-