SMAppService Error 108 'Unable to read plist' on macOS 15 - Comprehensive Analysis & Test Case

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

  1. Does anyone have a working SMAppService implementation on macOS 15 Sequoia?
  2. Are there undocumented macOS 15 requirements we're missing?
  3. 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?

Answered by DTS Engineer in 848865022
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"

Accepted Answer
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"

That totally fixed it. Thank you for your help!

SMAppService Error 108 'Unable to read plist' on macOS 15 - Comprehensive Analysis & Test Case
 
 
Q