I successfully setup schedule and they works. But I recognised that, when I didn’t send the app to background e.g. the app still on the screen, in that case the events from Device Activity Monitor invokes.
They invokes correctly by schedule, BUT, they invokes before I accumulated needed threshold time. I run schedules not in the past, but in future. So the issue why thresholds events invokes not that one when you start your schedules with threshold in the past.
I have 2 events: events1 and event2.
It seems that iOS think that my app in both of the groups which my events are monitoring. Firstly fires events1 (like my app in this group), then fires events2 (again like my app in this group as well).
But if I go to home screen, the events works correctly few times, but then also started invoking in wrong order. Where could be the problem?
Post
Replies
Boosts
Views
Activity
I want to deny deleting of my app. In the doc says that we can use:
var denyAppRemoval: Bool? { get set }
But it's doesn’t work. Example of applying:
store.application.denyAppRemoval = true
What I'm doing wrong?
Should it work for .individual type of Family Control auth?
I'd like to implement prevent of deleting the app. In app I use Screen Time API with .individual type of authorisation.
I know it possible do manually in iPhone's Settings:
Settings > Screen Time > Content & Privacy Restrictions > iTunes & App Store Purchases > Deleting Apps
and then choose Don’t Allow option.
I've seen this implementation in other apps has been done programmatically.
How I can do the same?
Hi!
Thank you to Kmart who gave me the answer on my question regarding issue when eventDidReachThreshold triggers immediately! But, I still have a few questions, so I’m posting the new post.
Could you please give answers for the next questions:
How I can avoid the behaviour when system could interpreting schedules as an ongoing or "active"? I noticed that when I manually change the Date for the next day, eventDidReachThreshold doesn’t invoke.
Are schedules incapsulate accumulated threshold time or the threshold time is shared between schedules?
Why eventDidReachThreshold invokes even in case for the past day I didn’t open apps to accumulate threshold time? When I check spent time in iPhone settings, the Screen Time show that I spent 0 minutes for the apps which were selected for accumulating threshold time.
Is it correct that the last schedule that was starting has more priority than the previous one?
Can we manually set priority for starting schedules?
The eventDidReachThreshold calls immediately not waiting for accumulated time.
Example of setting the event:
let events: [DeviceActivityEvent.Name: DeviceActivityEvent] = [
.monitorEducation: DeviceActivityEvent(
applications: educationalApps.applicationTokens,
threshold: DateComponents(minute: 15)
)
]
What could be wrong?
I'm wondering if we able to send Local Push Notifications from DeviceActivityMonitor extension...
If we have to use AppGroups to pass info between an app and the extension, could we post notification though UNNotificationRequest?
I also tried to push data through NotificationCenter, also doesn’t work. Can we do so, or did something wrong?
Should these cases that I described above work from iOS 16 and above or not?
Thank you!
I want to remove shield restrictions for apps. Following the WWDC21 video, I declare ManagedSettingsStore and trying to reset restrictions:
class MyDeviceActivityMonitor: DeviceActivityMonitor {
let store = ManagedSettingsStore()
public override func intervalDidEnd(for activity: DeviceActivityName) {
super.intervalDidEnd(for: activity)
store.shield.applications = nil
}
}
Will this string has impact on the app store.shield.applications = nil? Because now, while testing it seems that I'm dealing with two different stores.
Or again it is doesn’t synced by default and let store = ManagedSettingsStore() will create store which will be different than store on which the app is relays on?
Thank you!
How to block/shield Safari?
If not possible what I can do instead?
It will be great to have smth like this:
store.shield.webDomains = .all
To shield all app except a few, I did the next:
store.shield.applicationCategories = .all(except: exceptions)
After code above I can see that apps were successfully shielded.
Then I need to receive all app's tokens that were shielded on the previous step. To achieve that I do the next:
let applicationTokens = store.shield.applications
But always receive nil!
What should I do to get set of shielded apps which were blocked by applicationCategories?
I'm working witn FamilyActivitySelection
How to get bundleIdentifier from ApplicationToken? which I receive from FamilyActivitySelection?
I want to read AppIcon, AppName from bundleIdentifier
Also tried to read bundleIdentifier from Application?, but the value always returns as nil.
I have next flow:
User selects apps to discourage
Then user selects apps with permanent access. To do this, the app blocks all apps, and then user selects which apps should be unblocked back.
I've created two ManagedSettingsStores. At the step 1, I put apps in store 1, at the step 2 I put apps in store 2.
To block all apps at step 2 I do:
store.shield.applicationCategories = .all()
After that I'm expecting that store.shield.applications will contain all apps that user has blocked at the step 2. I want to filter blocked apps on step 1 and step 2.
But it doesn’t happen. Instead I see just one general token for all blocked apps.
How I can receive Set<ApplicationToken> from ShieldSettings.ActivityCategoryPolicy<Application>?
I did a lot of researches, but cannot understand why methods inside DeviceActivityMonitor extension are not calling.
What I've seen related to this question and already checked:
Do you starting monitoring for schedules?
Yes, I do by calling center.startMonitoring() as it has been explained on WWDC2021-10123.
I was searching an issue while creating the extension. Walk through steps that are described here.
Everything looks good for me.
Did you add Family Control Capability to extension's target?
Yes, I did.
Is your device authorized with FamilyControls?
Yes. The only doubt I have here that I'm authorising FamilyControls for .individual . But as I've asked previously, it shouldn’t be a reason.
Task {
do {
guard #available(iOS 16.0, *) else {
// Fallback on earlier versions
return
}
try await AuthorizationCenter.shared.requestAuthorization(for: .individual)
switch AuthorizationCenter.shared.authorizationStatus {
case .notDetermined:
print("not determined")
case .denied:
print("denied")
case .approved:
print("approved")
@unknown default:
break
}
} catch {
print("Error for Family Controls: (error)", error.localizedDescription)
}
}
--
So, what could I have missed?
Also, should I see bundles of app and extension in Xcode -> Debug -> Attach to Process -> ... or I have to add them to see logs in Console app?
I'm following the video with explanation of how to dealing with DeviceActivityMonitor extension.
I'm facing the issue with empty ManagedSettingsStore when I'm trying to retrieve discouraged apps. The apps successfully where blocked on the selection step via .familyActivityPicker.
The problem is that I can’t retrieve discouraged apps.
I read that Model.shared won’t work in extension. To sync an app and extension we need to use AppGroups. Do we need to use AppGroups if we follow code like in the video?
Is it possible from Parent device to call FamilyActivityPicker for choosing discourage/encourage apps and setup ManagedSettingsStore on Child's device with .individual auth of type?
How I can decode ApplicationToken which I receive from FamilyActivitySelection?
I've been expecting String type or ability to extract String from ApplicationToken.
My goal is switching between user's modes, where one device could be used for Parent and Child. For this case I'd like to keep ManagedSettingsStore() setups for each user.