Hi,
I am trying to implement a PHBackgroundResourceUploadExtension to upload backup media files to an external cloud service based on these docs: https://developer.apple.com/documentation/PhotoKit/uploading-asset-resources-in-the-background#Acknowledge-completed-jobs
Creating jobs and actual uploading is working as expected, but the problem I have is in the acknowledgeCompletedJobs() function.
When trying to access a job's resource, the resource is nil and thus has empty assetLocalIdentifier and originalFilename.
Did anybody successfully implement this extension or knows, why this would happen? Because the resource of an acknowledgable job is empty, I can not match it back to my processed assets.
Extensions
RSS for tagGive users access to your app's functionality and content throughout iOS and macOS using extensions.
Posts under Extensions tag
181 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I developed a cloud drive using fskit, but after mounting it, it did not appear in the Finder sidebar and the disk tool could not list it. How should I adapt?
The mounting looks successful, and you can also open and see the fixed files I wrote in the code.
I have also turned on the Finder sidebar settings function
Topic:
App & System Services
SubTopic:
Core OS
Tags:
Files and Storage
Extensions
Disk Arbitration
FSKit
Hi,
I am trying to implement a PHBackgroundResourceUploadExtension to upload backup media files to an external cloud service based on these docs: https://developer.apple.com/documentation/PhotoKit/uploading-asset-resources-in-the-background#Acknowledge-completed-jobs
Creating jobs and actual uploading is working as expected, but the problem I have is in the acknowledgeCompletedJobs() function.
When in this function, I am trying to access a job's resource. The resource is nil and thus has empty assetLocalIdentifier and originalFilename.
Did anybody successfully implement this extension or knows, why this would happen? Because the resource of an acknowledgable job is empty, I can not match it back to my processed assets.
From watching the video on App Attest the answer would appear to be no, but the video is a few years old so in hope, I thought I would post this question anyway.
There's several scenarios where I would like a notification service extension to be able to use App Attest in communications with the back end(for example to send a receipt to the backend acknowledging receipt of the push, fetching an image from a url in the push payload, a few others).
Any change App Attest can be used in by a notification service extension?
I have gotten all necessary entitlements for all my extensions,
Environment:
iOS 26.4 beta
Xcode 26.4 beta
Framework: AccessoryNotifications, AccessorySetupKit, AccessoryTransportExtension
Description:
I'm implementing notification forwarding to a custom BLE accessory using the new AccessoryNotifications framework in iOS 26.4. I've set up an AccessoryDataProvider
extension following the documentation, but I'm unclear about how the data is actually transmitted to the BLE accessory.
Current Implementation:
Main App - Uses AccessorySetupKit to discover and pair accessories:
let descriptor = ASDiscoveryDescriptor()
descriptor.bluetoothServiceUUID = CBUUID(string: "FEE0")
let displayItem = ASPickerDisplayItem(
name: "Notification Accessory",
productImage: UIImage(systemName: "applewatch")!,
descriptor: descriptor
)
accessorySession.showPicker(for: [displayItem]) { error in
// Handle error
}
AccessoryDataProvider Extension - Implements NotificationsForwarding.AccessoryNotificationsHandler:
@main
struct AccessoryDataProvider: AccessoryTransportExtension.AccessoryDataProvider {
@AppExtensionPoint.Bind
static var boundExtensionPoint: AppExtensionPoint {
Identifier("com.apple.accessory-data-provider")
Implementing {
AccessoryNotifications.NotificationsForwarding {
NotificationHandler()
}
}
}
}
// NotificationHandler sends messages via:
let message = AccessoryMessage {
AccessoryMessage.Payload(transport: .bluetooth, data: data)
}
try await session?.sendMessage(message)
Info.plist Configuration:
EXExtensionPointIdentifier
com.apple.accessory-data-provider
NSAccessorySetupBluetoothServices
FEE0
Questions:
What BLE Service and Characteristic should the accessory advertise?
- The documentation mentions specifying transport: .bluetooth, but doesn't explain what Service/Characteristic the accessory needs to implement to receive the
notification data.
2. How does AccessoryMessage with transport: .bluetooth actually transmit data?
- Is there a specific Apple-defined BLE protocol?
- Does the accessory need to run specific firmware or support a particular protocol stack?
3. Is there any documentation about the accessory-side implementation?
- The iOS-side documentation is clear, but I couldn't find information about what the BLE peripheral needs to implement.
4. Is MFi certification required for the accessory?
- The documentation doesn't explicitly mention MFi, but it's unclear if custom third-party accessories can use this framework.
Any guidance on how the BLE communication works under the hood would be greatly appreciated.
Hi!
We’ve had Live Caller ID Lookup in production for a while. We’re seeing backend RPS on our /queries endpoint much higher than our expected incoming call volume.
While testing with Console.app during an incoming call, it looks like iOS may still hit our service even when the caller number is already in the user’s Contacts - but I’m not 100% sure from logs alone.
Can you confirm:
Does iOS invoke Live Caller ID Lookup (i.e. call /queries) for every incoming call, including calls from saved Contacts?
If yes, is this simply expected framework behavior?
Thanks!
Hello Apple team,
We would like to access the user's available purchases from the keyboard extension.
Making purchases directly from the keyboard is a great benefit, but we assume it is intentionally disabled to prevent abuse or fraudulent purchase attempts.
What we care about the most is determining if the user has an item that contains a discount or a free trial to personalize messaging when we suggest the user go to the app and make a purchase.
We hope you'd consider revising your policy around StoreKit usage.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
Extensions
StoreKit
In-App Purchase
When you have multiple Apps on the Mac which all provide Quicklook extensions for the same file type, then I would assume that if I activate one of these Quicklook extensions in the system settings, this one would be used.
But this doesn't seem to be the case.
It looks like the macOS just looks the very first extension it can find for a certain file type, and if this Quicklook extension is switched off, the file can not be previewed anymore. The macOS just doesn't bother to look for the other existing quicklook extension for this file, even if this other is enabled.
The only option right now to get this other extension to be used by the system would be to completely delete the first App, so its extension is deleted as well.
Is this really the way how it is supposed to work? How can this be fixed? Can I tell my users something else than "just delete the other App"?
Hi,
On macOS 26.4 Beta (25E5218f) (macOS Tahoe 26 Developer Beta ), the network filter causes network failures or slowdowns. This manifests as Chrome failing to access websites, while Safari can access the same websites without issue. The affected websites can be pinged locally.
My situation is similar to this situation.The same question link is: https://github.com/objective-see/LuLu/issues/836
Have you been paying attention to this issue? Hopefully, it can be fixed in the official release.
Thank you.
While implementing the new background backup feature introduced in iOS 26.1, I create a PHAssetResourceUploadJob in an Extension. On iOS 26.1, the system successfully triggers the upload. However, on iOS 26.2, although the job is created successfully and all related configurations are correctly set, the system does not trigger the upload.
Could you please help confirm the cause of this issue? Thank you.
I'm trying to test the update process for an app containing an FSKit module that I'm distributing on the Mac App Store. (I'm also distributing the same app directly with Developer ID, but here I'll focus on App Store because that's the behavior I've been looking at first.) To do that I'm using an internal tester group on TestFlight and then testing an update with TestFlight. Below is the behavior I'm seeing on macOS 15.7.2 (24G325).
I've noticed that if an app update is triggered while a disk is mounted using the FSKit extension, the disk is automatically unmounted without warning (FB21287341). That's already undesirable itself in my opinion, but on top of the unmount, there are two other problems:
That unmount doesn't seem to be a "clean" unmount and doesn't call functions like synchronize (FB21287688). Now, in my case, my app only provides read-only access, so that doesn't actually matter much in my case. However, I'd imagine if I were to add write access at some point in the future, this would go from "doesn't matter" to "very bad."
I've seen a few cases where quitting or crashing the FSModule process while a volume is mounted without actually doing a clean unmount causes a lot of "disk-related actions" (for lack of a better term) to freeze (FB21305906). For example, a use of the mount(8) command or trying to mount a disk at all freezes, and opening Disk Utility stalls on a "Loading disks" spinning indicator. This happens until the Mac is rebooted. I did notice this issue once while testing updates via TestFlight a few times.
The same applies if I simply delete the app with Finder instead of updating it.
Is there a way to prevent the extension's process from terminating in this case and/or another workaround I could use without waiting for a macOS update to hopefully change this behavior?
And does observing this kind of behavior with TestFlight's update behavior suggest the same thing could happen on the App Store with its automatic updates? I'm concerned that pushing an update via the App Store will unexpectedly unmount disks or cause the system-wide issues described in FB21305906 at a random time, which is a pretty big disruption for users.
We use Jamf Blueprint to deploy the managed app and identity to the iOS device (iOS 26.3 installed). Our managed app can access the identity via
let identityProvider = ManagedAppIdentitiesProvider()
let identity: SecIdentity
do {
identity = try await identityProvider.identity(withIdentifier: "myIdentity")
} catch { }
However, the app extension cannot access the same identity. Our app extension is notification extension that implemented UNNotificationServiceExtension APIs. We use above code in didReceive() function to access identity that always failed.
The MDM configuration payload is:
"AppConfig": {
"Identities": [
{
"Identifier": "myIdentity",
"AssetReference": "$PAYLOAD_2"
}
]
},
"ExtensionConfigs": {
"Identifier (com.example.myapp.extension)": {
"Identities": [
{
"Identifier": "myIdentity",
"AssetReference": "$PAYLOAD_2"
}
]
}
},
"ManifestURL": "https://example.net/manifest.plist",
"InstallBehavior": {
"Install": "Required"
}
}
Is there any problem in our MDM configuration? Or the notification extension cannot integrate with ManagedApp FM?
Apple is encouraging VPN apps on macOS to transition to Network Extension APIs, if they haven't done so yet, see:
TN3165: Packet Filter is not API
WWDC25: Filter and tunnel network traffic with NetworkExtension
Using Network Extension is fine for VPN apps that are distributed via the Mac App Store. Users get one pop-up requesting permission to add VPN configurations and that's it.
However, VPN apps that are distributed outside of the App Store (using Developer ID) cannot use Network Extension in the same way, such apps need to install a System Extension first (see TN3134: Network Extension provider deployment).
Installing a System Extension is a very poor user experience. There is a pop-up informing about a system extension, which the user has to manually enable. The main button is "OK", which only dismisses the pop-up and in such case there is little chance that the user will be able to find the correct place to enable the extension. The other button in that pop-up navigates to the correct screen in System Settings, where the user has to enable a toggle. Then there is a password prompt. Then the user has to close the System Settings and return to the app.
This whole dance is not necessary for VPN apps on the Mac App Store, because they work with "app extensions" rather than "system extensions".
As a developer of a VPN app that is distributed outside of the App Store, my options are:
Implement VPN functionality in an alternative way, without Network Extension. This is discouraged by Apple.
Use a System Extension with Network Extension. This is going to discourage my users.
I have submitted feedback to Apple: FB19631390.
But I wonder, why did Apple create this difference in the first place? Is there a chance that they will either improve the System Extension installation process or even allow "app extensions" outside of the Mac App Store?
Topic:
App & System Services
SubTopic:
Networking
Tags:
Extensions
Network Extension
System Extensions
Developer ID
Hello Apple Developer Community,
I currently have a Safari Web Extension on iOS that blocks certain URLs for users. I would like to provide the same functionality for Chrome on iOS.
I understand that Chrome on iOS uses WebKit under the hood, and Safari Web Extensions can run in Safari, but I am unsure whether there is any way to implement URL blocking in Chrome for iOS—either via an extension, API, or other supported mechanism.
Specifically, I’m looking for guidance on:
Whether any browser extension (Safari, Chrome, or otherwise) can intercept or block web requests in Chrome on iOS.
If not, what Apple-supported alternatives exist for implementing URL-blocking functionality for users of Chrome on iOS.
Any best practices for maintaining a cross-browser URL-blocking solution for iOS users.
I want to make sure my approach is aligned with Apple’s policies and platform capabilities. Any guidance or official references would be greatly appreciated.
Thank you!
I am trying to sign my Mac app to use Network Extensions capability. But every time I create a profile it displays that to me:
on the other hand on the website it displays this to me:
Hi!
I'm building a Screen Time management app using FamilyControls and ManagedSettings. When a user taps the primary button on a ShieldActionExtension, I need to open my main app to guide them through an intervention exercise.
Other approved App Store apps like Jomo - Screen Time Blocker do exactly this: tapping their shield's primary button opens the main Jomo app directly.
Screen recording: https://drive.google.com/file/d/15yubtTdTkFskGCIaAw_HGB57-boHPl3a/view?usp=sharing
I've tried:
URL schemes (UIApplication.shared.open() unavailable in extensions)
Universal links
Local notifications (works, but adds an extra tap)
NSUserActivity
Is there a supported API I'm missing? Or another accepted solution? Any guidance is appreciated.
Topic:
App & System Services
SubTopic:
General
Tags:
Extensions
Family Controls
Managed Settings
Screen Time
Hello, We are using a Message Filter Extension (ILMessageFilterExtension) to classify SMS/iMessage content (junk vs allow) in our app. After testing on iOS 26.1, we want to confirm whether there are any behavioral, performance, or API-level changes that impact message filtering, such as: Changes in how often the filter extension is invoked Differences in classification accuracy or system overrides New privacy, entitlement, or permission-related restrictions Execution time limits or memory constraints Any changes specific to iMessage vs SMS filtering We did not find any explicit mention of Message Filter Extensions in the iOS 26.1 release notes and would like to confirm whether the existing behavior from previous iOS versions remains unchanged. Has Apple introduced any known or undocumented changes in iOS 26.1 that developers should be aware of when supporting Message Filter Extensions? Sometime I also found unpredictable behaviour on iOS version 18.5 or below, like sometime it works but sometimes starts working.
Thanks in advance for any guidance.
Hello, We are using a Message Filter Extension (ILMessageFilterExtension) to classify SMS/iMessage content (junk vs allow) in our app. After testing on iOS 26.1, we want to confirm whether there are any behavioral, performance, or API-level changes that impact message filtering, such as: Changes in how often the filter extension is invoked Differences in classification accuracy or system overrides New privacy, entitlement, or permission-related restrictions Execution time limits or memory constraints Any changes specific to iMessage vs SMS filtering We did not find any explicit mention of Message Filter Extensions in the iOS 26.1 release notes and would like to confirm whether the existing behavior from previous iOS versions remains unchanged. Has Apple introduced any known or undocumented changes in iOS 26.1 that developers should be aware of when supporting Message Filter Extensions? Sometime I also found unpredictable behaviour on iOS version 18.5 or below, like sometime it works but sometimes starts working. Thanks in advance for any guidance.
Hello,
We are using a Message Filter Extension (ILMessageFilterExtension) to classify SMS/iMessage content (junk vs allow) in our app. After testing on iOS 26.1, we want to confirm whether there are any behavioral, performance, or API-level changes that impact message filtering, such as: Changes in how often the filter extension is invoked Differences in classification accuracy or system overrides New privacy, entitlement, or permission-related restrictions Execution time limits or memory constraints Any changes specific to iMessage vs SMS filtering We did not find any explicit mention of Message Filter Extensions in the iOS 26.1 release notes and would like to confirm whether the existing behavior from previous iOS versions remains unchanged. Has Apple introduced any known or undocumented changes in iOS 26.1 that developers should be aware of when supporting Message Filter Extensions? Sometime I also found unpredictable behaviour on iOS version 18.5 or below, like sometime it works but sometimes starts working. Thanks in advance for any guidance.