DeviceActivityCenter startMonitoring периодически зависает в iOS 18IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 DeviceActivityCenter startMonitoring периодически зависает в iOS 18

Сообщение Anonymous »

Я столкнулся с проблемой в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • IOS DeviceActivityCenter — несколько расписаний и действий одновременно
    Anonymous » » в форуме IOS
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Когда я подключаюсь к удаленному серверу, scp зависает, команда экрана зависает, htop зависает [закрыто]
    Гость » » в форуме Linux
    0 Ответы
    158 Просмотры
    Последнее сообщение Гость
  • Клавиатура (TextField) в приложении SwiftUI для iOS зависает/зависает, почему?
    Anonymous » » в форуме IOS
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Клавиатура (TextField) в приложении SwiftUI для iOS зависает/зависает, почему?
    Anonymous » » в форуме IOS
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Xcopy зависает/зависает
    Anonymous » » в форуме C#
    0 Ответы
    89 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»