The documentation for isEligibleForAgeFeatures states:
Use this property to determine whether a person using your app is in an applicable region that requires additional age-related obligations for when you distribute apps on the App Store.
But what does "region" mean?
Is this going to return true if the user has downloaded the app from the US App Store? Or will it go further and geolocate the user and identify them as being within a particular relevant state within the US?
General
RSS for tagDelve into the world of built-in app and system services available to developers. Discuss leveraging these services to enhance your app's functionality and user experience.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Created
I am trying to port my sandboxed macOS app completely over to iOS using a Catalyst target and SwiftUI.
There appears to be an issue when trying to drag to the Finder in Catalyst (and in SwiftUI in General). For some reason, the Finder will not accept multiple file drops, only a single file.
On my macOS (non-Catalyst AppKit target), I overcame this by dropping multiple files to a UTType of .folder, and the OS accepted the folder. This workaround is not available for iOS because .folder is a macOS-only option.
I have a test app to illustrate the issue. Hopefully someone can help.
Download Test App
I am trying to port my sandboxed macOS app completely over to iOS using a Catalyst target. In my macOS app, I use 'SwiftySandboxFileAccess' package to add a symlink to '~/Library/PDF Services' so that the 'share to my app' menuItem shows up in the macOS Print Panel (in the PDF menu). It is critical for the function of my app to have this work on macOS.
In the Catalyst target, I am having problems gaining access to '~/Library'. I have tried having the user select the folder, but the picker always returns 'canceled'. I have a test app that illustrates this.
The test app tries to coax the user into selecting the library folder and then it is supposed to bookmark the location, but I am unable to get this far.
As an aside, macOS should probably automatically add an entry to the Print Panel when the app includes PDF as a document type in XCode; it would save a lot of hassle and avoid having to go outside of the sandbox. However, I cannot wait for that. Hopefully someone can help.
Download Test App from iCloud
(If you have problems downloading the file, it might be because of some iCloud share setting that I am not aware of. Just tell me and I'll figure something out.)
Topic:
App & System Services
SubTopic:
General
I'm developing a VoIP app.
Currently, I'm using CallKit to control call acceptance, and end-of-call processing.
When a call comes in while using the phone, CallKit appears as a banner at the top of the screen.
When I click "Accept" on the banner, the app opens and the call is received. (For OEMs, clicking the "Accept" button in the banner will accept the call as is.)
The reason this feature is needed is, for example, when a call comes in as a banner call while using a navigation app, accepting the call causes the navigation app to go to the back and the VoIP app to come to the foreground, causing inconvenience to customers. This needs to be improved.
Please advise.
Hello,
I am developing an internal phone application using CallKit.
I am experiencing an issue with the behavior of remoteHandle settings in iOS 26 and would appreciate any insights you can provide towards a solution.
1. Problem Description
When an iPhone running iOS 26 is in a sleep state and receives a VoIP incoming call where remoteHandle is set to nil or an empty string (@""), we are unable to transition to our application (the UIExtension provided by the provider) from the CallKit UI's "More" (…) button after answering the call.
2. Conditions and Symptoms
OS Version: iOS 26
Initial State: iPhone is in a sleep state
Call Type: An unsolicited(unknown number) VoIP incoming call where the CXCallUpdate's remoteHandle is set to either nil or [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:@""]
Symptoms: After answering the VoIP call by sliding the button, selecting the "More" (…) button displayed on the CallKit screen does not launch our application's UIExtension (custom UI), and the iPhone instead stay to the CallKit screen.
3. Previous Behavior (Up to iOS 18)
Up to iOS 18, even when remoteHandle was set to an empty string using the following code, the application would transition normally from "More" after answering an incoming call from a sleep state.
CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:@""];
[provider reportNewIncomingCallWithUUID:uuid update:update completion:completion];
4. Unsuccessful Attempts to Resolve
The issue remained unresolved after changing the handling for unsolicited(unknown number) incoming calls as follows:
CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.remoteHandle = nil; // Set remoteHandle to nil
[provider reportNewIncomingCallWithUUID:uuid update:update completion:completion];
5. Workaround (Temporary)
The problem can be resolved, and the application can transition successfully, by setting a dummy numerical value (e.g., "0") for the value in remoteHandle using the following code:
CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:@"0"]; // Set a dummy numerical value
[provider reportNewIncomingCallWithUUID:uuid update:update completion:completion];
6. Additional Information
If remoteHandle is correctly set with the caller's number (i.e., not an unsolicited(unknown number) call; e.g., value:@"1234567890"), the application transitions normally from the "More" button after answering an incoming call from a sleep state, even in iOS 26.
The above issue does not occur when answering incoming calls while the iPhone is in an active state (not sleeping).
7. Questions
Have there been any other reports of similar behavior?
Should this be considered a bug in CallKit for iOS 26? Should I make file a new Feedback report?
Is there a suitable method to resolve this issue when the caller ID is unsolicited (nil or an empty string)?
This problem significantly impacts user operations as end-users are unable to perform essential in-app actions such as hold or transfer after answering an unsolicited(unknown number) call from a sleep state. We are eager to find an urgent solution and would appreciate any information or advice you can provide.
Thank you for your assistance.
AgeRangeService is the burning topic right now. Needless to say, Everything is so unclear.
We got our app finally into the TestFlight for QA and the product to test. only to find out that AgeAssurance for sandbox testing does not work.
There is no document confirming or denying whether and when age assurance for the App with the release configuration in test flight would work.
There isn't any guidance from Apple on whether an app that sells physical goods, such as an e-commerce app, can continue doing business as usual.
Also, there is no clarity that the Age assurance options are off, 13, unverified, 13 verified, and so on.
How those should be used.
When updating an existing advanced app clip experience, the change doesn't actually apply. It shows the correct image in the UI, but when you use the app clip it shows the old image. Looking into it more, the status has "UPDATE_SUBMITTED". Seems related to this issue (https://developer.apple.com/forums/thread/810544) and this issue (https://developer.apple.com/forums/thread/810351).
We recently released an update to our app to prepare for TX SB2420.
Almost immediately on release, we started getting crash reports of crashes when calling isEligibleForAgeFeatures.
Crashed: com.apple.root.user-initiated-qos.cooperative
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000004
Is it possible that these are beta users that have IOS 26.2 RC or is there a bug in the release version of IOS 26.2?
Note: The crash reports are coming from Crashlytics so we are not getting OS build identifiers other than version "26.2"
I'm reading the "Testing Age Assurance in Sandbox" doc, but I couldn't figure out the step:
2. Tap Sandbox Testing from the main menu
Where is the "main menu"?
While preparing my app for Declared Age Range capability usage, I've noticed a weird behaviour: the same code works for iOS, but not for macOS.
My project uses same target for both platforms, so the capability is enabled for both platforms. The business logic layer is also shared across between platforms. Both UI layers are writter in SwiftUI.
The iCloud account used for testing on iOS and macOS devices is the same, so even the consent is shared across both devices.
While requestAgeRange(ageGates:) seems to work just fine for iOS app, for macOS app it always throws Not available error (DeclaredAgeRange.AgeRangeService.Error.notAvailable)
Am I missing something? Could the API be somehow unavailable for macOS? Should I use AgeRangeService.shared.requestAgeRange(ageGates:in:) for macOS instead of SwiftUI's @Environment-based approach?
Also, after giving permission, is there a way to actually revoke it? In Age Range for Apps menu I can only view the list of apps that have my consent to share my age range, but not the ability to revoke it.
Hello,
Recently we got a question about the keyboard sensor data collection in our research project:
"For the typing statistics, was any typing included or only messaging and notes? E.g., typing in the browser, phone search, calendar, etc?"
While I believe it should be any typing included, I was not able to find a document explicitly stating that. Could you help to confirm it or guide me to any documentation explaining it?
Thanks!
I'm encountering a strange behavior with one of my home's on Home app while I'm off network. When I launch the app it indicates that the hub is not responding and all of my devices are unavailable.
However, on the menu bar at the bottom if I switch to "Automation" and back to "Home" the pop-up goes away and my devices are accessible again (sometimes this take a few attempts). Siri is also able to consistently control my devices without an issue.
The same behavior occurs with Home app on other devices (e.g. Mac) and with other members that have access to the household. 3rd party HomeKit app like "Controller" does not have an issue.
This issue began with iOS 26 and I haven't had much luck resolving the issue. I already tried rebooting everything, including removing and re-adding an Apple TV (home hub). I have other homes shared with me in Home App with similar network/environment that are still working. The home I'm having issues has the most number of devices though (over 100+).
Hey Im currently trying to use the weatherkit API and Im seeing the following returned:
{"reason": "OVER_QUOTA"}
Im using the correct service, key and bundle ID.
Ive generated a private key too.
The universal links for my apps stopped working.
The server where the AASA files where hosted worked on IPV4 exclusively, a few days ago i changed the configuration to IPV6 only. I´ve created new IPV6 entries, renewed all certifactes and deleted all IPV4 entries for the domains.
All seemed fine, but at Saturday I realized that my universal links stopped working for new user.
What i´ve done to find the issue:
Example domain that was used for debugging: "https://developffw.burns.fun"
I´ve verified the AASA file is hosted properly by using different browsers and Postman to retrieve it. The file can be accessed and the certificates look fine.
Output of curl -v https://developffw.burns.fun/.well-known/apple-app-site-association
* Host developffw.burns.fun:443 was resolved.
* IPv6: 2a01:4f8:13b:340a::2
* IPv4: (none)
* Trying [2a01:4f8:13b:340a::2]:443...
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* Established connection to developffw.burns.fun (2a01:4f8:13b:340a::2 port 443) from 2a00:79c0:65c:8b00:80ee:175b:3e2a:1e7d port 61014
* using HTTP/1.x
> GET /.well-known/apple-app-site-association HTTP/1.1
> Host: developffw.burns.fun
> User-Agent: curl/8.16.0
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Server: nginx/1.22.1
< Date: Mon, 15 Dec 2025 11:34:22 GMT
< Content-Type: application/octet-stream
< Content-Length: 329
< Last-Modified: Sat, 21 Dec 2024 08:53:11 GMT
< Connection: keep-alive
< ETag: "676681f7-149"
< Accept-Ranges: bytes
<
{
"applinks": {
"details": [
{
"appIDs": [ "6LN7G8JEA5.burns.FFW-Manager-SwiftUI.Debug"],
"components": [
{
"/": "/onboard",
"?": { "id": "*"},
"?": { "name": "*"},
"?": { "token": "*" }
}
]
}
]
}
}
* Connection #0 to host developffw.burns.fun:443 left intact
I took a look at the headers from the Apple CDN network response. These indicate some sort of connection error.
The response code is 404
Response headers:
Apple-Failure-Details: {"cause":"dial tcp [2a01:4f8:13b:340a::2]:443: connect: network is unreachable"}
Apple-Failure-Reason: SWCERR00305 Network error
Apple-From: https://betaffw.burns.fun/.well-known/apple-app-site-association
Apple-Try-Direct: false
Via: https/1.1 defra2-vp-vst-003.ts.apple.com (acdn/268.16305), https/1.1 defra2-vp-vfe-004.ts.apple.com (acdn/268.16305), http/1.1 defra2-xdc-mx-028.ts.apple.com (acdn/3.16363), https/1.1 defra1-edge-fx-021.ts.apple.com (acdn/3.16363)
X-Cache: hit-stale, miss, hit-fresh, miss
CDNUUID: 4321f35e-b73b-4031-a054-7c63af69e126-712221049
Took a look at the log files of the server.
I can´t find any entry from the Apple servers neither in the default logs nor in the error log entries.
The curl attempts are logged with response code 200.
I´ve tried sudo swcutil dl -d https://developffw.burns.fun/onboard in the Terminal on my MAC.
Output:
The operation couldn´t be completed. (SWCErrorDomain error 8.)
This indicates to me threre is an issue for the Apple servers accessing my server. But I don´t know what could be the reason. There is no firewall configuration that could block the requests. And there has been no change at all besides the IPV4 / IPV6 protocol change.
This issue is the same for all the domain listed on this server.
I´v even created a new app for this purpose and created a new AASA entry and associated link. Same issue.
I´m pretty much lost here. Everything looks fine from my side. Google assetlinks.json seem to work fine.
I would really appreciate some help on how to solve this, i´m at my wits end.
From the document https://developer.apple.com/documentation/sensorkit/srfetchrequest we know that "SensorKit places a 24-hour holding period on newly recorded data before an app can access it. This gives the user an opportunity to delete any data they don’t want to share with the app. A fetch request doesn’t return any results if its time range overlaps this holding period."
Will this holding period reset each time when I called startRecording() ?
Let's say I upgrade my app to a new version, do I need to call startRecording again to init the data collection process? will it be able to query the data collected from previous version's app ?
I am using the WeatherKit REST API with hourlyStart/hourlyEnd parameters
to request up to 240 hours of forecast data.
However, when requesting later in the day, the API returns fewer than
240 hourly forecasts — e.g., 239 at 08:00, 238 at 09:00, etc. and goes up to 224 for 23:00
It appears the returned list is contiguous but truncated at the end
compared to the full 240-hour window. I have also tried getting the data after sometime, like 09:00 data at 09:45 but still was missing the same data at the end.
Is this expected WeatherKit behavior or a bug? If it’s expected, is
there documentation explaining how the “forecast horizon” is determined
and when it is updated?
Thank you.
I am facing a severe audio routing instability issue when using CallKit and the Zego Express SDK on iOS. The problem is that the audio route immediately reverts from the Speaker back to the Earpiece, effectively disabling the Speaker button functionality.📝 Observed BehaviorWhen the user taps the native CallKit Speaker Button, the audio route is correctly changed to the Speaker, but then instantly flips back to the Receiver (Earpiece), as shown in the system log captured via AVAudioSession.routeChangeNotification monitoring.🧾 Log Evidence (Flapping Occurs in 0.4 seconds)The following log snippet clearly illustrates the system overriding the user's action (reason: 4) with an unexpected CategoryChange (reason: 3) event:
TimestampComponentReason CodeDescriptionRouteIs
Speaker16:31:18.009[CallKitManager]4Override (CallKit/ControlCenter)Loa ngoài
(Speaker)true16:31:18.411[CallKitManager]3CategoryChangeThiết bị nhận (Receiver)false
Hello
I'm using this sdk DeclaredAgeRange to get the user age range
When I'm doing in debug mode using sandbox account it is working as expected and I can get the user age range
But when I tried in TestFlight build using sandbox account it is not working and it is always return the age range 18+ and also isEligibleForAgeFeatures API is always returning false
Any advise on this?
Hello,
After being in the AppStore for more than a year with the app working perfectly, yesterday I started seeing that WeatherKit requests failed with
Failed to generate jwt token for: com.apple.weatherkit.authservice with error: Error Domain=WeatherDaemon.WDSJWTAuthenticatorServiceListener.Errors Code=2 "(null)"
Encountered an error when fetching weather data subset; location=<+41.40217108,+2.20023642> +/- 0.00m (speed -1.00 mps / course -1.00) @ 13/12/25, 12:20:35 Central European Standard Time, error=WeatherDaemon.WDSJWTAuthenticatorServiceListener.Errors 2 Error Domain=WeatherDaemon.WDSJWTAuthenticatorServiceListener.Errors Code=2 "(null)"
I checked on developer.apple.com and we still have everything turned on and
No changes were made from an already deployed app; and we pay 200$ a month for WeatherKit, this is unacceptable since it's not the first time WeatherKit randomly decides to stop working.
More fun facts: the widget works fine...
For other permission prompts in the iOS ecosystem, we have the option to configure the text shown in the prompt via keys in the Info.plist. This does not appear to be the case with regards to the age range permission prompt. The text of the prompt implies the app includes a differentiated experience for child or teen content and that confirming age unlocks more features (making it seem optional for using the app).
Is there a plan for app developers to be able to update that permission prompt similarly to how we can configure others?
If so, is there any timeline we can expect that on?