I am currently facing an issue when trying to enable Shortcut support and would greatly appreciate your assistance in resolving it.
I have successfully enabled Shortcut support, and I can find my app and its respective functionalities within the Shortcuts app. However, I am unable to locate my app when attempting to create an automation within Shortcuts. I would appreciate any guidance or solutions you may offer regarding this matter.
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
I need to display a different app name based on the user's region/language. This setup works correctly for regions like the United Kingdom, Australia. However, for Singapore, the app always falls back to the UK version (en-GB) instead of picking the localized name defined under en-SG. Interestingly, system alerts like location permission and app deletion do use the en-SG localization correctly.
Could you help identify why the app name isn't picking up the en-SG version and suggest how we can resolve this?
Hello,
I would like to ask if there is any possibility to invoke the Apple Sysdiagnose via an API call. I cannot find any API reference for Sysdiagnose.
I am aware only about the manually invocation. https://it-training.apple.com/tutorials/support/sup075/
However, this is pretty annoying since a reproduction of a hunted bug takes several hours, so I am looking for the way how to invoke Sysdiagnose from our code.
Hello!
I've been trying to get assessment mode working on my application. So far so good, seems to work on almost all of the laptops, except one. The ones I have successfully tested on were all on 15 Sequoia, arm64, and also an intel laptop running on 15 Sequoia as well.
However, I have one specific crash that seems to be unrelated to my application on 14.5 Sonoma, 2019 intel. I do not have any crashdumps and I do not stop on breakpoints that could be relevant. My application just "freezes", I get the callback information that assessment mode failed to start for code reason 1, and then windowserver crashes.
I do not see any crashdumps related to my application.
Maybe some of you have a specific idea what am I doing wrong? It's a bit interesting that It only happens on this device.
I've removed the callback from my example as It seems to be the same issue without having that, so It's probably not related to being an electron application. Entitlements are properly set, provision profile properly used.
// Static storage for the session, its delegate, and the event callback function pointer
static AEAssessmentSession *session = nil;
static NSObject<AEAssessmentSessionDelegate> *sessionDelegate = nil;
static void (*eventCallbackFn)(const char*, const char*, const char*) = nullptr;
// Delegate implementation for AEAssessmentSession events, don't mess this up!
@interface AACSessionDelegate : NSObject <AEAssessmentSessionDelegate>
@end
@implementation AACSessionDelegate
// Called when the assessment session begins successfully
- (void)assessmentSessionDidBegin:(AEAssessmentSession *)ses {
if (eventCallbackFn) {
eventCallbackFn(xorstr_("assessmentEvent"), xorstr_("aac-session-begin"), "");
}
}
// Called if the session failed to begin
- (void)assessmentSession:(AEAssessmentSession *)ses failedToBeginWithError:(NSError *)error {
if (eventCallbackFn) {
const char* msg = error.localizedDescription.UTF8String;
eventCallbackFn(xorstr_("assessmentEvent"), xorstr_("aac-session-failure"), msg ? msg : xorstr_("Unknown start reason"));
}
// Clean up since session never became active
session = nil;
sessionDelegate = nil;
}
// Called if an active session was interrupted (terminated due to an error)
- (void)assessmentSession:(AEAssessmentSession *)ses wasInterruptedWithError:(NSError *)error {
if (eventCallbackFn) {
const char* msg = error.localizedDescription.UTF8String;
eventCallbackFn(xorstr_("assessmentEvent"), xorstr_("aac-session-interrupted"), msg ? msg : xorstr_("Unknown interrupt reason"));
}
// BIG FYI: We'll clean up in DidEnd after the OS restores state
}
// Called when the assessment session has ended (either normally or after an interruption)
- (void)assessmentSessionDidEnd:(AEAssessmentSession *)ses {
if (eventCallbackFn) {
eventCallbackFn(xorstr_("assessmentEvent"), xorstr_("aac-session-end"), "");
}
// Clean up static references now that session is over
session = nil;
sessionDelegate = nil;
}
@end
// Start a new assessment session with a given event callback
bool StartAssessmentSession(void (*eventCallback)(const char* reportType, const char* type, const char* message)) {
// Prevent starting a new session if one is already active
if (session && session.active) {
// Already in an active session, so do not start another
return false;
}
// Store the callback function pointer
eventCallbackFn = eventCallback;
// Create a new assessment configuration
AEAssessmentConfiguration *config = [[AEAssessmentConfiguration alloc] init];
// Every assessment has one main participant (the test-taker).
AEAssessmentParticipantConfiguration *main = config.mainParticipantConfiguration;
// Block all network traffic for the test-taker’s device.
main.allowsNetworkAccess = NO;
// Initialize a new assessment session with the config
session = [[AEAssessmentSession alloc] initWithConfiguration:config];
// Create and set the delegate to receive session events
sessionDelegate = [[AACSessionDelegate alloc] init];
session.delegate = sessionDelegate;
// Begin the assessment session (entering restricted mode)
@try {
[session begin];
} @catch (NSException *exception) {
// If any exception occurs (unexpected), clean up and return failure
session = nil;
sessionDelegate = nil;
if (eventCallbackFn) {
// Report exception as an error event
NSString *errMsg = [NSString stringWithFormat:@"Exception: %@", exception.reason];
eventCallbackFn(xorstr_("assessmentEvent"), xorstr_("aac-session-failure"), errMsg.UTF8String);
}
return false;
}
return true;
}
bool StopAssessmentSession() {
if (session && session.active) {
[session end];
return true;
}
return false;
}
crash.txt
Topic:
App & System Services
SubTopic:
General
Tags:
Automatic Assessment Configuration
Debugging
Assessment
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.
Hello everyone,
I’d like to propose Sense & Store — a seamless integration between Safari and the App Store, powered by on-device AI, designed to understand what users are reading, searching, or selecting in Safari, and suggest relevant apps that match their current context or intention.
🔍 Key Idea:
“Sense” the user’s need through intelligent analysis of web content, then “Store” — offer the most relevant app, either already installed or available in the App Store.
🌟 Core Features:
• AI-powered context detection directly inside Safari
• Real-time app suggestions based on user intent
• Smart overlays when selecting text or data (e.g., phone numbers, emails, tools)
• Privacy-first: All AI runs on-device (Apple Neural Engine)
• Instant App Launch or Installation via StoreKit
✅ Examples:
• Reading an article on productivity? → Suggests Notion or Things.
• Looking up meditation tips? → Recommends Calm or Headspace.
• Selecting a phone number? → Offers CRM or spam blocker apps.
• Exploring code samples? → Suggests Pythonista or developer tools.
🔒 Privacy & Performance:
• 100% on-device intelligence (no data sent to servers)
• Follows Apple’s privacy framework
• Works with SafariKit + StoreKit + CoreML
⸻
I’m happy to provide a full prototype roadmap and technical architecture. Feedback and collaboration are welcome!
Would love to hear your thoughts — especially from developers who build for Safari, App Clips, or work with CoreML.
Thanks!
Jose Luiz Horta Barbosa Maurity Cruz - Apple lover...
There's a 128mb limit for donating items to core spotlight. As far as I understand, there's a warning that shows in the Xcode console when either approaching or hitting that limit. It would be great if there was an API to check the current status of available storage for QA purposes to see if we're either donating too much or can donate more. Thanks!
Environment: macOS 15.2 (24C101) with Xcode 16.2 (16C5032a)
Goal: I am trying to build a simple IMKInputController-based input method.
Problem: My .app bundle registers successfully and I can select it as an input source. When selected, it blocks keyboard input, but my handle method does not seem to execute or produce output. I have placed NSLog statements in my controller's init and handle methods.
Code for the controller:
import InputMethodKit
// The IMKTextInput protocol is provided by the framework.
// We don't need to define our own bridging protocol for this test.
public class HelloWorldController: IMKInputController {
public override init!(server: IMKServer!, delegate: Any!, client inputClient: Any!) {
super.init(server: server, delegate: delegate, client: inputClient)
NSLog("HelloWorldIME: Controller has been initialized.")
}
public override func handle(_ event: NSEvent!, client sender: Any!) -> Bool {
NSLog("HelloWorldIME: handle() method was called.")
// ================== FINAL FIX APPLIED HERE ==================
// 1. First, we ensure the client is a fundamental Objective-C object.
guard let clientObject = sender as? NSObject else {
NSLog("HelloWorldIME: Error - client object is not an NSObject.")
return false
}
NSLog("HelloWorldIME: Successfully cast client to NSObject.")
// 2. Now that we have an NSObject, we can safely check if it responds to the selector.
let selector = #selector(IMKTextInput.insertText(_:replacementRange:))
if !clientObject.responds(to: selector) {
NSLog("HelloWorldIME: Error - client object does not respond to the insertText selector.")
return false
}
NSLog("HelloWorldIME: Client responds to insertText. Preparing to insert text.")
// 3. Since we've confirmed it responds, we can now safely treat it as an IMKTextInput
// and call the method.
let client = clientObject as! IMKTextInput
let stringToInsert = "A"
let replacementRange = NSRange(location: NSNotFound, length: 0)
client.insertText(stringToInsert, replacementRange: replacementRange)
NSLog("HelloWorldIME: Called insertText with string '\(stringToInsert)'. Action complete.")
// ========================================================
return true
}
}
Hello I'm working on Live Caller ID Lookup implementation on my own pet-project, as I understood I need to create app and extension for this app. I also created test PIR-service. I did configure serviceURL, tokenIssuerURL and userTierToken. In My app I implemented following code
Task {
if LiveCallerIDLookupManager.shared.status(forExtensionWithIdentifier: "some-extension") == .disabled {
`//` Show an alert.
print("LiveCallerIDLookupManager is disabled")
}
do {
// Open Settings.
try await LiveCallerIDLookupManager.shared.openSettings()
} catch {
}
It does open Call settings, but I don't understand what should I do next.
Hi,
I would like to reset system window private picker alert with ScreenCapture kit. i can reset the ScreenCapture permission with tccutil reset ScreenCapture. but it does not reset the system window private picker alert. i tried deleting the application directory from container and it does not help. the system window private picker alert uses the old approval i gave and it does not prompt a new alert. How can i starta with fresh screencapture kit settings for an app in testing?
Thanks
I want to create a brush similar to a fountain pen, with a three-dimensional feel to the strokes and a distinct tip. Alternatively, is it possible to achieve this by modifying the configuration parameters of a fountain pen brush?
After a user has launched an App Clip Experience from Safari and is done with the activity that the App Clip provides – is there a way for the App Clip to programatically close itself so the user returns to Safari?
Hi Apple Developers,
I am currently working on a message filtering application and facing issues specifically with filtering RCS (Rich Communication Services) messages. To debug this, I created a sample app that consistently categorizes all incoming messages as "junk." However, the filtering behaviour is inconsistent and not functioning as expected.
Here are the key issues observed during testing on iOS versions 18.2.1 and 18.3:
Inconsistent Filtering Behavior:
When a message is received from an unknown number, it sometimes gets moved to the Junk folder momentarily but is then immediately moved back to the main Messages inbox.
In some cases, the message does not get moved to the Junk folder at all, despite the app returning the verdict as "junk."
Duplicate Contact Tiles:
The Messages app displays two separate conversation tiles for the same mobile number, which is unexpected behavior.
I have attached both a sample app and a screen recording that clearly demonstrates the issue. The recording shows that the app categorizes messages as junk, yet they still end up in the main Messages inbox.
For reference, my carrier partner is T-Mobile. Please let me know if you need any additional information to investigate this issue further.
Looking forward to your insights and guidance.
Best regards,
Rijul Singhal
Since iOS 18.3.1, In lower iOS versions it works fine though.
QLPreviewController shows a blank white screen instead of showing the document. Additionally, it does not display the 'Done' option at the top-right to close the view.
Presenting the QLPreviewController works fine to display the document, but for the second time, it renders the blank white screen as described.
While launching QLPreviewControllerView for the first time. I'm receiving the following message in the console and it displays the document.
LaunchServices: store (null) or url (null) was nil: Error Domain=NSOSStatusErrorDomain Code=-54 "process may not map database" UserInfo={NSDebugDescription=process may not map database, _LSLine=72, _LSFunction=_LSServer_GetServerStoreForConnectionWithCompletionHandler}
Attempt to map database failed: permission was denied. This attempt will not be retried.
Closing the QLPreviewController with the help of the 'Done' option from top-right or swipe to close triggers the following message in the console.
Connection to appex interrupted
AX Lookup problem - errorCode:1100 error:Permission denied portName:'com.apple.iphone.axserver' PID:1022 (
0 AXRuntime 0x00000001d2cd7758 _AXGetPortFromCache + 796
1 AXRuntime 0x00000001d2cdd02c AXUIElementPerformFencedActionWithValue + 700
2 UIKit 0x0000000258cdf488 7F0274D9-D3C9-3193-B606-1C74BE53B86C + 1537160
3 libdispatch.dylib 0x0000000101bb888c _dispatch_call_block_and_release + 32
4 libdispatch.dylib 0x0000000101bba578 _dispatch_client_callout + 20
5 libdispatch.dylib 0x0000000101bc2454 _dispatch_lane_serial_drain + 840
6 libdispatch.dylib 0x0000000101bc325c _dispatch_lane_invoke + 408
7 libdispatch.dylib 0x0000000101bd06fc _dispatch_root_queue_drain_deferred_wlh + 328
8 libdispatch.dylib 0x0000000101bcfd0c _dispatch_workloop_worker_thread + 580
9 libsystem_pthread.dylib 0x0000000225ea4680 _pthread_wqthread + 288
10 libsystem_pthread.dylib 0x0000000225ea2474 start_wqthread + 8
)
Trying to open he document again, Ultimately results in the white blank screen to be displayed with no options to close.
It displays the Navigation bar only for the fraction of time. Leading users to force close the app and start again.
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
I am working on a Flutter application which is use solely to collect data from a bluetooth low energy (BLE) peripheral and then upload the data to our cloud.
The application runs in the background 99% of the time after the initial login and BLE pairing which is causing us some issues.
After the Application is backgrounded it would work for a day to 2 days and then stop working. (What I mean with working is to download data from the BLE peripheral and then upload the data to our cloud). Once the data syncing has stopped it would take up to 12 hours until data starts flowing again.
I have read in a couple of places that iOS implements some sort of "budget/heuristics" when the application is running in the background to keep track of the application and when this "budget" is used up iOS will stop servicing the application until iOS decides that the application can run in the background again.
My question, is it possible via a enablement or some other mechanism to prevent iOS from blocking our application from running in the background to enable 24/7 periodic data uploads every 30 minutes.
We have implemented the following so far;
The data sync process is triggered from the BLE peripheral using a notification. This notification is sent every 30 minutes.
Each sync duration is currently 24 seconds on average, we are working on reducing this to below 10 seconds.
We implemented State Restoration to assist iOS in starting the application more efficiently.
We are considering using Silent Push Notifications from the Cloud to wake up the application when data hasn't synced in 6 hours.
Any assistance would be high appreciated.
Hello Apple development team, I have developed an App for screen time management, which mainly uses ScreenTimeAPI. Users can set certain Apps to be disabled during a certain period of time.
After the App is released, users often report that the settings do not take effect as expected. I have seen many developers on the forum reporting that the DeviceActivityMonitor extension sometimes does not trigger callbacks. Based on this background, I have the following questions:
Is it a known problem that the DeviceActivityMonitor extension sometimes does not trigger callbacks? If so, are there any means to avoid or reduce the probability of occurrence?
In addition to being killed by the system when the running memory exceeds (I just called some ScreenTimeAPI and accessed UserDefaults in the extension, which should not exceed the running memory), under what other circumstances will the DeviceActivityMonitor extension be killed by the system? Will it automatically recover after being killed? Will some callbacks be called when killing?
Does ManagedSettingsStore have a life cycle? How do you avoid conflicts when configuring the underlying operating mechanism of multiple stores?
This is a random problem. I have never encountered it during development and debugging, but users often report it.
thanks
Topic:
App & System Services
SubTopic:
General
Tags:
Family Controls
Device Activity
Managed Settings
I have two call directory extensions, each with InfoPlist.strings in en.lproj and nb.lproj directories. In these files I've defined CFBundleDisplayName for both locales.
These names are displayed under Settings -> Phone -> Call Blocking & Identification. On iOS 12.2 the names are displayed correctly in both Norwegian and English.
Testing on iOS 15.3 the English names are displayed even when device language is set to Norwegian.
Worth noting: When updating the English versions of CFBundleDisplayName this is immediately reflected in Call Blocking & Identification page with Norwegian device language.
As this feature requires a real device, I'm unable to test on iOS 13 and 14.
I am developing an app that can help users disable selected apps at a specified time, so that users can get away from their phones and enjoy real life.
Here is my data structure:
extension ActivityModel {
@NSManaged public var id: UUID
@NSManaged public var name: String
@NSManaged public var weeks: Data
@NSManaged public var weekDates: Data
@NSManaged public var appTokens: Data
}
Among them, weeks is of [Bool] type, indicating which weeks from Sunday to Saturday are effective; weekDates is of [[Date,Date]] type, indicating the effective time period; appTokens is of Set type, indicating the selected apps。
At the beginning, I will open a main monitor:
let deviceActivityCenter = DeviceActivityCenter()
do{
try deviceActivityCenter.startMonitoring(
DeviceActivityName(activityModel.id),
during: DeviceActivitySchedule(
intervalStart: DateComponents(hour: 0,minute: 0,second: 0),
intervalEnd: DateComponents(hour: 23,minute: 59,second: 59),
repeats: true
)
)
}catch {
return false
}
Since the time range may be different every day, I will start the sub-monitoring of the day every time the main monitoring starts:
override func intervalDidStart(for activity: DeviceActivityName) {
super.intervalDidStart(for: activity)
if activity.rawValue.hasPrefix("Sub-") {
ActivityModelManager.disableApps(
Tools.getUUIDFromString(activity.rawValue)
)
return
}
let weekIndex = Calendar.current.component(.weekday, from: .now)
let weeks = ActivityModelManager.getWeeks(activity.rawValue)
if weeks[weekIndex] {
let weekDates =
ActivityModelManager.getWeekDates(activity.rawValue)
let deviceActivityCenter = DeviceActivityCenter()
do{
try deviceActivityCenter.startMonitoring(
DeviceActivityName("Sub-" + activityModel.id),
during: DeviceActivitySchedule(
intervalStart: getHourAndMinute(weekDates[weekIndex][0]),
intervalEnd: getHourAndMinute(weekDates[weekIndex][1]),
repeats: false
)
)
}catch {
return
}
}esle {
return
}
}
I will judge whether it is main monitoring or sub monitoring based on the different activity names.
When the sub-monitor starts, I will get the bound application and then disable it:
static func disableApps(_ id : UUID){
let appTokens = ActivityModelManager.getLimitAppById(id)
let name = ManagedSettingsStore.Name(id.uuidString)
let store = ManagedSettingsStore(named: name)
store.shield.applications = appTokens
return
}
When the child monitoring is finished, I resume the application:
static func enableApps(_ id : UUID){
let name = ManagedSettingsStore.Name(id.uuidString)
let store = ManagedSettingsStore(named: name)
store.shield.applications = []
}
The above is my code logic.
When using DeviceActivityMonitorExtension, I found the following problems:
intervalDidStart may be called multiple times, resulting in several sub-monitors being started.
After a period of time, the monitoring is turned off.
The static methods enableApps and disableApps are sometimes not called
Topic:
App & System Services
SubTopic:
General
Tags:
Family Controls
Device Activity
Screen Time
Entitlements
I'm using FamilyActivityPicker to get consent for app/category management, which returns a FamilyActivitySelection object.
I serialize this FamilyActivitySelection object (just applicationTokens and categoryTokens) and pass it to my DeviceActivityMonitor extension via App Group UserDefaults. I am using the JSON encoder/decoder over PropertyList (though both seem to exhibit the same behavior).
After inspecting the FamilyActivitySelection object immediately after it's returned by FamilyActivityPicker in the main app, the application.bundleIdentifier property is consistently nil for every Application object within selection.applications. Similarly, category.localizedDisplayName is nil for ActivityCategory objects. This happens whether "Select All Apps" is used or if apps/categories are selected individually.
I understand that this is the intended behavior due to Apple's user privacy policies. I read on another post that my app can be provided with bundle identifiers and app names within Shield Configuration extensions and Device Activity Report extensions - I'm not sure which ones or how exactly to do this.
I am aware that I can use Label(applicationToken) SwiftUI view to display the app name/icon, but this doesn't give programmatic access to the bundleIdentifier string.
My app will not log or export these bundleIdentifiers outside of its sandbox. My goal is to create mappings to the FamilyActivitySelection with the publicly accessible bundleIdentifiers.
Any guidance, examples, or clarification on the intended workflow for this scenario would be greatly appreciated!