FamilyControls与DeviceActivity中DeviceActivityMonitorExtension事件未触发
FamilyControls与DeviceActivity锁定功能问题:DeviceActivityMonitorExtension事件不触发
我正在开发一项功能,允许用户通过FamilyControls和DeviceActivity锁定指定应用。应用锁定后,用户可将其解锁15分钟,超时后自动重新锁定。
目前遇到的问题是:锁定应用后,DeviceActivityMonitorExtension中的事件(如intervalDidStart和intervalDidEnd)无法触发,导致应用始终处于锁定状态。
相关代码如下:
import DeviceActivity import FamilyControls import ManagedSettings import SwiftUI struct ContentView: View { @State private var isDiscouragedPresented: Bool = false @EnvironmentObject var model: MyModel @EnvironmentObject var store: ManagedSettingsStore @State private var isLocked: Bool = false var body: some View { ZStack { Colors.background1.ignoresSafeArea() GeometryReader { geometry in let size = min(geometry.size.width, geometry.size.height) * 0.9 VStack (alignment: .center) { Spacer() HStack { Spacer() Button(action: { if isLocked { // unlock app for a 15 minute period try? DeviceActivityCenter().startMonitoring( .activity, during: getCurrentTimeActivitySchedule(forMinutes: 15)) } else { // Lock the apps indefinitely MySchedule.setSchedule() } isLocked.toggle() }) { VStack { Image(systemName: isLocked ? "lock.fill" : "lock.open.fill") .resizable() .scaledToFit() .frame(height: size * 0.3) .padding(.bottom, 10) Text(isLocked ? "Unlock for 15 Minutes" : "Lock Apps") } .foregroundColor(Colors.text3) .frame(width: size, height: size) .background(.ultraThinMaterial) .cornerRadius(size/20) .font(.title2) .shadow(radius: 10) } Spacer() } Spacer().frame(height: 20) HStack { Spacer() Button(action: { isDiscouragedPresented.toggle() }) { VStack { Text(isLocked ? "Re-select Apps to Lock" : "Select Apps to Lock") } .foregroundColor(Colors.text3) .frame(width: size, height: size/4) .background(.ultraThinMaterial) .cornerRadius(size/20) .font(.title2) .shadow(radius: 10) } .familyActivityPicker(isPresented: $isDiscouragedPresented, selection: $model.selectionToDiscourage) Spacer() } Spacer() } } } .onAppear { isLocked = model.selectionToDiscourage.applications.isEmpty == false } .onChange(of: model.selectionToDiscourage) { _ in MyModel.shared.setShieldRestrictions(store: store) isLocked = model.selectionToDiscourage.applications.isEmpty == false } .edgesIgnoringSafeArea(.all) } func getCurrentTimeActivitySchedule(forMinutes minutes: Int) -> DeviceActivitySchedule { let calendar = Calendar.current let currentDate = Date() let currentHour = calendar.component(.hour, from: currentDate) let currentMinute = calendar.component(.minute, from: currentDate) var subZero = currentMinute<10 ? "0" : "" print("currentTime - \(currentHour>12 ? currentHour-12 : currentHour):\(subZero)\(currentMinute)") if let intervalEnd = calendar.date(byAdding: .minute, value: minutes, to: currentDate) { let endHour = calendar.component(.hour, from: intervalEnd) let endMinute = calendar.component(.minute, from: intervalEnd) subZero = endMinute<10 ? "0" : "" print("intervalEndTime - \(endHour>12 ? endHour-12 : endHour):\(subZero)\(endMinute)") return DeviceActivitySchedule( intervalStart: DateComponents(hour: currentHour, minute: currentMinute), intervalEnd: DateComponents(hour: endHour, minute: endMinute), repeats: false, warningTime: DateComponents(minute: minutes-1) ) } else { fatalError("Failed to calculate the end interval") } } } class DeviceActivityMonitorExtension: DeviceActivityMonitor { override func intervalDidStart(for activity: DeviceActivityName) { print("intervalDidStart") super.intervalDidStart(for: activity) let store = ManagedSettingsStore() store.clearAllSettings() } override func intervalDidEnd(for activity: DeviceActivityName) { print("intervalDidEnd") super.intervalDidEnd(for: activity) let store = ManagedSettingsStore() // [Removed for brevity] } }
补充说明:运行应用时出现错误提示:
Plist键表明当前进程是一个扩展,但未调用NSExtensionMain()。UIKit会将此进程视为扩展。
请问是否有人遇到过类似的DeviceActivityMonitorExtension事件不触发的问题?希望能得到帮助或建议。
内容的提问来源于stack exchange,提问作者helloworld12345
相关产品推荐
相关产品推荐

