Hi everyone,
I’ve filed a Feedback report (FB20986470) for a serious issue affecting the Call Directory database when add phone numbers for call blocking.
When adding blocking numbers to a Call Directory extension, the system’s CallKit database (/private/var/mobile/Library/CallDirectory/CallDirectory.db) becomes corrupted.
The reload call (reloadExtensionWithIdentifier) fails with error code 11 when the system tries to insert blocking entries, and the Console app on macOS shows the following errors:
database corruption page 2265525 of /private/var/mobile/Library/CallDirectory/CallDirectory.db at line 81343 of [f0ca7bba1c]
database corruption at line 79387 of [f0ca7bba1c]
Error Domain=com.apple.callkit.database.sqlite Code=11 "sqlite3_step for query 'INSERT INTO PhoneNumberBlockingEntry (extension_id, phone_number_id) VALUES (?, (SELECT id FROM PhoneNumber WHERE (number = ?))), (?, (SELECT id FROM PhoneNumber WHERE (number = ?))),...)'"
After this happens, CallKit becomes fully corrupted on the device and no further numbers can be added, even after:
Disabling and re-enabling the extension
Restarting the device (either force or soft restart)
Reinstalling the app
Waiting for a couple of minutes after this issue happens (that CallKit could possibly self-recovered)
I also tested other call-blocking apps, and they all fail with the same error. The only thing that recovers the system is a full “Reset All Settings.”
This issue has been reported by many users of my app, across multiple iOS versions and devices.
Similar related issue reported by another developer:
https://developer.apple.com/forums/thread/806129
Steps to Reproduce:
Enable the Call Directory extension from a call-blocking app.
Add and reload blocking numbers (a few thousand entries).
Perform multiple reloads between additions.
Check the Console, the corruption errors appear.
From this point, all insert attempts fail system-wide.
Expected Result:
Entries should be inserted successfully, or the system should self-recover without persistent corruption.
Actual Result:
sqlite3_step fails with Code=11, and the Call Directory database remains corrupted until the user resets all settings.
Additional Notes:
All numbers are sorted and deduplicated before insertion.
Happens intermittently after multiple reloads.
The system log always shows internal database failure.
Environment:
Device: iPhone 16 Plus
iOS 18.2 Beta (23C5027f)
Xcode 16.1 (17B55)
Attachments (included in Feedback FB20986470):
sysdiagnose captured immediately after the failure (with Phone app General Profile)
It seems like a system-level corruption affecting all Call Directory extensions once it occurs.
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
Activity
Hello! Thank you for bringing the new iPhone experience with the PushToTalk framework.
I have a working walkie talkie app based on the PushToTalk framework. Everything works fine except for an intermittent bug that I face from time to time on different devices with different iOS versions, from iOS 18 to iOS 26.2 Beta.
Sometimes the app goes into a state where the AVAudioInputNode input node tap returns buffers with a constant size that contain only silence. Leaving and rejoining a channel helps, but relaunching or reinstalling (from Xcode) the app does not. Rebooting the device or deleting and reinstalling the app also helps.
I do not activate the audio session in my app. I only configure it on launch using
setCategory(.playAndRecord, options: [.defaultToSpeaker, .allowBluetooth])
So the flow is:
channelManager?.requestBeginTransmitting(channelUUID: globalChannelUUID)
func channelManager(
_ channelManager: PTChannelManager,
channelUUID: UUID,
didBeginTransmittingFrom source: PTChannelTransmitRequestSource
)
func channelManager(
_ channelManager: PTChannelManager,
didActivate audioSession: AVAudioSession
) {
/// ...
installTapAndStart()
}
private func installTapAndStart() {
let inputNode = audioEngine.inputNode
let hardwareFormat = inputNode.outputFormat(forBus: 0)
guard let targetFormat = AVAudioFormat(
commonFormat: .pcmFormatFloat32,
sampleRate: configuration.audioSampleRate,
channels: configuration.audioChannelsCount,
interleaved: true
) else {
handleError(RecorderError.invalidAudioFormat)
return
}
let converter = AVAudioConverter(from: hardwareFormat, to: targetFormat)!
print("[QUICOpusRecorder]: installTap")
inputNode.installTap(onBus: 0, bufferSize: tapBufferSize, format: hardwareFormat) { [weak self] buffer, _ in
guard let self else { return }
// Here I handle audio data and sometimes get silence
}
//...
do {
audioEngine.prepare()
try audioEngine.start()
} catch {
print(" ⚠️ Audio engine start error: \(error)")
handleError(error)
}
}
Moreover, if the app is in the foreground and PushToTalk gets stuck in this “silence bug”, I can avoid relying on the PushToTalk flow and simulate audio session activation manually in code. In this case I do not request a transmission and do not use any PushToTalk related code, and the app captures audio data perfectly.
Once I leave the channel and rejoin it again, the issue is fixed and I start to receive non silent buffers of varying size, as expected.
It works for a while. It can work fine for a day or more, communicating without launching the app, or with the app in the foreground. But it can also go into the “silence” state 30 minutes after working normally.
I have no clue why this happens.
The only thing I notice is that when the app is in this “stuck silence bug” state, iOS does not play its “chirp” system sound when audio recording starts.
P.S. Channel descriptor restoration code:
extension PushToTalkEngine: PTChannelRestorationDelegate {
public func channelDescriptor(restoredChannelUUID channelUUID: UUID) -> PTChannelDescriptor {
print("☀️ \(#function) channelUUID: \(channelUUID)")
Task { @MainActor in
// Here I fetch more detailed channel data asynchronously
do {
await initChannelManagerIfNeeded(channelUUID: channelUUID)
let channelDescriptor = currentChannelDescriptor()
lastChannelDescriptorName = channelDescriptor.name
try await channelManager?.setChannelDescriptor(
channelDescriptor,
channelUUID: channelUUID
)
} catch {
handleError(error)
}
}
return PTChannelDescriptor(name: "Loading...", image: nil)
}
}
private func initChannelManagerIfNeeded(channelUUID: UUID? = nil) async {
guard let channelUUID = channelUUID ?? currentUser?.globalChannelUUID else {
print("❌ No global channel uuid found")
return
}
do {
guard channelManager == nil else {
try await channelManager?.setTransmissionMode(.halfDuplex, channelUUID: channelUUID)
return
}
channelManager = try await PTChannelManager.channelManager(
delegate: self,
restorationDelegate: self
)
try await channelManager?.setTransmissionMode(.halfDuplex, channelUUID: channelUUID)
} catch {
handleError(error)
}
}
Hi,
I am building an iOS app that uses FamilyControls / ManagedSettings to restrict apps.
Flow of my app:
In my main app, the user chooses which apps to restrict using FamilyActivityPicker (for example, they select Instagram).
I save the selection in an App Group.
I then use ManagedSettingsStore in the main app to add those app tokens into store.shield.applications, so a Screen Time shield appears when the user opens Instagram.
In my ShieldConfigurationExtension, I show a shield UI with a primary button called “Access App”.
In my ShieldActionExtension, when the user taps “Access App”, I want to immediately hide the shield and allow Instagram.
To hide the shield, I am using this code in my ShieldActionExtension:
final class ShieldActionExtension: ShieldActionDelegate {
// ...
override func handle(
action: ShieldAction,
for application: ApplicationToken,
completionHandler: @escaping (ShieldActionResponse) -> Void
) {
switch action {
case .primaryButtonPressed:
handlePrimaryButton(for: application, completionHandler: completionHandler)
case .secondaryButtonPressed:
completionHandler(.close)
@unknown default:
completionHandler(.defer)
}
}
private func handlePrimaryButton(
for application: ApplicationToken,
completionHandler: @escaping (ShieldActionResponse) -> Void
) {
// (I update some app-group state here, lives, history, etc.)
// This is the important part: I try to unshield the app
let store = ManagedSettingsStore()
var apps = store.shield.applications ?? Set<ApplicationToken>()
apps.remove(application)
store.shield.applications = apps
// I then tell the system to re-evaluate
completionHandler(.defer)
}
}
(When testing another approach, I also tried completionHandler(.close) after removing the app from the shield applications.)
Behavior I see:
Local / Xcode debug build (installed by cable):
Open Instagram → Slofy shield appears.
Tap “Access App” → the above code runs.
Shield disappears immediately and Instagram is usable. ✅
TestFlight build:
Open Instagram → Slofy shield appears.
Tap “Access App” → the above code runs, and I see in logs:
Removed app from shield set (apps now: 0)
But the shield does not hide. It stays on the screen. ❌
Only if I then open my main app (Slofy) and close it again, and then return to Instagram, the shield disappears and Instagram is unlocked.
So the same code works as expected in local debug builds, but in TestFlight builds the Screen Time shield does not refresh / disappear immediately after I remove the app from store.shield.applications inside the ShieldActionExtension.
My questions:
Is it supported to unshield an app directly from inside a ShieldActionExtension (by removing it from ManagedSettingsStore().shield.applications) and expect the shield to disappear immediately?
Is there any difference in how ManagedSettingsStore changes are applied between debug and TestFlight / release builds for Screen Time shields?
Is the main app required to be in the foreground for the shield to update, or is there a recommended pattern to make the shield hide right after the user taps the primary button in the shield?
I would like the behavior to be:
User opens restricted app → shield shows → taps “Access App” → shield hides immediately and the app becomes usable, without needing to open the main app.
Any guidance on the correct way to implement this with Screen Time extensions would be greatly appreciated.
Thank you.
Topic:
App & System Services
SubTopic:
General
Hi everyone,
We’re experiencing a persistent issue with an App Clip Experience that continues to load on iOS devices even after being deactivated in App Store Connect more than 48 hours ago.
Issue Summary
An App Clip Experience tied to the URL pattern
https://srgplus.com/u/...
keeps appearing when scanning NFC tags or QR codes, despite being removed from App Store Connect.
Key Details
The App Clip Experience was deactivated over 48 hours ago.
iOS still launches the App Clip when scanning NFC tags or QR codes that match the URL structure.
The specific token-based App Clip Experience (for example: https://srgplus.com/u/iohgqa) was removed, but iOS still loads an App Clip as if the Experience exists.
It seems like iOS is falling back to a previously registered base URL Pattern such as:
https://srgplus.com/u
or possibly even https://srgplus.com
The problem:
This fallback App Clip is not visible anywhere in App Store Connect → Advanced App Clip Experiences.
So we cannot delete or modify it.
The behavior persists across:
Multiple devices
Different networks
After clearing device caches
After reinstalling our app
Even after scanning using devices that never used this App Clip before
This makes us believe that the App Clip Experience may be:
Cached on Apple’s servers
Or orphaned/hidden in App Store Connect
Or not properly removed from the URL pattern registry
Steps to Reproduce
Deactivate an App Clip Experience in App Store Connect.
Wait 48 hours or more.
Scan an NFC tag or QR code pointing to a previously used URL pattern.
App Clip still appears, even though no active Experience exists.
Expected Behavior
App Clip should stop appearing once the Experience is deactivated and removed.
Actual Behavior
App Clip continues to load indefinitely, suggesting a cached or orphaned configuration.
Question
Has anyone encountered similar behavior?
Is there a way to request a manual purge of App Clip URL patterns or cached Experiences from Apple’s side?
Any guidance or insights would be greatly appreciated.
Thank you!
Hello,
I’m encountering an issue with Universal Links in my iOS app. After some investigation, I found that the root cause seems to be that Apple’s request through there CDN server to access the .well-known/apple-app-site-association file is blocked by our firewall, which enforces geographic access restrictions as part of our security policy.
Because of this restriction, Apple’s validation or link verification requests are being denied, and the Universal Links are not working as expected.
I’d like to get some guidance from the community or Apple engineers on the following:
1. Does Apple provide an official list of IP ranges or domains that need to be allowed through the firewall for Universal Link validation?
2. Are there alternative methods to handle Universal Link verification in environments with geographic restrictions?
3. Would whitelisting specific Apple services or endpoints be a recommended or safe solution?
Any input or recommendations would be greatly appreciated.
Environment Details:
• iOS app using Universal Links
• Server protected by a firewall with regional restrictions
• AASA file hosted correctly and accessible via browser
Thanks in advance for your help and insights.
Hello,
I would like to clarify how link association and app-opening preferences work in iOS, specifically when a user opens a URL in a browser that can be handled by an installed application.
I have noticed the following behavior:
When a user taps a URL that can be opened by an app, iOS sometimes asks whether to open the link in the app or continue in the browser.
After choosing an option once (for example, "Open in App" or "Stay in Browser"), it seems that this preference becomes persistent.
Even after deleting the application and reinstalling it, the browser (Safari or third-party browsers) sometimes continues to open the link directly in the browser without asking the user again.
In some cases, it appears impossible to reset or clear this association, and the user is not prompted again to choose how the link should be opened.
My questions are:
How exactly does iOS store link-handling preferences between apps and browsers?
Are these preferences saved on the system level, inside Safari, or associated with the app installation itself?
Is there a way for a user to manually reset or clear these link-opening associations?
Should deleting and reinstalling the app reset these preferences, or is the behavior expected to persist?
Is this behavior different for Universal Links, App Clips, or for regular URL scheme associations?
This situation is important for us because it affects user experience, and at the moment it is difficult to understand or reproduce the internal logic behind these link associations.
Thank you in advance for your clarification.
Topic:
App & System Services
SubTopic:
General
Tags:
Entitlements
Provisioning Profiles
Universal Links
Code Signing
系统闹钟APP响铃响起时,点击电源键可以小睡功能。AlarmKit能否有办法判断是电源键和其他物理按键关闭了闹钟,而非点击或滑动关闭按钮。这样第三方闹钟也可以增加小睡功能。目前是直接关闭了闹钟。
Topic:
App & System Services
SubTopic:
General
I’m integrating the Declared Age Range feature to tailor our app’s experience based on a user’s age range. I’m currently in the testing phase and would like to repeatedly test the consent flow and different outcomes from AgeRangeService.shared.requestAgeRange(...).
However, once I go through the consent flow and choose to share, the age-range sharing sheet no longer appears on subsequent attempts—so it’s hard to validate edge cases (e.g., changed gates, declined flow, re-prompt behavior).
Could you advise on the recommended way to reset or re-prompt during development? In particular:
Is there a supported way to clear per-app consent so the system prompts again?
Under what conditions should the “Share Age Range Again” control appear in Settings, and is there an equivalent way to trigger it for testing?
Are there best practices for QA (e.g., using Ask First at the system level, testing on real devices vs. Simulator, using a separate bundle ID for dev builds, or other steps)?
Any other guidance for validating different requestAgeRange results (e.g., declined/not available) would be appreciated.
I'm trying to digest and understand the new set of APIs relating age verification that were released last week.
I have say that without some cohesive overview, example app, just a simple diagram showing the relationship of everything, its not at all clear to me what's going on nor what an app developer is expected to do to use these apis (I'm a senior engineer with 15 year's iOS experience, but hey maybe I'm just a bit slow in the head).
I have a few questions, but the topic of this post is what is the relationship between age verification i.e. between the declared age range/significant change and Permission Kit?
The documentation for the former mentions the Significant Change API/Topic (https://developer.apple.com/news/?id=2ezb6jhj / https://developer.apple.com/documentation/PermissionKit/SignificantAppUpdateTopic).
Now the Significant Change Topic is documented as being part of PermissionKit, however the documentation for that (https://developer.apple.com/documentation/permissionkit)
States emphatically at the top:
"Communication experiences using the PermissionKit framework are only available using iMessage."
Meaning you can't use PermissionKit for anything other than iMessage? If it doesn't mean that, then why does it state so?
If it does mean that, then how does an app which has nothing to do with iMessage make use of Significant Change - because this documentation:https://developer.apple.com/news/?id=2ezb6jhj
Is talking about using significant change for all apps, not iMessage.
So there is a contradiction here.
Hi,
I’ve built an app that includes a Contacts Provider Extension (CPE). On iOS 18, I observed the expected behavior — when the main app is uninstalled, the corresponding CPE entry is also removed from the Contacts list.
However, on iOS 26, this no longer happens. After uninstalling the app, the CPE remains visible and active in the Contacts list, even though the app is gone.
Q4: When an alarm is dismissed (either by swiping or pressing the power button), can an app detect this action and execute code in response? What about force closed apps?
When an alarm is dismissed, the stopIntent set in the AlarmConfiguration is called. Any code in the perform method of this AppIntent would execute.
我看到这样的描述,但是测试发现锁屏状态下闹钟响起时按下电源键不走AlarmConfiguration的stopIntent。设计确实是这样吗?
Topic:
App & System Services
SubTopic:
General
Currently I am not finding any API to read the status of Message Filter Extension from settings. Are we planning for any future releases ?
Hi everyone,
I’ve been stuck on an issue with iOS Universal Links for about a week and could really use some help.
The problem
When tapping a Universal Link on iOS, my Flutter app opens correctly (desired behavior) — but immediately afterward, Safari opens the same link in the browser. So both the app and the browser open.
This only happens on iOS. On Android everything works as expected.
What works
If the link is simply the domain, like:
https://mydomain.com
…then the app opens without triggering the browser afterward. This is the correct behavior.
What doesn’t work
If the link includes a path or parameters, like:
https://mydomain.com/path
https://mydomain.com/path?param=value
…then the app opens, and then the browser opens immediately after.
What I’ve tried
Verified my AASA file using Branch’s validator:
https://branch.io/resources/aasa-validator/
→ The AASA file is valid.
Universal Links do open the correct screen inside the app — the issue is the unwanted second step (Safari opening).
Behavior is consistent across different iOS devices.
Extra details
Using Flutter.
Universal Links set up with the standard configuration (associatedDomains, AASA hosted at /.well-known/apple-app-site-association, etc.).
Question
Has anyone encountered this issue where Universal Links with paths/params open the app and then open Safari?
What could cause iOS to trigger the browser fallback even when the AASA file is valid and the app handles the link correctly?
Any insights, debugging tips, or known edge cases would be incredibly appreciated!
Hello Apple Developer Support Team,
I am the Account Holder of my Apple Developer Program team (Team ID: T2BKUF6E93).
My iOS app is using Swift WeatherKit (WeatherService) on device.
Although my environment is completely configured, the system WeatherDaemon consistently fails to generate the WeatherKit JWT token.
My environment:
Team type: Apple Developer Program (paid)
Team ID: T2BKUF6E93
Account role: Account Holder
Xcode: latest version
Device: iPhone (real device)
Provisioning Profile: iOS Team Provisioning Profile (auto-managed)
Entitlement: com.apple.developer.weatherkit included
WeatherKit Key: created successfully (.p8 downloaded)
Bundle ID: correct and WeatherKit capability enabled
App reinstalled after each configuration change
Device rebooted
Even after enabling WeatherKit capability and generating a WeatherKit Key, the system still fails to generate JWT:
Failed to generate jwt token for: com.apple.weatherkit.authservice
Error Domain=WeatherDaemon.WDSJWTAuthenticatorServiceListener.Errors Code=2 "(null)"
The error persists across:
multiple device restarts
full clean/rebuild in Xcode
deleting and reinstalling the app
pulling the latest provisioning profiles
waiting more than several hours for backend propagation
What I suspect
My WeatherKit entitlement and/or WeatherKit Key may not be fully propagated to the provisioning server or WeatherDaemon backend, even though everything appears correctly configured on the Developer Center.
I kindly request the support team to:
Verify whether the WeatherKit Entitlement is correctly attached to my app ID and provisioning profile.
Verify whether my WeatherKit Key is properly registered and propagated for my team.
Check if there are any backend propagation delays or stuck states for my Team ID (T2BKUF6E93).
Confirm whether WeatherDaemon has permission to generate JWT for my app.
Thank you
Please let me know if any logs, screenshots, or provisioning profile identifiers are needed.
Thank you for your help!
Best regards,
Jiangyang
Are we planning to have some APIs or methods to know that status of Call blocking extension and message filter extension in future releases as currently it is not available.
Hello,
I’m running into an issue with the Family Controls (Distribution) entitlement not being included in my App Store Connect provisioning profiles.
Here’s the situation:
•Both my main app and its Screen Time extension have been approved for Family Controls (Distribution)
In Certificates, Identifiers & Profiles → Identifiers, I can clearly see that the capability Family Controls (Distribution) is enabled for both App IDs.
However, when I generate a new provisioning profile (either manually or via Xcode), the resulting .mobileprovision file’s Entitlements section does not include the Family Controls (Distribution) entitlement.
As a result, building for distribution or archiving fails to recognize that entitlement, even though everything looks correct in the Developer Portal.
But the missing entitlement persists.
How can I successfully generate a distribution provisioning profile that includes Family Controls (Distribution)?
Thanks in advance for any guidance — this seems like a subtle configuration issue, and I’d love to hear how to get over it.
I can provide the Team ID and bundle ID upon request.
STEPS TO REPRODUCE
I’ve tried:
•Regenerating both App IDs and provisioning profiles
•Revoking and re-creating distribution certificates
•Cleaning derived data and re-downloading profiles from Xcode
Every time, creating a profile for App Store Connect will fail to include the capabilities the app has been approved for.
Hello,
I have a question about the default UI in an App Clip. I know that when App Clip launches, a system banner appears at the top for a few seconds, prompting the user to download the full app from the App Store.
I'd like to confirm if this is the standard, default behavior for all App Clips. More importantly, is there any way to disable or hide this banner? We would prefer to manage the prompt to download the full app within our own UI.
Thanks in advance for your help!
In the summary documentation about the declared Age Range API:https://developer.apple.com/news/?id=2ezb6jhj
It states: "The API will also return a signal from the user’s device about the method of age assurance, such as credit card or government ID"
But if the api itself, and its documentation is examined, there is no such mechanism nor mention of it: https://developer.apple.com/documentation/declaredagerange/agerangeservice
So my question is, is the first documentation incorrect, if not, then where and how to access the method of age assurance?
I need to post an app so how do you do it
Hello,
I’m working on implementing SB2420 compliance using the Declared Age Range framework.
While referring to the documentation at https://developer.apple.com/documentation/declaredagerange, I couldn’t find details on how the TX region (transaction region or territory) is determined when using Declared Age Range.
Specifically, I’d like to confirm the following points:
How does the system determine the TX region when the user’s declared age range is retrieved?
Is it based on the App Store region, the device locale, or the user’s Apple ID country?
If the app’s backend needs to verify or log the TX region, is there a way to obtain or infer it from the API response or receipt data?
Is there any difference in TX region determination between Sandbox and Production environments?
If anyone has experience implementing Declared Age Range (SB2420) and handling region determination, I’d appreciate your insights or best practices.
Thank you.
Topic:
App & System Services
SubTopic:
General