macOS 27 Background AI: Add the Entitlement Before the Neural Engine Goes Quiet

Apple Developer documentation for the macOS 27 Background Inference entitlement and BGContinuedProcessingTask
The entitlement is a separate requirement from the continued-processing task.

A continued task can keep running after the window leaves focus, but Neural Engine work now has its own entitlement. Scheduling and compute authorization are separate gates.

A Mac app starts a local transcription, image analysis, or document model while its window is active. The user switches apps. The task object is still valid, but the Neural Engine is no longer an assumed resource. In macOS 27, Apple requires com.apple.developer.background-tasks.continued-processing.inference for Neural Engine access while the app is in the background.

The easy mistake is to treat a BGContinuedProcessingTask as the whole solution. It is the scheduling contract: work begins from a user action in the foreground and may continue if the app moves to the background. The entitlement is the compute contract. A production design needs both, plus a cancellation and fallback path. This guide is based on Apple’s beta documentation and release notes; it does not claim a completed macOS 27 device test.

Attempt one: move inference to a background queue

A background thread keeps the main window responsive. It does not grant background execution time after the app’s state changes, and it does not authorize the Neural Engine. Threading solves UI contention; BackgroundTasks solves scheduling; the entitlement opens a specific hardware resource. Combining those concerns into “run it off the main thread” leaves the real lifecycle unowned.

Attempt two: submit a continued-processing request

BGContinuedProcessingTaskRequest is designed for critical work that starts while the app is foregrounded and may finish after the person backgrounds it. The request has a visible title and subtitle, and the scheduler may begin it immediately if resources allow. The user action matters: this is not a general mechanism for silently waking the app and starting new model work.

Apple’s macOS 27 release notes add the missing constraint. Neural Engine access in the background requires the new inference entitlement. The entitlement documentation says this applies whether the workload uses Core AI, Core ML, or Metal Performance Shaders Graph, and whether or not it is already inside a continued task.

Which contract owns each part of the workload
Need Mechanism Failure to test
Keep the window responsive Structured concurrency or a background executor Main-thread stalls and excessive thread hopping
Finish user-started work after app backgrounding BGContinuedProcessingTaskRequest Deferral, expiration, cancellation, and app termination
Use Neural Engine in the background Background Inference entitlement Negative control without the entitlement
Use GPU for a continued task Separate background GPU resource and entitlement Do not assume the inference entitlement covers GPU execution
Recover when the preferred resource is unavailable Checkpoint, pause, or foreground-only continuation Partial output and duplicated work
The scheduler, execution context, and accelerator are three different ownership boundaries.

The turning point: design the task as resumable work

Even with the entitlement, the system owns scheduling and resource pressure. Treat inference as a sequence of checkpoints: prepare inputs, load the model, run bounded units, persist safe progress, and commit the final result once. An expiration handler should cancel the active operation and leave a state the foreground UI can explain.

Do not promise a fixed completion time. A user-facing status should distinguish queued, running, paused by the system, cancelled, failed, and complete. If partial output cannot be resumed safely, delete it and say so. If the task contains personal documents, keep its persistence policy separate from the accelerator entitlement.

The working rule

Request continued processing only for a task the person deliberately started and expects to finish. Request accelerator access only for the resource the implementation actually uses. Then make the operation correct when either request is delayed or denied. If the job can wait until the user returns, a foreground-only design is simpler and easier to explain.

The API is beta. Recheck the entitlement name, platform availability, and release notes against the final macOS 27 SDK before shipping. A beta symbol compiling in Xcode is not a release guarantee.

Official sources