You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:07:17