xcoderootcgeventtap

Automatically allow app (built & run by Xcode) to control your computer


I am developing an assistive MacOS app in Xcode / ObjC.

It intercepts keystrokes using event-taps.

When I run it from Xcode, I get:

2019-07-05 06:20:32.423783+0300 mapper[8108:1191874] unable to create event tap. must run as root or add privileges for assistive devices to this app.
2019-07-05 06:20:32.423809+0300 mapper[8108:1191874] No Event tap in place! You will need to call listen after tapEvents to get events.

I have to go to system preferences -> security & privacy -> privacy -> {unlock the padlock putting my admin password} -> {locate, uncheck and recheck my executable from the list}, like so:

enter image description here

Every time I modify a line of code and run again I have to go through this process of checking and unchecking.

It is a very clumsy development cycle.

Is there any way to avoid this?


Solution

  • This project was using a 4-year-old Xcode project file.

    Starting with a fresh Cocoa App template and copying the files in, the first time I build and run I am now automatically presented with:

    enter image description here

    ... which takes me to the preferences pane and previous screenshot. Subsequent rebuilds do NOT require toggling the setting in this dialog. It is only if I "Clean Build Folder" that this process repeats.

    My guess is that the improved behaviour may be because the new project is derived from a Cocoa App template (which inherits its base object from NSApplicationDelegate, whereas the old one inherited from a Commandline App template (and I had to manually manage the run loop with CFRunloop).

    Getting mouse coordinates on Mojave contains an answer offering instructions on how to add a row to entitlements.plist:

    The entitlement that allows an application to use the Accessibility API is the com.apple.private.tcc.allow entitlement (with a value of kTCCServiceAccessibility). As you can probably guess from the name it is only allowed on Apple signed binaries.