In third-party keyboard app, the app is crashed when call [[UIInputViewController textDocumentProxy] keyboardAppearance].
Environment)
iOS 26
crash dump call stack
Thread 0 Crashed: 0 libobjc.A.dylib 0x0000000198433008 objc_msgSend + 8
1 UIKitCore 0x00000001a1cea570 -[_UITextDocumentInterface _controllerState] + 68
2 UIKitCore 0x00000001a1ceaef0 -[_UITextDocumentInterface documentIdentifier] + 20
3 ThirtPartyKeyboardApp 0x0000000104aad190 -[NKBKeyboardViewController _updateThemeCenterAppearanceModeIfNeeds] + 56 (NKBKeyboardViewController.m:164)
Extensions
RSS for tagGive users access to your app's functionality and content throughout iOS and macOS using extensions.
Posts under Extensions tag
200 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Description :
Our app helps users connect to Wi-Fi hotspots. We are trying to adapt our code to iOS 26 Hotspot Authentication and Hotspot Evaluation application extensions.
When filtering hotspots in the filterScanList callback, we need to fetch support information from a remote server to determine which hotspots are supported. However, attempts to use URLSession or NWTCPConnection in the extension always fail.
When accessing a URL (e.g., https://www.example.com), the network log shows:
Error Domain=NSURLErrorDomain Code=-1003 "A server with the specified hostname could not be found."
When accessing a raw IP address, the log shows:
[1: Operation not permitted]
Interestingly, NWPathMonitor shows the network path as satisfied, indicating that the network is reachable.
Question:
Are there any missing permissions or misconfigurations on our side, or are we using the wrong approach? Is there an official recommended way to perform network requests from an NEHotspotEvaluationProvider extension?
If the extension uses manifest v3 and a background script in the form of a service worker, then in Safari it is not possible to open the background script debugging window. If I expand the Developer menu in Safari, there is nothing under Web Extension Background Data (or disappear after click), which is an error. In other browsers (Edge, Chrome, Opera, Firefox) this works correctly.
If I switch the background script back to non-persistent script mode, everything works fine and from the Developer menu and the Web Extension Background Data submenu I am able to open the background script debugging window for the extension. Am I doing something wrong?
I built a couple of app intents for macOS, which generally work great. However, I'm struggling with configuring an app intent that takes a parameter, so that it doesn't require the app to launch before presenting people with the list of options.
If the app is running and I run the intent in Spotlight, I can see the message defined by the intent's parameterSummary and I can select a parameter from the list of entities.
If the app is not running, it is launched first and only then the intent message fully populates in Spotlight and allows parameter selection.
What I've tried:
Support background or deferred mode in the intent.
Conformed the entities to IndexedEntity.
Conformed the entity query to EnumerableEntityQuery, implementing suggestedEntities and allEntities.
Conformed the entity query to EntityStringQuery.
Donated the intent to Spotlight on app launch.
Donated the entities to Spotlight on app launch, both using indexSearchableItems and indexAppEntities. Not sure if both are required or if the latter is just a more convenient version of the former.
Do I have to conform to or implement something else?
Do I need to work with an app intent extension? If so, would I put all app intent code into the extension instead of the main app?
Is this a system bug I should file?
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Tags:
Extensions
macOS
Core Spotlight
App Intents
We are observing an issue where the iOS Notification Service Extension (NSE) is terminated by the system during startup, before either didReceive(_:withContentHandler:) or serviceExtensionTimeWillExpire(_:) is invoked. When this occurs, the notification is delivered without modification (for example, an encrypted payload is shown to the user). System logs frequently contain the message “Extension will be killed because it used its runtime in starting up”.
During testing, we observed that CPU-intensive operations or heavy initialization performed early in the extension lifecycle — especially inside init() or directly on the main thread in didReceive often cause the system to kill the NSE almost immediately. These terminations happen significantly earlier than the commonly observed ~30-second execution window where the OS normally invokes serviceExtensionTimeWillExpire(_:) before ending the extension. When these early terminations occur, there is no call to the expiry handler, and the process appears to be forcefully shut down.
Moving the same operations to a background thread changes the behavior: the extension eventually expires around the usual 30-second window, after which the OS calls serviceExtensionTimeWillExpire(_:).
We also observed that memory usage plays a role in early termination. During tests involving large memory allocations, the system consistently killed the extension
once memory consumption exceeded a certain threshold (in our measurements, this occurred around 150–180 MB). Again, unlike normal time-based expiration, the system did not call the expiry handler and no crash report was produced.
Since Apple’s documentation does not specify concrete CPU, memory, or startup-cost constraints for Notification Service Extensions or any other extensions beyond the general execution limit, we are seeking clarification and best-practice guidance on expected behaviors, particularly around initialization cost and the differences between startup termination.
NSE Setup:
class NotificationService: UNNotificationServiceExtension {
static var notificationContentHandler: ((UNNotificationContent) -> Void)?
static var notificationContent: UNMutableNotificationContent?
static var shoudLoop = true
override func didReceive(_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
NotificationService.notificationContentHandler = contentHandler
NotificationService.notificationContent =
request.content.mutableCopy() as? UNMutableNotificationContent
NotificationService.notificationContent!.title = "Weekly meeting"
NotificationService.notificationContent!.body = "Updated inside didReceive"
// Failing scenarios
}
override func serviceExtensionTimeWillExpire() {
NotificationService.shoudLoop = false
guard let handler = NotificationService.notificationContentHandler,
let content = NotificationService.notificationContent else { return }
content.body = "Updated inside serviceExtensionTimeWillExpire()"
handler(content)
}
}
Currently I am not finding any API to read the status of Message Filter Extension from settings. Are we planning for any future releases ?
I’m testing remote push notifications on macOS, and although notifications are received and displayed correctly, my Notification Service Extension (NSE) never gets invoked.
The extension is properly added as a target in the same app, uses the UNNotificationServiceExtension class, and implements both didReceive(_:withContentHandler:) and serviceExtensionTimeWillExpire(). I’ve also set "mutable-content": 1 in the APNS payload, similar to how it works on iOS — where the same code correctly triggers the NSE. On macOS, however, there’s no sign that the extension process starts or the delegate methods are called.
import UserNotifications
class NotificationService: UNNotificationServiceExtension {
override func didReceive(_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
let modified = (request.content.mutableCopy() as? UNMutableNotificationContent)
modified?.title = "[Modified] " + (modified?.title ?? "")
contentHandler(modified ?? request.content)
}
override func serviceExtensionTimeWillExpire() {
// Called if the extension times out before finishing
}
}
And the payload used for testing:
{
"aps": {
"alert": {
"title": "Meeting Reminder",
"body": "Join the weekly sync call"
},
"mutable-content": 1
},
"MEETING_ORGANIZER": "Alex Johnson"
}
Despite all correct setup steps, the NSE never triggers on macOS (while working fine on iOS).
Can anyone confirm whether UNNotificationServiceExtension is fully supported for remote notifications on macOS, or if additional configuration or entitlement is needed?
Hi,
I’m trying to implement the new PhotoKit PHBackgroundResourceUploadExtension. I created the extension, enabled full photo library access in the host app, and registered the extension point using the string: com.apple.photos.background-upload.
However, when I attempted to enable the extension with:
try library.setUploadJobExtensionEnabled(true)
I received the following error:
Error Domain=PHPhotosErrorDomain Code=-1 "(null)"
This happens when running the app on Xcode 26.1 and 26.2 Beta, using the iPhone 17 Pro Max simulator (iOS 26.1 and 26.2).
My question is: Is this extension supported on the simulator?
I’m asking because at the moment it’s difficult for me to test this on a physical device.
Also, What's the meaning of the error?
Thanks.
Are we planning to have some APIs or methods to know that status of Call blocking extension and message filter extension in future releases as currently it is not available.
I'm making a PoC for Visual Intelligence integration in iOS. It's a very simple setup... the extension will always reply with a couple of static "results" just so I can verify that it's working and figure out how to handle receiving app activation from the Intents framework.
The app seems to be registering the VI intent correctly, because I see my app's name in the tab list of providers for search results, but when I select my app, I always get no results. I looked at the console for the moment I'm selecting my app and seeing this error:
error 16:37:09.433057-0600 duetexpertd [com.hairlessape.VisualIntelligenceProvider.VIAppIntent] Unable to get connection interface: Error Domain=LNConnectionErrorDomain Code=1100 "Unable to locate `com.hairlessape.VisualIntelligenceProvider.VIAppIntent` for the `com.apple.appintents-extension` extension point"
No amount of web searching or AI interrogation has produced any headwind here. I've checked the build product and I can see the VIAppIntent.appex file in the Extensions\ folder of my app bundle.
I've triple checked the bundle identifiers, code file membership, installed the app from an IPA, restarted my phone, etc. I cannot get my intent to be queried and it's very frustrating.
I've put the PoC project on Github: https://github.com/JoshuaSullivan/VisualSearchForVI
We have a Share Extension that fails in Photos on macOS when trying to share a JPEG image for the following reason:
From the NSItemProvider we get from the NSExtensionItem.attachments, we try to load the image using loadFileRepresentation(forTypeIdentifier: “public.image”, completionHandler: …). This fails for .jpeg images in the library. There seems to be a mismatch in expected and actual file extension internally. Here is the log:
Error copying file type public.image. Error: Error Domain=NSItemProviderErrorDomain Code=-1000 "Cannot load representation of type public.jpeg" UserInfo={NSLocalizedDescription=Cannot load representation of type public.jpeg, NSUnderlyingError=0x1527c1a80 {Error Domain=NSItemProviderErrorDomain Code=-1 "Cannot copy file at URL file:///Users/frank/Library/Containers/com.apple.Photos/Data/tmp/TemporaryItems/ShareKit-Exports/7CCFA760-AAC9-42B0-812D-68F051ED1543/F912E593-2BE5-4E70-86AB-7657A40657E5/IMG_3517.jpg." UserInfo={NSLocalizedDescription=Cannot copy file at URL file:///Users/frank/Library/Containers/com.apple.Photos/Data/tmp/TemporaryItems/ShareKit-Exports/7CCFA760-AAC9-42B0-812D-68F051ED1543/F912E593-2BE5-4E70-86AB-7657A40657E5/IMG_3517.jpg., NSUnderlyingError=0x152789670 {Error Domain=NSItemProviderErrorDomain Code=-1 "Cannot create a temporary file. Error: Undefined error: 0" UserInfo={NSLocalizedDescription=Cannot create a temporary file. Error: Undefined error: 0}}}}}```
In the specified folder, there is an image, however, it’s named IMG_3517.jpeg, not IMG_3517.jpg. This seems to be a bug in Photo’s item provider implementation.
If we use loadObject(ofClass: URL.self, completionHandler: …) instead, we get the correct .jpeg URL in the completion handler.
Both follow the same pattern: show the image that is being shared along with a CTA button about doing something with it in their app. When you tap the button, their app opens. Is there some kind of magic conditions that tapping the button creates that makes extensionContext.open(_ URL: URL, completionHandler: ((Bool) -> Void)?) accept a URL for opening the app? Or are they just using the "walk the responder chain" hack and using the user's intent to do something in their app as sufficient justification for using it?
I've tried opening a registered URL scheme for my app synchronously with the button tap, but it still is refusing to open (callback returns false).
Is there a way to prevent or handle our application's crash if a third-party library makes a bad memory access? Basically, I want to know if using a buggy library (that causes bad memory access) will automatically make our application inherit those crashes, leading to our app crashing as well. If there is a way to prevent the crash, what methods can be used to do so?
Thread 13: EXC_BAD_ACCESS (code=1, address=0x3a7d300)
When my Share Extension receives an image from the macOS Photos app on Tahoe, the NSItemProvider passes a URL to an image file in a temporary location.
All attempts to read that file fail silently, such as with NSImage(contentsOfFile)
I can see that the file does exist in Finder.
This code did work in previous macOS versions.
It seems like a permissions issue, but startAccessingSecurityScopedResource had no effect.
Other platforms work, other apps work, such as shares from Finder, which shares via data instead of a url.
I'm really stuck. Has anyone else run into this?
// make sure provider has a conforming item
if itemProvider.hasItemConformingToTypeIdentifier(imageType)
{
do {
let data = try await itemProvider.loadItem(forTypeIdentifier: imageType, options: nil)
// data may be image NativeImage, Data, or a URL to an image file.
// figure out which by casting, then attempt to load uiImage
if let image = data as? NativeImage {
print("found NativeImage")
self.images.append(image)
}
else if let data = data as? Data {
print("found Data")
if let image = NativeImage(data: data) {
self.images.append(image)
}
} else if let url = data as? URL{
print("found URL")
if let image = NativeImage(contentsOfFile: url.path) {
print("loaded from URL")
self.images.append(image)
}
}
}catch{
print("⛔️ Share Extension Error: \(error.localizedDescription)")
}
}
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?
We are working with two types of wallet passes. Provisioning works successfully for one pass type via wallet extensions, but the same process is not functioning for the other. For the second pass type, we are able to generate the required data for pull provisioning and send it to Apple. Additionally, in-app push provisioning for this pass type completes without issue. We would appreciate guidance on how to further debug and resolve this provisioning problem.
We have updated the PNO metadata to include the associatedApplicationIdentifiers for our wallet extensions and the issuer app. While we are able to successfully provision the card to Apple Wallet via pull provisioning, we are unable to retrieve the payment passes that have already been provisioned. How can we address this issue?
let passLibrary = PKPassLibrary()
let paymentPassLibrary = self.passLibrary.passes(of: .secureElement)
paymentPassLibrary is an empty array even though we have passes provisioned.
1.May I ask if the Background Upload can run normally in the Release version of ios 26.1? I used the Release version of ios 26.1 for debugging and found that the background upload couldn't be triggered for a long time.
I debugged in ios 26.2 and found that background upload could be triggered normally, but kept triggering an Error: "Error returned from daemon: error Domain=com.apple.accounts Code=7 "(null)"
Hi everyone,
I’m developing a React Native iOS app that includes a custom keyboard extension for sending stickers across apps. The project builds successfully, and the main app installs fine on my test device.
However, I’m not seeing the keyboard extension appear under Settings → General → Keyboard → Keyboards → Add New Keyboard, which means I can’t activate it or grant access. At this point, I’m not even sure if the extension is actually being installed on the device along with the main app.
Here’s what I’ve done so far. I created a Keyboard Extension target in Xcode, set the correct bundle identifiers and provisioning profiles, and enabled “Requests Open Access” in the extension’s Info.plist. I built and installed the app on a physical device rather than the simulator to ensure proper testing.
My main questions are: how can I confirm that the extension is being installed on the device, and if it isn’t, what might prevent it from installing even though the build completes successfully?
Any insights, troubleshooting steps, or guidance would be greatly appreciated.
Hello!
Ive been working on a package tracking app for iOS and was looking forward to pushing it to TestFlight for some testers to use. When I go to archive the package, I get a warning about the "...TrackerIntents.appex is an ExtensionKit extension and must be embedded in the parent app bundle's Extensions directory, but is embedded in the parent app bundle's Tracker.app/Extensions directory". The extension is for siri integration with shortcuts.
I have done quite a lot of things to try and diagnose this but cant seem to get passed this warning. I know it's a warning but would rather it not exist. Ideally I would think its a matter of "moving" the items but in the navigation area, I dont see an extensions area.
The main app target has it in the dependencies along with the EmbedExtensionKit Extensions in the Build Phases.
Any ideas or configs I can try? I can provide more information if needed.
This is on the latest Xcode version 26.0.1 for iOS 26.
Thank you.