Hi folks!
Please help me to clarify some things related to Screen Time API.
What the keys differences between individual and child authorization? With individual type of auth user can do sign-out from iCloud and delete the app. What else differentiate this type of users?
Can we use DeviceActivityEvent for remote control with individual auth?
Can the parental or guardian see/get the statistic of apps usage?
Is the individual auth available to all users or just those who are in the Apple's family?
I'll really appreciate any help and answer! Thank you in advance!
Post
Replies
Boosts
Views
Activity
Hi all!
I'm thankful to Kmart for his answers related to Screen Time API features iOS 15 / iOS 16. That really helpful!
Please, help me to clarify a few more things...
As I read here in the comment ManagedSettings has two type of restrictions, shielding and blocking. Is blocking type of restriction available for users with individual type of auth?
If the answer on the first question is "No", does that mean that individual user will be able just to skip the shielding screen and continue to use apps?
If individual user can skip shielding, will it be allowed to do it with a passcode or without, if the passcode wasn't set for Screen Time in the phone settings?
I'll really appreciate any help and answer! Thank you in advance!
Hi there!
Please help me coupe with next issue...
The project was building and archived without any issue. When I added Family Control capability, I started receiving this issue:
I set up all certificates, created provisions. Tried to do it automatically through Xcode, did it manually, created .certSigningRequest, changed Xcode to 13 version (I'm using 14) - nothing helped me.
Please share your thoughts what can be wrong?
I'm not owner of Apple's dev account. I have Admin access rights.
Do I need something else?
Is Apple requires additional permissions or some requests to use Family Control capability?
Thank you in advance!
missing com.apple.developer.family-controls / Missing Family Controls from provisioning profile
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?
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 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?
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?
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?
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
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 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>?
Hi all!
Is it possible to retrieve detailed data of applications from opaque token which we receive from FamilyActivityPicker?
If no, is it possible retrieve application info especially icon from applications that were selected in FamilyActivityPicker?
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!
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?