What I want to achieve now is that when the app is not running, upon receiving a notification, it displays an interface similar to CallKit with accept and decline buttons.
Here is part of my code:
@available(iOS 17.4, *)
class LiveCommunicationManager: NSObject, ConversationManagerDelegate {
static let shared = LiveCommunicationManager()
var isInvalidate:Bool = false
var configuration: ConversationManager!
override init() {
let config = ConversationManager.Configuration(
ringtoneName: "notes_of_the_optimistic",
iconTemplateImageData: UIImage(named: "AppIcon")?.pngData(), // 图标的 PNG 数据
maximumConversationGroups: 1, // 最大对话组数
maximumConversationsPerConversationGroup: 1, // 每个对话组内最大对话数
includesConversationInRecents: false, // 是否在通话记录中显示
supportsVideo: false, // 是否支持视频
supportedHandleTypes: [.generic,.phoneNumber,.emailAddress] // 支持的通话类型
)
configuration = ConversationManager.init(configuration: config)
}
func reportIncomingCall(uuid: UUID, callerName: String) {
configuration.delegate = self
let local = Handle(type: .generic, value: callerName, displayName: callerName)
let update = Conversation.Update(localMember: local,members: [local],activeRemoteMembers: [local])
Task{
do {
try await configuration.reportNewIncomingConversation(uuid: uuid, update: update)
print("成功报告新来电")
} catch {
print("报告新来电失败: \(error.localizedDescription)")
}
}
}
func conversationManager(_ manager: ConversationManager, conversationChanged conversation: Conversation) {
print("会话状态改变了")
}
func conversationManagerDidBegin(_ manager: ConversationManager) {
print("会话已经开始了")
manager.delegate = self
}
func conversationManagerDidReset(_ manager: ConversationManager) {
print("会话将要清除了")
}
func conversationManager(_ manager: ConversationManager, perform action: ConversationAction) {
print("会话接听了")
configuration.invalidate()
}
func conversationManager(_ manager: ConversationManager, timedOutPerforming action: ConversationAction) {
print("会话超时了")
}
func conversationManager(_ manager: ConversationManager, didActivate audioSession: AVAudioSession) {
print("会话激活了")
}
func conversationManager(_ manager: ConversationManager, didDeactivate audioSession: AVAudioSession) {
print("会话死亡了")
}
}
在Appdelegate里设置了这些:
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// 在这里处理离线推送通知
completionHandler(.noData) // 返回后台任务完成
if let aps = userInfo["aps"] as? [String: Any],
let alert = aps["alert"] as? [String : Any]{
// 静默推送的处理逻辑
if #available(iOS 17.4, *) {
let manager = LiveCommunicationManager.shared
if manager.isInvalidate { return }
if let msgType = userInfo["msgType"] as? Int{
if msgType == 5{
manager.configuration.invalidate()
}else{
let callerName = alert["title"] as? String ?? "Fanvil"
manager.reportIncomingCall(uuid: UUID(), callerName: callerName)
}
}
}
}
}
Xcode has been configured with the necessary capabilities, such as Background Fetch, Voice over IP, Background Processing, and Push Notification.
The issue now is that sometimes the code works as expected, allowing the app to wake up when not running and displaying the system interface with accept and decline buttons. However, after a few successful attempts, the app stops waking up, and no notification appears. But when I manually open the app, the didReceiveRemoteNotification method gets triggered.
I’d like to know why this stops working after a few times.
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
is there documentation where we can find details for historical parameters / limitations - so far i've found that the days limit on single API calls days limit is 7. Any other similar specs would be good to have
Hi Apple Dev community,
I want to ask if CallKit and CXCallDirectoryProvider (with addBlockingEntryWithNextSequentialPhoneNumber) doesn't work for 3rd party Phone apps.
Is this a known issue that CallKit doesn't work on 3rd party iOS Phone apps (like WhatsApp, etc)?
Thank you.
Hi everyone,
We're using the react-native-device-activity package to implement app blocking via Apple's Screen Time API. The blocking functionality works well: when the user selects apps and taps "Done," those apps get blocked as expected.
However, we're facing an issue with unblocking apps that the user later unselects. Even after the user unchecks some apps and taps "Done" again, those previously selected (now unselected) apps remain blocked and still show the shield.
I’m testing FinanceKit with Apple Cash and noticed that transfers don’t include any counterparty information.
Here’s an example transaction I fetched:
Transaction(
id: 5A96EA49-B7C9-4481-949D-88247210C1D7,
accountID: 28D7C0E2-DC2A-4138-B105-BCE5EE00B705,
transactionAmount: 30 USD,
creditDebitIndicator: .credit,
transactionDescription: "Transfer",
originalTransactionDescription: "",
merchantCategoryCode: nil,
merchantName: nil,
transactionType: .transfer,
status: .booked,
transactionDate: 2025-08-19 21:57:54 +0000,
postedDate: 2025-08-19 21:57:55 +0000
)
As you can see:
transactionDescription is just "Transfer"
originalTransactionDescription is empty
merchantName is nil
No counterparty details are exposed
In contrast, the Wallet app clearly shows the other person’s name and avatar for Apple Cash transfers, making it easy to understand who the payment was with. In FinanceKit, there’s no way to distinguish between transfers with different people — every transfer looks identical.
Questions
Is there a hidden or planned field for Apple Cash counterparty information?
Can FinanceKit provide at least minimal metadata (e.g., contact name, initials, or a privacy-preserving identifier)?
Is there any workaround today to correlate Apple Cash transfers with contacts?
Feature request: Please expose counterparty information for Apple Cash transfers. Even something as simple as a stable identifier or name string would enable developers to build Wallet-quality transaction detail screens.
Thanks!
Topic:
App & System Services
SubTopic:
General
When Live Caller ID first came out I experimented with it and got it working using the Example PIR database.
All my links from that time are now out of date and no longer work, however I seem to have found where the PIR database example and documentation has moved to (https://swiftpackageindex.com/apple/pir-service-example/main/documentation/pirservice/testinginstructionslivecalleridlookup)
But what I can't find is an exact definition of the the logo size/max size/dimensions/format should be.
My memory from that time is that it was very pernickety, and if things weren't exactly right, the logo wasn't displayed.
I can remember the format had to be HEIC to get it to work.
Looking through the documentation however, I can't see exact requirements specified.
My question is - for the Live Caller ID logo what are the exact image requirements, and where are they documented?
Hi Apple engineering team,
I’m trying to integrate the new Live Caller ID Lookup (PIR) on iOS using your pir-service-example code as well as a custom mock server in Vapor, but the extension never advances past the /issue/token-key-for-user-token step. I’ve tried both:
1. Official Example
Cloned https://github.com/apple/pir-service-example
Ran PIRService locally
Confirmed that
GET /.well-known/private-token-issuer-directory → 200
GET /issue/token-key-for-user-token → 200 (DER bytes, correct SPKI)
No POST /issue ever fires
2. Mock Server (Vapor)
Implemented all five endpoints (/config, /.well-known/private-token-issuer-directory, /issue/token-key-for-user-token, /issue, /queries)
Verified with curl and openssl asn1parse that:
GET /.well-known/private-token-issuer-directory
Content-Type: application/private-token-issuer-directory
{ "issuer-request-uri":"https://…/issue", "token-keys":[…] }
GET /issue/token-key-for-user-token
Content-Type: application/octet-stream
<DER bytes>
Added Cache-Control: public, max-age=3600 on directory and SPKI
Stubbed POST /issue to always return { "token": "" }
Still no POST /issue request from the extension
Reproduction Steps
Install and enable a Live Lookup extension pointing to my server.
Trigger an incoming call on device.
Watch server logs—only see the two GETs, never /issue or /queries.
Expected Behavior
After fetching the SPKI DER, the framework should issue a POST /issue call (Privacy Pass flow) and then POST /queries.
Observed Behavior
Stuck in an infinite loop of:
GET /.well-known/private-token-issuer-directory
GET /issue/token-key-for-user-token
(repeat…)
No progression to the /issue or /queries endpoints.
What I’ve Tried
Verified JSON kebab-case and headers exactly match examples
Confirmed SPKI DER is valid via openssl asn1parse
Added Cache-Control headers
Tested on real device, localhost url, and ngrok public URL
Mocked a valid-looking token response
Could you advise what additional requirement or format detail I’m missing that prevents from advancing past /issue/token-key-for-user-token?
These are the main files:
LiveLookupExtension.swift
routes.swift
service-config.json
Thanks in advance!
When syncing an Office 365 (Exchange) account on an M1 Max machine running the latest macOS (e.g., Sonoma), the native contactsd and AddressBookManager processes enter a severe, persistent failure loop. The CPU usage spikes from 0.0% to over 80% (observed at 81%) and repeats every 60-90 seconds. This occurs even when the account is entirely empty of contacts and after performing a clean macOS installation, strongly indicating a systemic bug in the framework's Exchange protocol handler on the M1 architecture.
System Information
Affected Hardware: Apple M1 Max
Affected macOS Version: Tahoe 26.1
Affected Processes: contactsd, AddressBookManager
Account Type: Microsoft Exchange / Office 365
Steps to Reproduce
System Setup: Perform a clean installation of macOS on the M1 Max machine (USB boot, NO Migration Assistant or data restoration).
Account Preparation: Ensure the target Exchange account's contacts folder is entirely empty on the server (via Outlook Web Access).
Trigger: Go to System Settings > Internet Accounts and add the Exchange account. Ensure ONLY Contacts is toggled ON.
Observation: Open Activity Monitor and sort by % CPU.
Expected Behavior
The contactsd and AddressBookManager processes should spike briefly (under 5%) to establish the empty sync, then settle to a persistent idle state (0.0% to 0.5% CPU).
Actual Behavior
The processes never settle:
CPU Spikes: Usage repeatedly jumps from 0.0% to 81% for AddressBookManager and 22-59% for contactsd.
Pattern: This extreme spike lasts for a few seconds before the thread crashes/restarts, and the process immediately re-initiates the loop, consuming massive CPU cycles continuously.
Diagnostic Proof
The runaway CPU is not caused by corrupt data:
Data Neutralization: The account's contacts folder was emptied on the server, yet the high CPU loop persisted when syncing.
Clean System: The issue is reproducible on a clean, from-scratch macOS installation, ruling out corrupted user preferences or system files.
Cross-Architecture: The exact same account syncs perfectly on iOS and newer M4 Macs, confirming the data is valid and the issue is specific to the M1 Max's implementation of the Exchange protocol handler.
Workaround (For Visibility)
To restore system performance, the user must DELETE the entire Exchange account from System Settings > Internet Accounts and use a third-party client (e.g., Outlook for Mac) for synchronization, as it bypasses the buggy native framework.
Topic:
App & System Services
SubTopic:
General
Summary:
I'm developing an iOS audio app in Flutter that requires background audio playback for long-form content. Despite having a paid Apple Developer Program account, the "Background Modes" capability does not appear as an option when creating or editing App IDs in the Developer Portal, preventing me from enabling the required com.apple.developer.background-modes entitlement.
Technical Details:
In the app that I am developing, users expect uninterrupted playback when app is backgrounded or device is locked similar to Audible, Spotify, or other audio apps that continue playing in background
The Problem:
When building for device testing or App Store submission, Xcode shows:
Provisioning profile "iOS Team Provisioning Profile: com.xxxxx-vxxx"
doesn't include the com.apple.developer.background-modes entitlement.
However, the "Background Modes" capability is completely missing from the Developer Portal when creating or editing any App ID. I cannot enable it because the option simply doesn't exist in the capabilities list.
What I've Tried:
Multiple browsers/devices: Safari, Chrome, Firefox, incognito mode, different computers
Account verification: Confirmed paid Individual Developer Program membership is active
New App IDs: Created multiple new App IDs - capability never appears for any of them
Documentation review: Followed all Apple documentation for configuring background execution modes
Different regions: Tried changing portal language to English (US)
Cache clearing: Logged out, cleared cookies, tried different sessions
Apple Support Response:
Contacted Developer Support (Case #102633509713). Received generic documentation links and was directed to Developer Forums rather than technical escalation.
Has anyone else experienced the "Background Modes" capability missing from their Developer Portal?
Has anyone successfully used the App Store Connect API to add background-modes when the GUI doesn't show it?
What's the proper escalation path when Developer Support provides generic responses instead of technical assistance?
Things I have attempted to solve this:
audio_service package: Implemented as potential workaround, but still requires the system-level entitlement
Manual provisioning profiles: Cannot create profiles with required entitlement if capability isn't enabled on App ID
Other perhaps important facts about the environment where I am building the app:
macOS Sonoma
Xcode 15.x
Flutter 3.5.4+
Apple Developer Program (Individual, paid)
testing
Topic:
App & System Services
SubTopic:
General
Hello everyone,
I would like to know if there is any way for an iOS app to automatically access a user’s total Screen Time (for example, daily or weekly usage) and then share this with friends so they can compare results, like in a “Screen Time battle”?
Thanks you very much for you help!
Hello everyone,
I’m currently developing an app that uses the Family Controls API, specifically the Screen Time API. However, my current entitlement is limited to development mode, which prevents me from publishing my app on TestFlight.
I have already contacted Apple Developer Support for production access but wanted to reach out to the community as well and I was referenced to FamilyControls API documentation and I couldn't find anything related to my case. Has anyone successfully upgraded their entitlement from development-only to production? Any insights on the process, tips for communicating with Developer Support, or guidance on ensuring full compliance with the Family Controls guidelines would be extremely helpful.
Currently I am not finding any API to read the status of Message Filter Extension from settings. Are we planning for any future releases ?
My use case is a Repeat Timer app.
The user can configure a repeating timer, say:
8 minutes with 3 sets
So I would like to configure either 3 alarms (8mins, 16mins, 24mins) or a repeating alarm (8mins every 3 mins)
BUT...
I would like the first and second alarms to break through but only for 5 seconds for example, and then stop (so the user doesn't need to tap the screen to silence the alarm).
I don't think this is possible after reading the API docs, but am asking the question anyway.
Thanks for any advice or guidance here, and happy WWDC!
Topic:
App & System Services
SubTopic:
General
Hi!
I'm building a Screen Time management app using FamilyControls and ManagedSettings. When a user taps the primary button on a ShieldActionExtension, I need to open my main app to guide them through an intervention exercise.
Other approved App Store apps like Jomo - Screen Time Blocker do exactly this: tapping their shield's primary button opens the main Jomo app directly.
Screen recording: https://drive.google.com/file/d/15yubtTdTkFskGCIaAw_HGB57-boHPl3a/view?usp=sharing
I've tried:
URL schemes (UIApplication.shared.open() unavailable in extensions)
Universal links
Local notifications (works, but adds an extra tap)
NSUserActivity
Is there a supported API I'm missing? Or another accepted solution? Any guidance is appreciated.
Topic:
App & System Services
SubTopic:
General
Tags:
Extensions
Family Controls
Managed Settings
Screen Time
The example database/server provided by Apple for Live Caller ID contains a hardcoded database with a tiny number of pre-defined numbers.
However, its not expected to be representational of an live real world usage server.
But the question is how can that be accomplished if its a requirement that the data be KPIR encrypted?
In real world scenarios, the factors that effect whether a number should be blocked or not are continually changing and evolving on a minute-by-minute basis and new information becomes available or existing information changes.
If the database supports tens of millions or hundreds of millions of constantly changing phone numbers, in order to meet the requirements of the Live Caller ID being KPIR encrypted, that would imply the database has to re-encrypt its database of millions endlessly for all time.
That seems unfeasable and impractical to implement.
Therefore how do the Apple designers of this feature envisage/suggest a real-world server supporting millions of changing data should meet the requirement to be KPIR encrypted?
I’m configuring App Clip launch behavior and would appreciate some clarification.
In my setup, the App Clip launch URL is the same as the deep link used to open the full app. Both are configured in the Apple App Site Association (AASA) file.
Observed behavior:
Scanning a QR code with this URL correctly launches the App Clip.
Tapping the same URL when it’s shared (for example, via Messages) launches the full app via the deep link instead of the App Clip experience.
I’m reviewing the documentation here:
https://developer.apple.com/documentation/appclip/configuring-the-launch-experience-of-your-app-clip#Choose-App-Clip-experiences-you-want-to-support
The table mentions that an App Clip can be invoked via “A shared link to an App Clip in the Messages app.” However, when I tap the shared link in Messages, the deep link experience is triggered instead of the App Clip.
My questions are:
Is this behavior expected when the App Clip URL and the app’s deep link URL are the same?
Does launching an App Clip from a shared Messages link require a distinct URL or additional configuration beyond what’s in the AASA file?
Are there specific constraints or priorities between universal links for the full app and App Clip invocation in this scenario?
Any clarification or guidance would be greatly appreciated.
Thank you.
Does WeatherKit Rest api have the following forecast endpoints?
Pollen and Flu
Air quality
Radar forecast served through a REST API?
Hail
Solar energy
Frost Potential Index
Hello,
I’m currently reviewing and implementing age assurance and parental approval flows using AgeRangeService and PermissionKit (AskCenter) in the context of Texas regulatory compliance requirements.
While the high-level APIs are clear, there are several technical aspects where the intended usage patterns are not fully explicit in the documentation. Clarification on these points would help ensure our implementation aligns with system expectations and regulatory obligations.
⸻
Querying the current approval state for SignificantAppUpdateTopic
AskCenter.ask(...) returns Void, and AskCenter.responses(for:) provides an AsyncSequence of approval events.
Is there an official or recommended way to determine whether a SignificantAppUpdateTopic has already been approved when the app launches, or is listening for future responses events the only supported mechanism?
⸻
Behavior of AskCenter.responses(for:) regarding past approvals
When subscribing to AskCenter.responses(for:):
• Does the stream replay previously recorded approval or decline decisions?
• Or does it only emit events that occur after subscription?
This affects whether the listener must be registered early in the app lifecycle.
⸻
Recommended lifecycle timing for registering a responses(for:) listener
What is the intended or recommended time to register a responses(for:) listener?
• At application launch
• Immediately before calling ask(...)
• When entering a specific gated feature
Clarification on the expected lifecycle usage would be helpful.
⸻
Repeated calls to ask(...) after approval
If AskCenter.ask(...) is called again for the same SignificantAppUpdateTopic after parental approval has already been granted:
• Is the request ignored?
• Is a new approval request sent to the parent?
• Or is the call handled idempotently by the system?
⸻
Delivery of approval results when the child app is not running
If a parent approves or declines a SignificantAppUpdateTopic while the child app is not running:
• Will the approval decision be delivered as a responses(for:) event on the next app launch?
• Or is the app expected to persist approval state locally?
⸻
Persistence of approval state
Is the approval decision for SignificantAppUpdateTopic persisted by the system at the OS level, or is the app responsible for storing approval state?
Additionally, does the approval persist across:
• app restarts?
• app deletion and reinstallation?
⸻
Meaning of activeParentalControls.significantAppChangeApprovalRequired
How is activeParentalControls.significantAppChangeApprovalRequired determined?
• Is this value explicitly configured by a parent (for example via Screen Time)?
• Or is it automatically determined by the system based on region, age, or regulatory requirements?
⸻
Relationship between significantAppChangeApprovalRequired and AgeRangeService
When activeParentalControls contains significantAppChangeApprovalRequired, is it still expected that apps call AgeRangeService.requestAgeRange(...)?
Or can the presence of this flag be treated as sufficient indication that the user is a minor for gating purposes?
⸻
Recommended interpretation of AgeRangeDeclaration
Is the intended usage of AgeRangeDeclaration to handle each case individually, or is it acceptable and recommended to interpret the values as different trust levels (for example, self-declared vs. government ID or payment verified)?
⸻
Clarification on these points would help ensure that implementations of age assurance and parental approval flows are consistent with system behavior while meeting regulatory compliance requirements.
Thank you for your guidance.
At present, all my apps cannot display normally
Topic:
App & System Services
SubTopic:
General