SMAppService Error 108 "Unable to read plist" on macOS 15 Sequoia - Comprehensive Test Case
Summary
We have a fully notarized SMAppService implementation that consistently fails with Error 108 "Unable to read plist" on macOS 15 Sequoia, despite meeting all documented requirements. After systematic testing including AI-assisted analysis, we've eliminated all common causes and created a comprehensive test case.
Error: SMAppServiceErrorDomain Code=108 "Unable to read plist: com.keypath.helperpoc.helper"
📋 Complete Repository: https://github.com/malpern/privileged_helper_help
What We've Systematically Verified ✅
- Perfect bundle structure: Helper at Contents/MacOS/, plist at Contents/Library/LaunchDaemons/
- Correct SMAuthorizedClients: Embedded in helper binary via CREATE_INFOPLIST_SECTION_IN_BINARY=YES
- Aligned identifiers: Main app, helper, and plist all use consistent naming
- Production signing: Developer ID certificates with full Apple notarization and stapling
- BundleProgram paths: Tested both Contents/MacOS/helperpoc-helper and simplified helperpoc-helper
- Entitlements: Tested with and without com.apple.developer.service-management.managed-by-main-app
What Makes This Different
- Systematic methodology: Not a "help me debug" post - we've done comprehensive testing
- Expert validation: AI analysis helped eliminate logical hypotheses
- Reproduction case: Minimal project that demonstrates the issue consistently
- Complete documentation: All testing steps, configurations, and results documented
Use Case Context
We're building a keyboard remapper that integrates with https://github.com/jtroo/kanata and needs privileged daemon registration for system-wide keyboard event interception.
Key Questions
- Does anyone have a working SMAppService implementation on macOS 15 Sequoia?
- Are there undocumented macOS 15 requirements we're missing?
- Is Error 108 a known issue with specific workarounds?
Our hypothesis: This appears to be a macOS 15 system-level issue rather than configuration error, since our implementation meets all documented Apple requirements but fails consistently.
Has anyone encountered similar SMAppService issues on macOS 15, or can confirm a working implementation?
Correct SMAuthorizedClients: …
SMAuthorizedClients
is only relevant when you use SMJobBless
; it’s not relevant to the newer SMAppService
.
Likewise for SMPrivilegedExecutables
.
To seem to have glommed together SMAppService
and SMJobBless
instructions, which is never good.
Error: SMAppServiceErrorDomain Code=108 "Unable to read plist: com.keypath.helperpoc.helper"
Error 108 suggest that you have a bad path. I wasn’t able to confirm this because your test project didn’t include a project that I can build, but I suspect that the issue is this:
private let helperPlistName = "com.keypath.helperpoc.helper"
…
let service = SMAppService.daemon(plistName: helperPlistName)
The string you pass to daemon(plistName:)
is meant to include the .plist
extension.
Notably, our docs do make that clear.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"