Post

Replies

Boosts

Views

Activity

Reply to Driver Activation failure error code 9. Maybe Entitlements? Please help
You've set IOProviderClass to IOUSBHostDevice, but your IOKitPersonality includes the interface number, which a device doesn't have. You probably want to match against the interface (set IOProviderClass to IOUSBHostInterface) If you really want to talk to the IOUSBHostDevice, not the IOUSBHostInterface, reduce your matching criteria to include only the items in this table: https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/USBBook/USBOverview/USBOverview.html#//apple_ref/doc/uid/TP40002644-BBIDGCHB The table is ancient, but still relevant. If you over-specify matching criteria, you won't match at all. You're right not to put an IOProbeScore in there. The matching process calculates an IOProbeScore (more criteria -> higher probe score). The system's driver is unlikely to be as specific as yours, so you will outmatch it anyway. The only reason to manually specify an IOProbeScore is to outmatch another driver which would otherwise have the same score based on its matching criteria. That is unlikely here. You asked about the difference between IOUSBHostDevice and IOUSBHostInterface. Start here: https://developer.apple.com/documentation/usbdriverkit If you match against the device, you can only send requests to the control pipe, and you prevent the OS from building any kernel abstractions which can talk to the interfaces, unless your driver makes that happen. If you need to operate on anything more than the control pipe, you're better off matching against the interface you need. This gives you access to CopyPipe. Once you have a pipe, you can send or receive data through that pipe.
Topic: App & System Services SubTopic: Drivers Tags:
2w
Reply to Basic introduction to DEXT Matching and Loading
Hi Kevin, thanks for this write-up, but I noticed you wrote this: "IOProviderClass"-> This is the in-kernel class that your in-kernel driver loads "on top" of. "IOClass"-> This is the in-kernel class that your driver loads on top of. they're not both the same thing though. It is often difficult to tell what these should be from the documentation for DriverKit, because it concentrates on the user-side classes, trying mightily to pretend that the kernel side doesn't exist.
Topic: App & System Services SubTopic: Drivers Tags:
2w
Reply to Can't get USBSerialDriverKit driver loaded
The plist you posted looks strange - it has a mixture of entitlements (which go into a .entitlements file) and other properties which I'd expect to see in an Info.plist. I don't see your driver's personality anywhere, which is what the OS uses for driver matching. Take a look at /System/Library/DriverExtensions/com.apple.DriverKit-AppleUSBSerial.dext/Info.plist for example.
Topic: App & System Services SubTopic: Drivers Tags:
2w
Reply to MacOS installer appears rejected after successful notarization
have you checked the Privacy & Security section of System Settings? I haven't had this problem with installers, but I have seen app launches blocked here during development. In the normal flow, the user sees a dialog asking for permission, but under some circumstances that dialog won't appear - but the permission is still requested, it is just lurking unseen in System Settings. You could also request the detailed notarization log from the server, which tells you more than the mere result of the command. spctl tells you what you already know - that the packet is rejected on your machine. Check the system log to see if there are any further details on the reasons why. I usually dump the last minute into an archive and search that - log --last 1m , because working with the active log is frustrating, it is populated very quickly.
Topic: Code Signing SubTopic: Notarization Tags:
3w
Reply to is the output frame rate of a CMIOExtension rounded or capped?
Sorry about the delay, I didn't see your message on the day it was posted (that little bell icon doesn't do much). I figured out what I was doing wrong but hadn't got around to replying to my own post. I was using this initializer: @nonobjc public convenience init(formatDescription: CMFormatDescription, maxFrameDuration: CMTime, minFrameDuration: CMTime, validFrameDurations: [CMTime]?) In previous code, I'd created a format like this (pseudocode): CMIOExtensionStreamFormat(formatDescription: description, maxFrameDuration: 30 fps, minFrameDuration: 30 fps, validFrameDurations: nil) which seemed to work fine - my virtual camera had a single format with 30fps. When I made a generator with multiple formats, I tried to add another format with a different frame rate like this: CMIOExtensionStreamFormat(formatDescription: description, maxFrameDuration: 29.97 fps, minFrameDuration: 29.97 fps, validFrameDurations: nil) and ended up with an AVCaptureDevice which offered two formats, both with the min and max frame duration of 30fps. That was the wrong thing to do. I only need a new CMIOExtensionStreamFormat only for a different size of output stream (all my streams use the same pixel format). Each size gets one format with multiple frame rates - pseudocode: CMIOExtensionStreamFormat(formatDescription: description, maxFrameDuration: 29.97 fps, minFrameDuration: 60 fps, validFrameDurations: [29.97fps, 30fps, 59.94fps, 60fps]) That works. Apple's built-in webcam on my laptop can provide arbitrary frame rates between 1 and 30 fps , while most UVC cameras only support a limited, fixed set of frame rates. With that mystery solved, my remaining question is how best to provide an actual frame rate which is closest to the promised value? Currently I do. this by counting frames since the start of generation and comparing setting a timer to fire at the anticipated time of the next frame (startTime + frameCount*frameDuration), rather than using a repeating timer.
Topic: Media Technologies SubTopic: Video Tags:
Jan ’26
Reply to How to properly register a macOS System Extension in an Electron app?
I don't know if there's anything Electron-specific, but if your app has com.apple.developer.system-extension.install, you need a NSSystemExtensionUsageDescriptionKey or OSBundleUsageDescriptionKey (for DriverKit extensions). Your failure to launch may not be what you think it is. Your program may have some code which unconditionally registers your extension at launch time, and your lack of the required usage description causes the system to terminate your app very early in its life cycle. You may be able to see what is going on my monitoring the console log (filter on your app's bundle ID)
Dec ’25
Reply to NSWindowController subclass in Swift
You need to add override init(window: NSWindow?) { super.init(window: window) } in your subclass. See https://docs.swift.org/swift-book/documentation/the-swift-programming-language/initialization/ which say: Rule 1 If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers. Rule 2 If your subclass provides an implementation of all of its superclass designated initializers — either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition — then it automatically inherits all of the superclass convenience initializers. The (unstated) corollary here is that if you only override some of the superclass's designated initializers, you inherit none of them. in your case, you'd overridden init(coder:) not init(window:), so the compiler didn't 'see' an init(window:) at all. I'm not smart enough to figure this out on my own, I asked an LLM and then asked it to show me the documentation, because you really can't trust those guys. ;)
Topic: Programming Languages SubTopic: Swift Tags:
Dec ’25
Reply to Can't Provision A Device
you said "selected it as a preview device" - what do you mean here? It sounds like you selected your model of phone for the simulator. In the middle top of the Xcode window, it shows your target name a run destination. By default, that run destination for an iOS app is a simulator. Plug in your phone. If it doesn't appear in the popup menu as a run destination, choose "Manage run destinations..." from that menu. It should show up as "discovered" in the list on the left of the Run Destinations window. The first time you pair the phone with Xcode takes quite a while (several minutes for me).
Dec ’25
Reply to Problem with DriverKitUserClientSample
That sample doesn't quite work out of the box. Here is how you can get it to work on macOS 26 with Xcode 26 (and earlier versions of both, but that's what I'm using). Download the sample from https://developer.apple.com/documentation/driverkit/communicating-between-a-driverkit-extension-and-a-client-app?. Follow only some of the directions under Configure the sample code project: (turn off SIP) - skip this, it is no longer necessary Set Automatically manage signing for both the driver and the app targets Select a development team. Xcode will tell you that you cannot select an individual for this type of signing. ignore the advice about "Sign to run locally" and AD_HOC_CODE_SIGNING_ALLOWED. ignore all the other stuff. You don't need to make profiles, add capabilities, manually download profiles or add them to Xcode. Now go the Build Settings for the driver and app target, and change the Product Bundle Identifier. The download project uses a disambiguation string that doesn't work, and you end up with very long bundle IDs which cause an error - see https://developer.apple.com/forums/thread/785223 I used com.shorty.dext-to-user-client-2-${DEVELOPMENT_TEAM}.driver for the driver and com.shorty.dext-to-user-client-2-${DEVELOPMENT_TEAM} for the app Then, to make running and debugging easier, you can alter the Scheme for the app. In Xcode, at the top of the window, click on your app target and select Edit Scheme. In the dialog, expose the Build scheme and select the Post Actions. Add a new Run Script phase with this content: ditto "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" "/Applications/${FULL_PRODUCT_NAME}" That will put your app into /Applications every time you build it. Build the app. Next, tell the debugger to run that copy and not the one in the Build Products folder. Expose the Run part of the scheme, click on the Run section, then in the Info tab you'll see a popup for the Executable: location. Click that, select other..., navigate to your app in /Applications. Everything else should Just Work. It is possible to develop dexts if you're not a member of a development team, but it is much more difficult.
Topic: App & System Services SubTopic: Drivers Tags:
Nov ’25
Reply to Driver Activation failure error code 9. Maybe Entitlements? Please help
You've set IOProviderClass to IOUSBHostDevice, but your IOKitPersonality includes the interface number, which a device doesn't have. You probably want to match against the interface (set IOProviderClass to IOUSBHostInterface) If you really want to talk to the IOUSBHostDevice, not the IOUSBHostInterface, reduce your matching criteria to include only the items in this table: https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/USBBook/USBOverview/USBOverview.html#//apple_ref/doc/uid/TP40002644-BBIDGCHB The table is ancient, but still relevant. If you over-specify matching criteria, you won't match at all. You're right not to put an IOProbeScore in there. The matching process calculates an IOProbeScore (more criteria -> higher probe score). The system's driver is unlikely to be as specific as yours, so you will outmatch it anyway. The only reason to manually specify an IOProbeScore is to outmatch another driver which would otherwise have the same score based on its matching criteria. That is unlikely here. You asked about the difference between IOUSBHostDevice and IOUSBHostInterface. Start here: https://developer.apple.com/documentation/usbdriverkit If you match against the device, you can only send requests to the control pipe, and you prevent the OS from building any kernel abstractions which can talk to the interfaces, unless your driver makes that happen. If you need to operate on anything more than the control pipe, you're better off matching against the interface you need. This gives you access to CopyPipe. Once you have a pipe, you can send or receive data through that pipe.
Topic: App & System Services SubTopic: Drivers Tags:
Replies
Boosts
Views
Activity
2w
Reply to Basic introduction to DEXT Matching and Loading
Hi Kevin, thanks for this write-up, but I noticed you wrote this: "IOProviderClass"-> This is the in-kernel class that your in-kernel driver loads "on top" of. "IOClass"-> This is the in-kernel class that your driver loads on top of. they're not both the same thing though. It is often difficult to tell what these should be from the documentation for DriverKit, because it concentrates on the user-side classes, trying mightily to pretend that the kernel side doesn't exist.
Topic: App & System Services SubTopic: Drivers Tags:
Replies
Boosts
Views
Activity
2w
Reply to Can't get USBSerialDriverKit driver loaded
The plist you posted looks strange - it has a mixture of entitlements (which go into a .entitlements file) and other properties which I'd expect to see in an Info.plist. I don't see your driver's personality anywhere, which is what the OS uses for driver matching. Take a look at /System/Library/DriverExtensions/com.apple.DriverKit-AppleUSBSerial.dext/Info.plist for example.
Topic: App & System Services SubTopic: Drivers Tags:
Replies
Boosts
Views
Activity
2w
Reply to MacOS installer appears rejected after successful notarization
have you checked the Privacy & Security section of System Settings? I haven't had this problem with installers, but I have seen app launches blocked here during development. In the normal flow, the user sees a dialog asking for permission, but under some circumstances that dialog won't appear - but the permission is still requested, it is just lurking unseen in System Settings. You could also request the detailed notarization log from the server, which tells you more than the mere result of the command. spctl tells you what you already know - that the packet is rejected on your machine. Check the system log to see if there are any further details on the reasons why. I usually dump the last minute into an archive and search that - log --last 1m , because working with the active log is frustrating, it is populated very quickly.
Topic: Code Signing SubTopic: Notarization Tags:
Replies
Boosts
Views
Activity
3w
Reply to is the output frame rate of a CMIOExtension rounded or capped?
Sorry about the delay, I didn't see your message on the day it was posted (that little bell icon doesn't do much). I figured out what I was doing wrong but hadn't got around to replying to my own post. I was using this initializer: @nonobjc public convenience init(formatDescription: CMFormatDescription, maxFrameDuration: CMTime, minFrameDuration: CMTime, validFrameDurations: [CMTime]?) In previous code, I'd created a format like this (pseudocode): CMIOExtensionStreamFormat(formatDescription: description, maxFrameDuration: 30 fps, minFrameDuration: 30 fps, validFrameDurations: nil) which seemed to work fine - my virtual camera had a single format with 30fps. When I made a generator with multiple formats, I tried to add another format with a different frame rate like this: CMIOExtensionStreamFormat(formatDescription: description, maxFrameDuration: 29.97 fps, minFrameDuration: 29.97 fps, validFrameDurations: nil) and ended up with an AVCaptureDevice which offered two formats, both with the min and max frame duration of 30fps. That was the wrong thing to do. I only need a new CMIOExtensionStreamFormat only for a different size of output stream (all my streams use the same pixel format). Each size gets one format with multiple frame rates - pseudocode: CMIOExtensionStreamFormat(formatDescription: description, maxFrameDuration: 29.97 fps, minFrameDuration: 60 fps, validFrameDurations: [29.97fps, 30fps, 59.94fps, 60fps]) That works. Apple's built-in webcam on my laptop can provide arbitrary frame rates between 1 and 30 fps , while most UVC cameras only support a limited, fixed set of frame rates. With that mystery solved, my remaining question is how best to provide an actual frame rate which is closest to the promised value? Currently I do. this by counting frames since the start of generation and comparing setting a timer to fire at the anticipated time of the next frame (startTime + frameCount*frameDuration), rather than using a repeating timer.
Topic: Media Technologies SubTopic: Video Tags:
Replies
Boosts
Views
Activity
Jan ’26
Reply to how to use this api:AVAudioConverter?
https://developer.apple.com/documentation/audiotoolbox/encoding-and-decoding-audio
Topic: Media Technologies SubTopic: Audio Tags:
Replies
Boosts
Views
Activity
Jan ’26
Reply to How to properly register a macOS System Extension in an Electron app?
I don't know if there's anything Electron-specific, but if your app has com.apple.developer.system-extension.install, you need a NSSystemExtensionUsageDescriptionKey or OSBundleUsageDescriptionKey (for DriverKit extensions). Your failure to launch may not be what you think it is. Your program may have some code which unconditionally registers your extension at launch time, and your lack of the required usage description causes the system to terminate your app very early in its life cycle. You may be able to see what is going on my monitoring the console log (filter on your app's bundle ID)
Replies
Boosts
Views
Activity
Dec ’25
Reply to How/where do SwiftUI “App” objects handle AppleEvents
NSApplicationDelegateAdaptor would be your starting point.
Replies
Boosts
Views
Activity
Dec ’25
Reply to NSWindowController subclass in Swift
You need to add override init(window: NSWindow?) { super.init(window: window) } in your subclass. See https://docs.swift.org/swift-book/documentation/the-swift-programming-language/initialization/ which say: Rule 1 If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers. Rule 2 If your subclass provides an implementation of all of its superclass designated initializers — either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition — then it automatically inherits all of the superclass convenience initializers. The (unstated) corollary here is that if you only override some of the superclass's designated initializers, you inherit none of them. in your case, you'd overridden init(coder:) not init(window:), so the compiler didn't 'see' an init(window:) at all. I'm not smart enough to figure this out on my own, I asked an LLM and then asked it to show me the documentation, because you really can't trust those guys. ;)
Topic: Programming Languages SubTopic: Swift Tags:
Replies
Boosts
Views
Activity
Dec ’25
Reply to Can't Provision A Device
you said "selected it as a preview device" - what do you mean here? It sounds like you selected your model of phone for the simulator. In the middle top of the Xcode window, it shows your target name a run destination. By default, that run destination for an iOS app is a simulator. Plug in your phone. If it doesn't appear in the popup menu as a run destination, choose "Manage run destinations..." from that menu. It should show up as "discovered" in the list on the left of the Run Destinations window. The first time you pair the phone with Xcode takes quite a while (several minutes for me).
Replies
Boosts
Views
Activity
Dec ’25
Reply to Problem with DriverKitUserClientSample
That sample doesn't quite work out of the box. Here is how you can get it to work on macOS 26 with Xcode 26 (and earlier versions of both, but that's what I'm using). Download the sample from https://developer.apple.com/documentation/driverkit/communicating-between-a-driverkit-extension-and-a-client-app?. Follow only some of the directions under Configure the sample code project: (turn off SIP) - skip this, it is no longer necessary Set Automatically manage signing for both the driver and the app targets Select a development team. Xcode will tell you that you cannot select an individual for this type of signing. ignore the advice about "Sign to run locally" and AD_HOC_CODE_SIGNING_ALLOWED. ignore all the other stuff. You don't need to make profiles, add capabilities, manually download profiles or add them to Xcode. Now go the Build Settings for the driver and app target, and change the Product Bundle Identifier. The download project uses a disambiguation string that doesn't work, and you end up with very long bundle IDs which cause an error - see https://developer.apple.com/forums/thread/785223 I used com.shorty.dext-to-user-client-2-${DEVELOPMENT_TEAM}.driver for the driver and com.shorty.dext-to-user-client-2-${DEVELOPMENT_TEAM} for the app Then, to make running and debugging easier, you can alter the Scheme for the app. In Xcode, at the top of the window, click on your app target and select Edit Scheme. In the dialog, expose the Build scheme and select the Post Actions. Add a new Run Script phase with this content: ditto "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" "/Applications/${FULL_PRODUCT_NAME}" That will put your app into /Applications every time you build it. Build the app. Next, tell the debugger to run that copy and not the one in the Build Products folder. Expose the Run part of the scheme, click on the Run section, then in the Info tab you'll see a popup for the Executable: location. Click that, select other..., navigate to your app in /Applications. Everything else should Just Work. It is possible to develop dexts if you're not a member of a development team, but it is much more difficult.
Topic: App & System Services SubTopic: Drivers Tags:
Replies
Boosts
Views
Activity
Nov ’25
Reply to API for disk throughput?
you can see what iostat does by looking at its source code, which is here https://github.com/apple-oss-distributions/system_cmds/tree/main/iostat
Topic: App & System Services SubTopic: Core OS Tags:
Replies
Boosts
Views
Activity
Nov ’25
Reply to New Developer
https://developer.apple.com/programs/
Replies
Boosts
Views
Activity
Nov ’25
Reply to AVAssetExportSession ignores frameDuration 60fps and exports at 30fps, but AVPlayer playback is correct
I think the problem isn't so much the preset as the use of the AVExportSession itself, which can only accept presets. To get more control, you could use an AVAssetWriter. You can set it up with a preset to begin with, then alter some of the parameters.
Topic: Media Technologies SubTopic: Video Tags:
Replies
Boosts
Views
Activity
Oct ’25
Reply to Unable to submit my macOS window‑manager app
Is com.apple.security.accessiblity a documented and valid entitlement? see https://developer.apple.com/forums/thread/799000
Replies
Boosts
Views
Activity
Oct ’25