Skip to content

Typing indicators broken on macOS 26 (Tahoe) — imagent requires private entitlements #60

@zoskebutler

Description

@zoskebutler

Summary

imsg typing fails on macOS 26.3 (Tahoe) because imagent now enforces Apple-private entitlements on its XPC service (com.apple.imagent.desktop.auth). Any third-party binary — signed or unsigned — is rejected.

Environment

  • macOS 26.3 (Build 25D125, Tahoe)
  • imsg v0.5.0 (Homebrew)
  • Apple Swift 6.2.3

Steps to Reproduce

imsg typing --to +1XXXXXXXXXX --duration 5s

Error

typingIndicatorFailed("Chat not found for identifier: iMessage;-;+1XXXXXXXXXX.
Make sure Messages.app has an active conversation with this contact.")

Root Cause

The error message is misleading — the actual failure is the daemon connection. System logs show:

imagent: (IMDaemonCore) [com.apple.Messages:DaemonClientConnections]
Client <pid> does not have any of allowed entitlements <private>, invalidating connection

On macOS 26, imagent rejects XPC connections from processes that lack Apple-private entitlements. IMDaemonController.isConnected always returns false, so IMChatRegistry.allExistingChats returns 0 results, and the chat lookup fails.

This is a macOS-level lockdown — code signing alone does not fix it. The required entitlements (likely com.apple.imagent.chat or similar) are restricted to Apple-signed binaries.

What We Tried

  • connectToDaemon, connectToDaemonWithLaunch:, connectToDaemonWithLaunch:capabilities:blockUntilConnected: — all fail
  • Ad-hoc signing with Apple entitlements → SIGKILL (macOS blocks claiming private entitlements)
  • Setting listener ID to com.apple.MobileSMS — still rejected
  • Waiting up to 3+ seconds for async connection — never connects
  • Verified IMChatRegistry, IMDaemonController, and IMChat classes all still exist and load fine via dlopen
  • All existing selectors (existingChatWithGUID:, existingChatWithChatIdentifier:, setLocalUserIsTyping:) are present

Possible Alternatives

  • Accessibility API: Programmatically focus the Messages.app input field to trigger native typing indicators — no entitlements needed
  • AppleScript extension: If Messages.app ever exposes typing via its scripting dictionary
  • Messages.app plugin/extension: Would inherit the app's entitlements, but Apple may block this path too

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions