I have an iOS app with ExtensionFoundation. It runs well on my local device, but when I upload on the AppStore it gets rejected with:
Validation failed
Invalid Info.plist value. The value of the EXExtensionPointIdentifier key, AsheKube.app.a-Shell.localWebServer, in the Info.plist of “a-Shell.app/Extensions/localWebServer.appex” is invalid. Please refer to the App Extension Programming Guide at https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Action.html#/apple_ref/doc/uid/TP40014214-CH13-SW1. (ID: ae8dd1dd-8caf-4a48-9651-7a225faed4eb)
The Info.plist in my Extension is:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EXAppExtensionAttributes</key>
<dict>
<key>EXExtensionPointIdentifier</key>
<string>com.example.example-extension</string>
</dict>
</dict>
</plist>
so the Info.plist that causes the issue has been automatically generated by Xcode. I can access it as well, and it says:
{
"BuildMachineOSBuild" => "25A354"
"CFBundleDevelopmentRegion" => "en"
"CFBundleDisplayName" => "localWebServerExtension"
"CFBundleExecutable" => "localWebServer"
"CFBundleIdentifier" => "AsheKube.app.a-Shell.localWebServerExtension"
"CFBundleInfoDictionaryVersion" => "6.0"
"CFBundleName" => "localWebServer"
"CFBundlePackageType" => "XPC!"
"CFBundleShortVersionString" => "1.0"
"CFBundleSupportedPlatforms" => [
0 => "iPhoneOS"
]
"CFBundleVersion" => "1"
"DTCompiler" => "com.apple.compilers.llvm.clang.1_0"
"DTPlatformBuild" => "23A339"
"DTPlatformName" => "iphoneos"
"DTPlatformVersion" => "26.0"
"DTSDKBuild" => "23A339"
"DTSDKName" => "iphoneos26.0"
"DTXcode" => "2601"
"DTXcodeBuild" => "17A400"
"EXAppExtensionAttributes" => {
"EXExtensionPointIdentifier" => "AsheKube.app.a-Shell.localWebServer"
}
"MinimumOSVersion" => "26.0"
"NSHumanReadableCopyright" => "Copyright © 2025 AsheKube. All rights reserved."
"UIDeviceFamily" => [
0 => 1
1 => 2
]
"UIRequiredDeviceCapabilities" => [
0 => "arm64"
]
}
What should I do to be able to upload on the AppStore?
General
RSS for tagDelve into the world of built-in app and system services available to developers. Discuss leveraging these services to enhance your app's functionality and user experience.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Created
Hi!
For some reason my DeviceActivityReport sometimes fails to load. I've tried setting up a very simple mock views and displaying a report with a simple "Hello world" but even that won't work. It prints the following error message in the terminal but doesn't show anything else or any context as to what has gone wrong.
Failed to update the client's configuration: Error Domain=DeviceActivityReportService.ReportViewController.ClientError Code=2 "(null)"
It seems like the "makeConfiguration" method for the report isn't even being invoked. That may though just be an issue with printing messages in the extension.
Any help on what could be the issue, or even just a message that you're being the same thing would be greatly appreciated!
Hi,
I'm trying to add an extension to my app on iOS 26.
I've followed the instructions on https://developer.apple.com/documentation/extensionfoundation/adding-support-for-app-extensions-to-your-app
and made it as far as being able to launch the extension:
let monitor = try await AppExtensionPoint.Monitor(appExtensionPoint: .localWebServerExtension)
currentIdentity = monitor.identities.first
if let currentIdentity = currentIdentity {
let myConfig = AppExtensionProcess.Configuration(appExtensionIdentity: currentIdentity, onInterruption: { NSLog("extension was terminated") })
myProcess = try await AppExtensionProcess(configuration: myConfig)
myConnection = try myProcess?.makeXPCConnection()
}
None of these calls throw, and when I examine myProcess from inside that code, it seems to be normal (there's a pid, for example).
Yet the code inside my extension seems to not be executed: breakpoints are not triggered, NSLog() calls do not appear on the console. The onInterruption() callback is also not triggered, or at least it does not appear on the console either.
I've probably missed something obvious, but what could it be?
When an alarm is scheduled for 00:00, the system displays the fullscreen alarm interface twice.
After the second fullscreen view appears, both the “Stop” and “Snooze” buttons become unresponsive, but using the physical button (volume or power button) can dismiss the alarm and correctly trigger the StopIntent.
This behavior occurs consistently (100%), whether the system time is set normally or manually adjusted before the alarm triggers.
Environment:
Device: iPhone 14 Pro Max
iOS Version: 26.0
Reproducibility: 100%
Topic:
App & System Services
SubTopic:
General
I see many anti-theft apps already released in the App Store that have a feature to immediately play a loud sound when the charger gets unplugged.
I can't find an API to make it work if the app is backgrounded, which is the main point.
How can I achieve this?
Topic:
App & System Services
SubTopic:
General
I'm trying to fade in the sound used in my alarm app but currently there's no way to achieve this since the alarm sound loops and if i add a fade-in at the beginning of my audio, every time the audio loops the fadein happens.
Topic:
App & System Services
SubTopic:
General
Hi everyone,
I’m currently developing a parental control app that uses the Screen Time API (FamilyControls, ManagedSettings, DeviceActivity). I have a question regarding the customization limits of the Shield UI in ManagedSettingsUI.
From the documentation, I understand that we can customize the ShieldConfiguration (background color, blur style, icon, title, subtitle, button labels, etc.). However, I’d like to clarify a few points before finalizing the design:
1. Is it allowed (or technically possible) to display custom media content, such as videos, animations, or interactive elements, inside a custom Shield?
2. Are there limitations on the text length for the title and subtitle fields (e.g. maximum number of characters, multiline support, truncation behavior)?
3. Can the Shield be personalized per user (for example, showing a different title or color scheme based on user preferences or device state)?
4. Are there App Store Review restrictions or UI guidelines that define what a Shield should or should not contain (for instance, whether the Shield can resemble a mini-app experience)?
I want to ensure that the implementation fully complies with Apple’s technical and design expectations before submission.
Thanks in advance for any official clarification or best practices on how far we can go with Shield customization!
Best regards,
Ferdinand
Hello,
I would like to understand the update behavior for App Clips.
Let's consider a scenario where a user has an App Clip on their device from a previous interaction. If I, as the developer, then publish a new version of the App Clip to the App Store, what is the expected behavior?
My main questions are: Will the App Clip be automatically updated in the background? Or, is user action required to get the new version, for example, by deleting the old one and re-launching it from a Smart App Banner or QR code?
Any information on this process would be greatly appreciated.
Thank you.
Steps To reproduce:
Login to application and App has joined the PTC channel.
Push the application to background and Lock the device.
From the System UI press the talk button which will start transmit.
Audio Session has been activated and Audio unit has been initialised properly.
On terminator side no media is being played out.
Issue observed consistently on specific models which has configured audio codec with Stereo type.
More details are added : FB20281626
[Question] Inconsistent Call Directory number matching across regions (Japan, Taiwan, U.S.)
We’re developing a Call Directory extension and observed inconsistent number matching depending on carrier region and number format.
Environment
Device: iPhone (iOS 26.0)
Call Directory Extension: Custom implementation
Carrier A: Japan carrier SIM
Carrier B: Taiwan carrier SIM
Numbers added to Call Directory patterns:
+81 120 580 2XXX
+81 704 336 2XXX
Observed Behavior (Japan Carrier SIM)
Incoming call from +81 120 580 2XXX →
Caller name not displayed (Call Directory match failed).
Entering 0120 580 2XXX in the Phone app dialer → Name displayed correctly.
Incoming call from +81 704 336 2XXX →
Caller name displayed correctly.
Entering 070 4336 2XXX in the Phone app dialer → Name displayed correctly.
Observed Behavior (Taiwan Carrier SIM)
Entering +81 120 580 2XXX in the dialer →
Name not displayed until the call button is pressed.
Entering +81 704 336 2XXX in the dialer →
Name displayed immediately, before the call is placed.
Steps to Reproduce
For Japan carrier:
Use a device running iOS 26 with a Japanese SIM card.
Add the following numbers to the Call Directory extension:
+81 120 580 2XXX and +81 704 336 2XXX
Receive an incoming call from +81 120 580 2XXX → ❌ Caller name not displayed.
Open the Phone app and enter 0120 580 2XXX → ✅ Caller name displayed.
Receive an incoming call from +81 704 336 2XXX → ✅ Caller name displayed.
Open the Phone app and enter 070 4336 2XXX → ✅ Caller name displayed.
For Taiwan carrier:
7. Insert a Taiwan SIM card (keep the same Call Directory patterns).
8. Enter +81 120 580 2XXX → ❌ Name not shown until the call button is pressed.
9. Enter +81 704 336 2XXX → ✅ Name shown immediately.
Expected Result
For both numbers:
Caller name from Call Directory should display consistently:
a) On incoming calls.
b) When entering the full number in the dialer (before pressing call).
Behavior should be consistent across regions (Japan, Taiwan, United States).
Actual Result
Region / Carrier
Number Pattern
Incoming Call
Dialer (Local Format)
Japan
+81 120 580 2XXX
❌ Not shown
✅ Shown (0120 580 2XXX)
Japan
+81 704 336 2XXX
✅ Shown
✅ Shown (070 4336 2XXX)
Taiwan
+81 120 580 2XXX
N/A
❌ Not shown until call
Taiwan
+81 704 336 2XXX
N/A
✅ Shown immediately
Questions
How should numbers be formatted or stored in the Call Directory patterns so that they match both incoming calls and dialer input consistently across regions?
Are there region-specific number normalization rules (e.g., Japan’s 0-prefixed local dialing or Taiwan’s international format handling)?
Is there an official guideline or recommendation for formatting phone numbers in Call Directory extensions (e.g., E.164 vs local format) to ensure consistent matching?
Notes
The inconsistent behavior appears to be related to how iOS normalizes numbers per carrier region and local dialing conventions.
In Japan, incoming calls from mobile numbers starting with 070 match correctly, while 0120 (toll-free) fails unless entered in local format.
Unexpected behavior encountered when scanning NFC tags.
Imagine a link shortener web service where users can create lots of different URLs that are hosted on the same domain eg, https://short.com/unique-path
The service has optional App Clip capability -- users can select any of their links and have the service create an App Clip for the selected link(s).
Users can encode their URLs into NFC tags and have their customers scan NFC tags.
Let's take just two URLs for example:
https://short.com/foo
https://short.com/bar
The /foo link does have an App Clip associated with it while /bar does not have it. Each link has been encoded into appropriate NFC tag.
Expected behavior when scanning from an iPhone:
/foo -- shows an App Clip popup.
/bar -- shows a "Open in Safari" default notification.
What's actually happening
/foo -- opens App Clip poput with correct metadata (title, subtitle, image) which is totally expected behavior.
/bar (the one that doesn't have app clip associated with it) -- opens an App-Clip-like popup with the following error: CPSErrorDomainError 2 (see attachment below)
So for some reason when someone scans an NFC tag with a URL that is not an App Clip and never has been -- it always shows that error regardless whether the URL exists or does not exist. I've tried few different/random URLs (which don't have an App Clip associated with it) and all of them show the same error.
Additional details:
All links use the same domain and URL format: domain.com/path where path is a short string of random a-Z characters.
All App Clips are created at the same iOS app.
AASA is good: Cache and Debug -- both green.
This issue has happened to lots of users on lots of different iPhones and iOS'.
Since the issue's been happening to lots of different users on different iPhone(s)/iOS' no sysdiagnose is attached. Actually it works the same on every device/iOS we've tried.
Before submitting the issue, I've found few other developers reporting the same issue.
What's interesting though is none of the links I've went through comes with a definite answer and it seems like this issue just randomly comes and goes without any specific changes on the server and/or iOS app.
Dropping the links of similar issues below.
https://developer.apple.com/forums/thread/671433
https://developer.apple.com/forums/thread/665969
https://developer.apple.com/forums/thread/775316
https://developer.apple.com/forums/thread/764545
Hello everyone, I am trying to implement ScreenCaptureKit into my project, I am using MacOs 26 for the target version and followed this official project from apple regarding the screencapture kit. https://developer.apple.com/documentation/ScreenCaptureKit/capturing-screen-content-in-macos
I used the official exact code and implemented in my app, but the results are not good. The video look blurry, unclear, lost colors and its like 720p honestly.
The 1st video frame t is result when I integrate it in my app.
After that, I used another app ( which was built in electron, they were using screencapturekit as well ) and there results were a lot better. The 2nd video frame is when I recorded using their application. It appears as close to as system display
I tried multiple things, but no impressive results. For my purpose, I want to the final recorded video to be as good as the display quality of the system. I also applied .hdr local display and coronolicial, but no help with that as well. Changed codecs to .mov, .hevc, but still no help
Why is not the recoded video as high quality as the display
When I run this in a playground:
var meDate = Calendar.current.date(from: DateComponents(year: 2024, hour: 7, weekday: 3, weekdayOrdinal: 2))!
print(meDate)
I see:
2024-01-09 15:00:00 +0000
This seems correct to me.
jan 9th is the second Tuesday in 2024
I'm in the pacific TZ, 07:00 PDT matches 15:00GMT
But then I do this:
meDate = Calendar.current.date(bySetting: .weekday, value: 4, of: meDate)!
print(meDate)
and I see: 2024-01-10 08:00:00 +0000
I would have expected my hour value (7PST/15GMT) to have been preserved. Is there a way I can update weekday, but not lose my hour?
The documentation specifies that when Contacts framework returns unified contacts that each fetched unified contact object (CNContact) has its own unique identifier that’s different from any individual contact’s identifier in the set of linked contacts and that when refetching a unified contact, that this identifier should be used.
There is also an analogous identifier within the list of contactRelations, but each of these don't seem to corespondent to the unified contacts. For example, is a new contact (Sheryl Zakroff) is created in the simulator Contacts and their spouse is set to Hank Zakroff. However, the GUID created for the contactRelations identifier does not correlate to the original Hank Zakroff GUID and cannot be searched.
Is this a bug or what is the indent of the contactRelations identifier?
Here's a debug output of walking the unifiedContacts:
Name: Hank Zakroff
2E73EE73-C03F-4D5F-B1E8-44E85A70F170
- Other : (555) 766-4823
- Other : (707) 555-1854
Name: David Taylor
E94CD15C-7964-4A9B-8AC4-10D7CFB791FD
- Other : 555-610-6679
Name: Sheryl Zakroff
DE783BC8-7917-4138-93F6-3AF0FD4CE083
- Other : (707) 555-1854
- Spouse: <CNContactRelation: 0x60000000dd60: name=Hank M. Zakroff>
- 534B467D-CA00-46D3-897C-16EEA782C9CF
- Looking for ["534B467D-CA00-46D3-897C-16EEA782C9CF"]
[]
Hi, We are working to integrate the Live Caller ID Lookup feature into our app.
After submitting the request form via the link: https://developer.apple.com/contact/request/live-caller-id-lookup/, we received this reply from Apple:
Apple’s OHTTP relay has been configured to talk to your OHTTP gateway. Now Live Caller ID Lookup should work for your application extension when distributed through App Store.
However, before officially releasing our app on the App Store, we’d like to make sure the Live Caller ID Lookup feature is working as expected.
To test this, we uploaded the app to TestFlight, and it successfully passed App Review.
However, the test failed — we observed that the system tries to fetch the config from http://www.example.com/config instead of our actual configuration URL.
Questions:
Is this expected behavior when using TestFlight?
Does the Live Caller ID Lookup feature only become active after full public release on the App Store?
Is there any recommended way to test this feature before public release?
Thank you!
I’m seeing a strange behaviour when sending mail from my app with MFMailComposeViewController.
If the attachment is larger than about 3 MB, the message is created but then remains stuck in Outbox on my iPad running iPadOS 26.0.1.
If I open the stuck draft in Outbox and tap Send immediately, the message is sent successfully.
If I wait for a while before resending, the attachment shrinks to a few hundred bytes and the resend goes out without the file (I think the truncation is related to the MIME type, because it is not happening always).
This happens only on the iPad:
iPhone 16 on iOS 26.0.1 – message sends normally
iPhone XR on iOS 18.7.1 – message sends normally
iPad on iPadOS 26.0.1 – message remains stuck in Outbox with attachments over ~3 MB
Mail settings: default iCloud account (also tried explicit setPreferredSendingEmailAddress("…@icloud.com")), Low Power Mode and Low Data Mode are off.
Has anyone else encountered this behavior on iPadOS 26, or found a reliable workaround?
Here’s the minimal repro I’m using:
import UIKit
import MessageUI
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let mailComposer = MFMailComposeViewController()
mailComposer.setSubject("test")
mailComposer.setMessageBody("test", isHTML: false)
let repeatedString = String(repeating: "aaaaa aaaaa\n", count: 300000)
let data = repeatedString.data(using: .utf8)!
mailComposer.addAttachmentData(
data,
mimeType: "application/octet-stream",
fileName: "text.txt"
)
self.present(mailComposer, animated: true)
}
}
Topic:
App & System Services
SubTopic:
General
Hello,
I’m developing an app for both iOS and macOS using Mac Catalyst.
On the iOS target, the DeclaredAgeRange framework works fine: I enabled the capability, set the entitlement, and can call the APIs successfully.
However, when I build the Mac Catalyst target, I get compile-time errors because DeclaredAgeRange cannot be imported.
Environment
Xcode 26.0.1
Deployment Target (iOS): 13.0
Mac Catalyst target enabled (same bundle ID, same source code base as iOS version)
iOS build works well with DeclaredAgeRange
What I tried
Added the Declared Age Range capability in Signing & Capabilities for iOS target → works fine.
Tried setting Mac Catalyst Deployment Target to macOS 15.0+ and rebuilding → still failed to import.
Because it didn’t help, I reverted and removed the separate macOS target setting.
On Catalyst, the module simply isn’t available (import DeclaredAgeRange fails).
From Apple’s documentation, my understanding is that DeclaredAgeRange should also be supported on Mac Catalyst (SDK 26+). But in practice I cannot import it in my Catalyst build.
Questions
Is DeclaredAgeRange actually supported on Mac Catalyst right now?
If so, are there additional setup steps (capabilities, entitlements, provisioning, etc.) specific to Catalyst?
Has anyone successfully imported and used DeclaredAgeRange in a Catalyst project?
Any guidance or confirmation would be greatly appreciated.
Thanks in advance.
Topic:
App & System Services
SubTopic:
General
0
CoreText
TDecorationRun::CalculateGlyphIntersections(CGAffineTransform, TRun const&, double, double, std::__1::function<void (double, double)> const&) const + 1704
1
CoreText
TDecorationRun::CalculateGlyphIntersections(CGAffineTransform, TRun const&, double, double, std::__1::function<void (double, double)> const&) const + 1440
2
CoreText
void TDecorationRun::DrawDecorationRun<(anonymous namespace)::TRunAdapter>(CGContext*, (anonymous namespace)::TRunAdapter, (anonymous namespace)::TRunAdapter, double)::'lambda'(CGPoint, CGPoint)::operator()(CGPoint, CGPoint) const + 508
3
CoreText
TDecorator::DrawDecoration(TLineDrawContext const&, TLine const&, TInlineVector<DecorationOverride, 30ul> const*) + 2356
4
CoreText
TLine::DrawUnderlines(CGContext*) const + 104
5
CoreText
TLine::DrawGlyphs(CGContext*) const + 292
Since legacyScreenSaver is still the thing running screensavers we make, and it's still buggy, why won't they give us a new template for building screensavers that run in the new engine? And hopefully they don't require them to blend in with the desktop, because most of us don't want that. A wallpaper is a wallpaper, and a screensaver is a screensaver.
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString timeIntervalSinceReferenceDate]: unrecognized selector sent to instance 0x115fadbc0'
*** First throw call stack:
(0x1940bd8c8 0x1910097c4 0x194159838 0x19403a4f8 0x1940423a0 0x1e42cb9a8 0x1e42ce220 0x106f02c08 0x1080a461c 0x1080be2b0 0x1080acb2c 0x1080ad7b4 0x1080b9b00 0x1080b91a4 0x1eecdb3b8 0x1eecda8c0)
libc++abi: terminating due to uncaught exception of type NSException
InputAnalytics called timeIntervalSinceReferenceDate in dispatch_sync.The display issue of the call stack occurs in two stages: keyboard input analysis and folding the keyboard.
After adding protection to NSString, it can function normally, but I want to know the reason
#import "NSString+Safe.h"
@implementation NSString (Safe)
- (NSTimeInterval)timeIntervalSinceReferenceDate {
return 0;
}
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)date {
return 0;
}
@end