Hey there my application allows users to have video calls with each other using Agora. I have successfully set up incoming call functionality on Android but on iOS I am struggling to get the call ui to appear when the app is not running/in background/locked.
To my knowledge this is because there is much stricter security on iOS which is limiting me from calling this. When i initially set it up it worked at first when the app was in the background but I think I was failing to report the call to call kit in time and now it's not working.
I'm not sure if I need access to this entitlement:
com.apple.developer.pushkit.unrestricted-voip
Which i believe is only for the big boys or if I make sure I'm reporting the call to call kit fast enough that I won't encounter this issue and it will consistently work in the background.
Notifications
RSS for tagLearn about the technical aspects of notification delivery on device, including notification types, priorities, and notification center management.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I’m using iOS 26 beta 9 on my iPhone 15 Plus. When I receive a call from a contact with multiple phone numbers, the call history does not clearly show which specific number was used to call me. Why? How to fix this issue?
Topic:
App & System Services
SubTopic:
Notifications
Hi Apple team and fellow developers,
We previously had Location Push Service Extension enabled and working in production. After transferring the app to a new Apple Developer team, the production App ID was transferred, but the Location Push entitlement was not retained.
We've also created a new App ID for development, and now need Location Push access enabled for both the transferred production ID and the new development ID.
We’ve already submitted the Location Push Access form with all relevant details.
Unfortunately, the App Transfer documentation didn’t make it clear that Location Push access would be lost, and now we’re blocked from making new builds — even for the existing production app.
❓ Questions:
Is it possible to re-enable Location Push for a transferred App ID?
What’s the expected timeline for entitlement approval?
Can Apple staff confirm the request status or let us know if any further action is needed?
Thanks in advance — this entitlement is critical for our app’s functionality and release pipeline.
Best,
Aidar
Topic:
App & System Services
SubTopic:
Notifications
Tags:
APNS
Developer Tools
Maps and Location
Developer Program
self.pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
self.pushRegistry.delegate = self;
self.pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
//处理接收到的VoIP推送
(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void(^)(void))completion
then we send message from our server or from apple's cloud service: https://icloud.developer.apple.com/dashboard/notifications website services:
when app is in foreground,withCompletionHandler wil be called correctly,but when app is in background or has killed ,withCompletionHandler not be called!!!
the background fetch、voice over ip is checked in signing & capabilities tabs
why?why?why?why?why?why?why?why?why?
In macOS, how can I use UnmutableNotificationContent notifications to prevent the main window from activating when clicking the notification?
code:
import Cocoa
import UserNotifications // Mandatory import for notification functionality
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Automatically request permissions and send a test notification when the view loads
sendLocalNotification()
}
/// Core method to send a local notification
func sendLocalNotification() {
let notificationCenter = UNUserNotificationCenter.current()
// 1. Request notification permissions (Mandatory step; user approval required)
notificationCenter.requestAuthorization(options: [.alert, .sound, .badge]) { [weak self] isGranted, error in
guard let self = self else { return }
// Handle permission request errors
if let error = error {
print("Permission request failed: \(error.localizedDescription)")
return
}
// Exit if user denies permission
if !isGranted {
print("User denied notification permissions; cannot send notifications")
return
}
// 2. Construct notification content using UNMutableNotificationContent
let notificationContent = UNMutableNotificationContent()
notificationContent.title = "Swift Notification Test" // Notification title
notificationContent.subtitle = "macOS Local Notification" // Optional subtitle
notificationContent.body = "This is a notification created with UNMutableNotificationContent" // Main content
notificationContent.sound = .default // Optional notification sound (set to nil for no sound)
notificationContent.badge = 1 // Optional app icon badge (set to nil for no badge)
// 3. Set trigger condition (here: "trigger after 3 seconds"; can also use time/calendar triggers)
let notificationTrigger = UNTimeIntervalNotificationTrigger(
timeInterval: 3, // Delay in seconds
repeats: false // Whether to repeat (false = one-time only)
)
// 4. Create a notification request (requires a unique ID for later cancellation if needed)
let notificationRequest = UNNotificationRequest(
identifier: "SwiftMacNotification_001", // Unique identifier
content: notificationContent,
trigger: notificationTrigger
)
// 5. Add the request to the notification center and wait for triggering
notificationCenter.add(notificationRequest) { error in
if let error = error {
print("Notification delivery failed: \(error.localizedDescription)")
} else {
print("Notification added to queue; will trigger in 3 seconds")
}
}
}
}
}
We are implementing a camera intercom calling feature using VoIP Push notifications (PushKit) and LiveCommunicationKit (iOS 17.4+). The app works correctly when running in foreground or background, but fails when the app is completely terminated (killed by user or system). After accepting the call from the system call UI, the app launches but gets stuck on the launch screen and cannot navigate to our custom intercom interface.
Environment
iOS Version: iOS 17.4+ (testing on latest iOS versions)
Xcode Version: Latest version
Device: iPhone (tested on multiple devices)
Programming Languages: Objective-C + Swift (mixed project)
Frameworks Used: PushKit, LiveCommunicationKit (iOS 17.4+)
App State When Issue Occurs: Completely terminated/killed
Problem Description
Expected vs Actual Behavior
App State Behavior
Foreground ✅ VoIP push → System call UI → User accepts → Navigate to intercom → Works
Background ✅ VoIP push → System call UI → User accepts → Navigate to intercom → Works
Terminated ❌ VoIP push → System call UI → User accepts → App launches but stuck on splash screen → Cannot navigate
Root Issues
When app is terminated and user accepts the call:
Data Loss: pendingNotificationData stored in memory is lost when app is killed and relaunched
Timing Issue: conversationManager(_:perform:) delegate method is called before homeViewController is initialized
Lifecycle Confusion: App initialization sequence when launched from terminated state via VoIP push is unclear
Code Flow
VoIP Push Received (app terminated):
func pushRegistry(_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping () -> Void) {
let notificationDict = NotificationDataDecode.dataDecode(payloadDict) as? [AnyHashable: Any]
let isAppActive = UIApplication.shared.applicationState == .active
// Store in memory (PROBLEM: lost when app is killed)
pendingNotificationData = isAppActive ? nil : notificationDict
if !isAppActive {
// Report to LCK
try await conversationManager.reportNewIncomingConversation(uuid: uuid, update: update)
}
completion()
}
User Accepts Call:
func conversationManager(_ manager: ConversationManager, perform action: ConversationAction) {
if let joinAction = action as? JoinConversationAction {
// PROBLEM: pendingNotificationData is nil (lost)
// PROBLEM: homeViewController might not be initialized yet
if let pendingData = pendingNotificationData {
ModelManager.share().homeViewController.gotoCallNotificationView(pendingData)
}
joinAction.fulfill(dateConnected: Date())
}
}
Note: When user taps "Accept" on system UI, LiveCommunicationKit calls conversationManager(_:perform:) delegate method, NOT a manual acceptCall method.
Questions for Apple Support
App Lifecycle: When VoIP push is received and app is terminated, what is the exact lifecycle? Does app launch in background first, then transition to foreground when user accepts? What is the timing of application:didFinishLaunchingWithOptions: vs pushRegistry:didReceiveIncomingPushWith: vs conversationManager(_:perform:)?
State Persistence: What is the recommended way to persist VoIP push data when app is terminated? Should we use UserDefaults, NSKeyedArchiver, or another mechanism? Is there a recommended pattern for this scenario?
Initialization Timing: When conversationManager(_:perform:) is called with JoinConversationAction after app launch from terminated state, what is the timing relative to app initialization? Is homeViewController guaranteed to be ready, or should we implement a waiting/retry mechanism?
Navigation Pattern: What is the recommended way to navigate to a specific view controller when app is launched from terminated state? Should we:
Handle it in application:didFinishLaunchingWithOptions: with launch options?
Handle it in conversationManager(_:perform:) delegate method?
Use a notification/observer pattern to wait for initialization?
Completion Handler: In pushRegistry:didReceiveIncomingPushWith, we call completion() immediately after starting async reportNewIncomingConversation task. Is this correct, or should we wait for the task to complete when app is terminated?
Best Practices: Is there a recommended pattern or sample code for integrating LiveCommunicationKit with VoIP push when app is terminated? What are the best practices for handling app state persistence and navigation in this scenario?
Attempted Solutions
Storing pendingNotificationData in memory → Failed: Data lost when app is killed
Checking UIApplication.shared.applicationState → Failed: Doesn't reflect true state during launch
Calling gotoCallNotificationView in conversationManager(_:perform:) → Failed: homeViewController not ready
Additional Information
Singleton pattern: LCKCallManagerSwift, ModelManager
homeViewController accessed via ModelManager.share().homeViewController
Mixed Objective-C and Swift architecture
conversationManager(_:perform:) is called synchronously and must call joinAction.fulfill() or joinAction.fail()
Requested Help
We need guidance on:
Correct app lifecycle handling when VoIP push is received in terminated state
How to persist VoIP push data across app launches
How to ensure app initialization is complete before navigating
Best practices for integrating LiveCommunicationKit with VoIP push when app is terminated
Thank you for your assistance!
Topic:
App & System Services
SubTopic:
Notifications
In the main app, is there a way to distinguish whether the application:didFinishLaunchingWithOptions: method is triggered by the user manually clicking the app icon, or whether it is automatically triggered by the system after Live Activities receives a remote message notification?
Is there any information for developer about notification forwarding which is published in iOS 26.3? how to use it ?
I'm sending local push notifications and want to show specific content based on the id of any notification the user opens. I'm able to do this with no issues when the app is already running in the background using the code below.
final class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
let container = AppContainer()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
let center = UNUserNotificationCenter.current()
center.delegate = self
return true
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
container.notifications.handleResponse(response)
completionHandler()
}
}
However, the delegate never fires if the app was terminated before the user taps the notification. I'm looking for a way to fix this without switching my app lifecycle to UIKit.
This is a SwiftUI lifecycle app using UIApplicationDelegateAdaptor.
@main
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
I’m aware notification responses may be delivered via launchOptions on cold start, but I’m unsure how to bridge that cleanly into a SwiftUI lifecycle app without reverting to UIKit.
I a using the current RC version of iOS on both my iPhone and iPad. I and developing an iCloud based app and it works correctly on iOS 18. When I upgraded to iOS 26 the iCloud functions work correctly but the push notifications do not work.
The issue appears to be creating subscriptions. The following code should create a subscription and does not get an error, but it did to create a subscription under iOS 26.
func subscribeToNotifications(recordType: String,
subscriptionID: String, notification: CKSubscription.NotificationInfo) {
let subscriptionIDForType = "\(subscriptionID)-\(recordType)"
let predicate = NSPredicate(value: true)
let subscription = CKQuerySubscription(recordType: recordType, predicate: predicate, subscriptionID: subscriptionIDForType, options: [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion])
let notification = CKSubscription.NotificationInfo()
subscription.notificationInfo = notification
CKContainer.default().publicCloudDatabase.save(subscription) { (returnedSubscription, error) in
if let error = error {
print("Error saving subscription: \(error)")
} else {
print("Successfully saved subscription: recordType: " + recordType + " subscriptionID: " + subscriptionIDForType)
}
}
}
Print results:
Successfully saved subscription: recordType: folder subscriptionID: folderName-folder
Topic:
App & System Services
SubTopic:
Notifications
Tags:
CloudKit
User Notifications
iPad and iOS apps on visionOS
UIKit
sending the following POST request:
---- HTTP REQUEST ----
POST https://appleid.apple.com/auth/token
Headers:
Content-Type: application/x-www-form-urlencoded
Body:
client_id=au.com.thejlrguy.businesschat&client_secret=eyJhbGciOiJFUzI1NiIsImtpZCI6IktLUDc4MkhGVTcifQ.eyJ...QeDn7ug&grant_type=client_credentials&scope=https%3A%2F%2Fappleid.apple.com
Getting the below error:
{"error":"invalid_client"}
The private key used to sign the JWT was created 24 hours ago.
Hello,
I am writing this because the behavior of the App Store Server Notification that our server receives is problematic in the Sandbox environment.
I have two questions in total.
When purchasing a Free Trial subscription, after receiving the SUBSCRIBED / INITAL_BUY Notification, DID_RENEW should be sent when it expires, but DID_FAIL_TO_RENEW/GRACE_PERIOD is sent.
The EXPIRE Notification is sent after the subscription expires or DID_CHANGE_RENEWAL_STATUS/AUTO_RENEW_DISABLED is sent, but it does not arrive.
The first problem is that I recently heard that automatic payments after a free trial require the user's consent via email. Is this the reason?
If so, I am curious about how I can test it in the Sandbox environment.
Is the second problem a bug?
Topic:
App & System Services
SubTopic:
Notifications
Tags:
Subscriptions
In-App Purchase
App Store Server Notifications
Hi everyone,
I'm developing a custom Apple Wallet pass using a Django backend and exposing my local server through ngrok during development. For the first ~30 minutes, everything works exactly as expected: the pass registers correctly, silent push notifications trigger instant updates, Wallet immediately performs the GET request to fetch the new .pkpass, and the changeMessage displays almost instantly on the lock screen.
At some point, however, the pass stops updating entirely. Apple APNs continues to return 200 OK for every silent push I send, but the device never performs the required GET /v1/passes// call to download the updated pass. As a result, even the internal content of the pass (ex: points/balance fields) no longer updates, which confirms that Wallet is not fetching the new .pkpass at all. No changeMessage appears either.
This behavior has been described informally by other developers as Apple Wallet Pass Update Throttling, where the Wallet daemon begins ignoring silent pushes after repeated updates or certain internal conditions. I’m trying to confirm whether this is indeed throttling, what triggers it, and how to avoid it during development.
Hi everyone,
I recently migrated my individual Apple Developer account to an Organization account for my company "". My Team ID remained the same. I'm now facing persistent issues with code signing and push notifications for my iOS app (Bundle ID: com.).
Current Problems:
"Untitled" Certificates in Xcode: When I go to Xcode -> Settings -> Accounts -> [My Apple ID] -> Select "" Team -> "Manage Certificates...", a number of my newly created Apple Development and Apple Distribution certificates are listed древ "Untitled". Some older ones are "Revoked". (See attached screenshot if possible).
"No App ID" for Push Notifications Console: In my app target's "Signing & Capabilities" tab, I've added the "Push Notifications" capability. However, when I click the info button to open the "Push Notifications Console", it states: "no app IDs: Register an App ID with the Push Notifications capability enabled to use the Push Notifications console." This is despite the fact that the Push Notifications capability IS enabled for my App ID com. in the Developer Portal, and I've configured an APNs Auth Key (.p8) for it.
Push Notifications Not Received (from Backend): While I can successfully send a test push notification directly from the Firebase Console to my device's FCM token, notifications triggered by my backend (Firebase Cloud Functions writing to a Firestore collection, which then triggers another function to send via FCM) are not being delivered to iOS devices. (Android seems to be working more reliably now).
Setup:
Using an APNs Authentication Key (.p8) linked to my Organization Team ID in Firebase Cloud Messaging.
Main App ID com. has "Push Notifications" capability enabled.
Notification Service Extension com..ImageNotification also has its App ID and Provisioning Profile set up for the Organization team.
Created new Development and Distribution certificates and Provisioning Profiles specifically for the Organization team.
Using "Automatically manage signing" in Xcode with the Organization team selected for both the main app target and the extension target.
Troubleshooting Done:
Revoked old/problematic certificates and profiles.
Recreated CSRs and new Development/Distribution certificates under the Organization team multiple times.
Recreated Provisioning Profiles.
Cleaned Derived Data in Xcode.
Ensured Bundle Identifiers are consistent.
Verified APNs Auth Key details (Key ID, Team ID) in Firebase.
I suspect there's a fundamental issue with how Xcode is recognizing or linking the signing assets for my Organization team after the account type change, despite the Team ID being the same. The "Untitled" certificates are a major red flag.
Has anyone encountered similar issues, particularly the "Untitled" certificates or the "No App ID" message for the Push Console, after an account migration or when working with Organization accounts? Any insights on how to resolve this would be greatly appreciated.
Thanks,
Benni
Topic:
App & System Services
SubTopic:
Notifications
Tags:
APNS
Provisioning Profiles
Signing Certificates
Hi everyone,
We're experiencing an issue with our Flutter app that uses PushKit, CallKit, and Janus for handling VoIP calls. Everything works fine when the app is in the foreground, but when the app is in the background or completely closed (terminated state), the behavior is inconsistent:
Sometimes, incoming calls are received as expected.
Other times, the app does nothing, and the call is not delivered at all.
Upon checking the console logs, we noticed that our app is being canceled (terminated by the system), which seems to be the reason why calls are not coming through. This happens randomly, making it difficult to reproduce consistently.
Additional Details:
The app is configured to handle VoIP notifications correctly.
We are using PushKit to wake up the app and trigger CallKit for the incoming call UI.
When the app is active, calls are handled correctly via Janus WebRTC signaling.
We have verified that background modes for VoIP are enabled in the Info.plist.
We suspect that iOS may be aggressively killing the app in the background, preventing incoming call notifications from reaching it.
Questions:
Has anyone experienced similar behavior with PushKit + CallKit on recent iOS versions?
Could iOS be terminating the app due to background execution policies?
Are there recommended best practices to ensure reliable delivery of VoIP notifications when the app is closed?
Any insights or suggestions would be greatly appreciated!
Thanks!
Addional Information:
this is the cancellation information at console: Received incoming message on topic hiperme.app at priority 10
por omisión 17:10:18.462084-0300 dasd CANCELED: com.apple.pushLaunch.hiperme.app:E8BACD at priority 10
We are observing unexpected behavior in Apple Push Notification Service (APNS) delivery and would appreciate clarification and guidance. Below is a detailed
breakdown of the scenario and related questions.
Abbreviations:
APNP – Apple Push Notification Provider
APNS – Apple Push Notification Service
Scenario:
User1 is registered on iOS device1.
Flight Mode is enabled on iOS device1.
User2 initiates a call to User1 (Time t = 0 sec).
User2 cancels the outgoing call after 5 seconds (Time t = 5 sec).
Flight Mode is disabled on iOS device1 after 20 seconds (Time t = 25 sec).
Observation:
iOS device1 displays an incoming call notification (CallKit UI) after flight mode is turned off, despite the call being cancelled by User2.
This notification disappears automatically after approximately 8–10 seconds.
Logic Flow:
At time t = 0, our APNP sends a VoIP push (priority) to APNS for the incoming call.
Since device1 is in flight mode, APNS cannot deliver the push.
At t = 25 sec, after flight mode is turned off, APNS delivers the cached VoIP push to device1.
The app takes ~5 seconds to initialize (CSDK setup, SIP registration, etc.).
It eventually receives a SIP NOTIFY with state="full" and empty dialog info (indicating no active call).
Consequently, the CallKit incoming call is removed after ~8 seconds.
Questions:
→ We set the apns-expiration header to 0, expecting that the VoIP push would not be delivered if the device was unreachable when the push was sent. However, APNS still delivers the push 20–30 seconds later, once the device is back online.
Q. Why is the apns-expiration header not respected in this case?
→ Upon receiving the VoIP push, we require ~10–12 seconds to determine if a visible CallKit notification is still relevant (e.g., by completing SIP registration and checking for active dialogs).
Q. Is it acceptable, per Apple guidelines, to intentionally delay showing the CallKit UI (incoming call) for 10–15 seconds after receiving the VoIP push?
→ Apple documentation states that the priority VoIP push channel should be used only for notifying incoming calls, while regular (non-VoIP) pushes should be used for other updates, including call cancellations.
Q. What is the rationale behind discouraging the use of the priority VoIP push channel for call cancellation events? In some cases, immediate cancellation notification is as critical as the initial incoming call. Would Apple consider it acceptable to occasionally use the priority VoIP channel for rare call-cancellation scenarios without risking throttling or suspension?
→ In our implementation, we send an incoming call notification via the priority VoIP channel. Shortly after, we send a call cancellation notification on the regular push channel, marked with "content-available": 1. We expect this regular push to wake the app (triggering application:didReceiveRemoteNotification:fetchCompletionHandler:), but in practice the app never wakes, and our debug logs inside that delegate method never appear.
Q. Under what exact conditions does a "content-available": 1 regular push fail to wake the app when it follows a VoIP push? Are there additional requirements (e.g., background modes, rate limits, power optimizations) that could prevent the delegate from being called?
→ According to Apple documentation: “APNs stores only one notification per bundle ID. When multiple notifications are sent to the same device for the same bundle ID, APNs keeps only the latest one.” However, in our tests: If a device is offline when APNs receives both: (a) a priority VoIP push for an incoming call, (b) a regular push for call cancellation (same bundle ID), Upon the device reconnecting, APNs still delivers the earlier VoIP push, instead of discarding it and delivering only the most recent (cancellation) notification.
Q. Why doesn’t APNs replace the queued VoIP push with the newer regular push when both share the same bundle ID? Is this expected behavior due to channel type differences (VoIP vs. regular), or is there a way to ensure that the latest notification (even if regular) supersedes the earlier VoIP push?
We’d appreciate your input or recommendations on handling such delayed pushes and any best practices for VoIP push expiration handling and call UI timing.
Hello,
I am developing a calling service using CallKit and VOIP push.
I have occasionally encountered a strange issue.
The issue is that VOIP permanently fails to receive calls.
I was previously informed that even if the device is blocked, it can receive calls again after 24 hours.
Also, when I checked the device logic, it complied with the policy requirements set by Apple, including correctly calling CallKit's reportNewIncomingCall method.
Once the issue occurs, no matter how many times I try, VOIP does not receive calls, and neither a device reboot nor checking the Device Console Log shows any logs related to CallKit or VOIP.
I suspect this might be an issue with the VOIP token, and I believe that the only way to get a new one is to reinstall the app. Is that correct?
Of course, after reinstalling, it works fine again, but this is very inconvenient. I don't think this is the right solution.
Is there anyone who can share their insights on this issue?
Thank you.
手机型号:iPhone 13 Pro
iOS版本号:iOS 18.6.2 (22G100)
用户开启了应用的系统通知功能,在收到离线推送后应用右上角展示未读消息数。在APP启动或者从后台恢复的时候,应用会用如下方法清理应用桌面图标的未读数角标。但是在部分机型上,应用转为“后台模式”时仍然会出现一个未读角标,且每次都是一个固定值;如果直接kill进程就不会出现未读角标。请问如何能够【完全】清理消息未读数,确保不会在退后台的时候再次出现呢?
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
if (@available(iOS 16.0, *)) {
[[UNUserNotificationCenter currentNotificationCenter] setBadgeCount:0 withCompletionHandler:nil];
[[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
[[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
}
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.badge = @(-1);
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"clearBadge"
content:content
trigger:nil];
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request
withCompletionHandler:^(NSError * _Nullable error) {
// Do nothing
}];
Topic:
App & System Services
SubTopic:
Notifications
Hello,
We are trying to implement Actionable Notifications on iOS via Remote Notifications.
According to Apple’s official documentation (Declaring Your Actionable Notification Types),
it is recommended to register notification categories at launch time.
However, in our use case, the number of buttons and their actions in the Actionable Notification are determined at the time of the Remote Notification request.
This means that we cannot predefine the categories at app launch but need to dynamically configure them based on the payload of the Remote Notification.
Our Approach
We are considering setting aps.mutable-content = 1 and using Notification Service Extension to modify the categoryIdentifier dynamically.
Below is the JSON payload we plan to use for Remote Notifications:
{
"aps": {
"alert": {
"title": "New Message Received!",
"body": "Check out the details."
},
"category": "DYNAMIC_CATEGORY",
"mutable-content": 1
},
"categoryData": {
"id": "DYNAMIC_CATEGORY",
"actions": [
{
"id": "REPLY_ACTION",
"title": "Reply",
"options": ["foreground"]
},
{
"id": "DELETE_ACTION",
"title": "Delete",
"options": ["destructive"]
}
]
}
}
Questions:
Can we dynamically configure Actionable Notifications based on the Remote Notification payload?
If we set categoryIdentifier in Notification Service Extension’s didReceive(_:withContentHandler:), will users still see the correct action buttons even if the app is terminated?
What is the recommended approach to dynamically configure Actionable Notifications at the time of receiving the Remote Notification, rather than at app launch?
Hi Apple team,
We’re shipping a Live Caller ID Lookup extension on iOS 18 and have a question about the automatic refresh of configuration/PIR parameters.
Questions
1. Is there any documented interval/TTL (min/max) for the system’s automatic refresh of /config and PIR parameters, or is it entirely opportunistic (battery/network/usage)? I can’t find a cadence in the IdentityLookup docs.
2. Does iOS honor server cache headers (e.g., Cache-Control/Expires) to influence when it re-fetches?
3. Which events also trigger a refresh (enable/disable in Settings, OS/app update, device reboot, token/epoch change)?
4. Are there rate limits or best-practice limits for calling refreshExtensionContext and refreshPIRParameters?
Topic:
App & System Services
SubTopic:
Notifications
Tags:
Extensions
SMS and Call Reporting
CallKit