Skip to content

iOS Versions

The Apple provider runs on iOS 26 and iOS 27. Apple added a lot to Foundation Models in iOS 26.4 and iOS 27, so the same code can behave differently depending on the device. A feature that Apple only ships in a newer version either throws UNSUPPORTED_OS or is left out of the result.

Two things decide whether a feature is available:

  • The iOS version on the device. It is checked at runtime.
  • The SDK your app is built with. Newer Apple APIs are only compiled in when the SDK has them. If you build with an older SDK, the app behaves as if it ran on the older iOS version, even on a newer device.
Apple APIs Build with
iOS 26.4 Xcode 26 with Swift 6.3
iOS 27 Xcode 27 with Swift 6.4

Features of apple() and apple('private-cloud-compute'). Options that ask for a missing feature (image parts, the Private Cloud Compute model, Vision tools, a required or named tool choice, maxToolCalls) throw UNSUPPORTED_OS. A reasoning level the model cannot use, which includes every model before iOS 27, is dropped with an unsupported warning. Missing output, such as reasoning parts, is left out, and missing usage has undefined token counts.

Feature iOS 26 iOS 26.4 iOS 27
Text generation and streaming ✅ ✅ ✅
Structured output (Output.object) ✅ ✅ ✅
Structured output with streamText ✅ Sent whole at the end ✅ Sent whole at the end ✅ Sent whole at the end
JavaScript tools ✅ ✅ ✅
Tool calls and results in generateText ✅ ✅ ✅
Tool calls and results while streaming ✅ Sent once the tool returns ✅ Sent once the tool returns ✅ Sent once the tool returns
toolChoice: 'auto' and 'none' ✅ ✅ ✅
toolChoice: 'required' ❌ ❌ ✅
toolChoice with a named tool ❌ ❌ ✅
maxToolCalls provider option ❌ ❌ ✅
Guardrails (permissiveContentTransformations) ✅ ✅ ✅
countTokens and contextSize ❌ ✅ ✅
Reasoning level (reasoning option) Ignored, with a warning Ignored, with a warning ✅
Reasoning parts in results and streams ❌ ❌ ✅
Image prompts ❌ ❌ ✅ Final user prompt only
Private Cloud Compute model ❌ ❌ ✅ Physical device only
Vision OCR and barcode tools ❌ ❌ ✅ Physical device only
Spotlight search tool ❌ ❌ ✅ Physical device only
Token usage and 'length' finish reason ❌ ✅ Counted with the tokenizer ✅
CONTEXT_WINDOW_EXCEEDED and RATE_LIMITED ✅ ✅ ✅
Guardrail, refusal, language and asset errors ✅ ✅ ✅
Timeout and network errors ❌ ❌ ✅

Notes:

  • Tool choice. Apple’s required mode applies to every request in its tool loop, so the model would never answer. On iOS 27 the provider requires a tool call only until the model has made one. See Tools.
  • Guardrails apply to the system model only. Private Cloud Compute ignores them.
  • Streaming tool calls. tool-call and tool-result parts are sent together once the tool returns, because native runs the tool before the provider sees the call.
  • Reasoning. Transcripts before iOS 27 have no reasoning entries, so reasoning parts in the message history are dropped. On iOS 27 they are replayed in later turns.
  • Images in history. Apple only reads images on the prompt being answered. Images in earlier user turns are left out on every version.
  • Usage and finish reason. iOS 27 reports the usage Foundation Models measured, and iOS 26.4 counts it with the on-device tokenizer. On iOS 26, usage has undefined token counts and the finish reason is always 'stop'. Apple does not report when a response stops at maxOutputTokens, so the finish reason is 'length' when the response used every allowed token.
  • Simulator. Private Cloud Compute does not run in the iOS Simulator, and the simulator SDK does not include the Vision tools.

apple.getModelInfo() reports what the current device supports, so you can check at runtime instead of comparing iOS versions:

Field iOS 26 iOS 26.4 iOS 27
contextSize Missing ✅ ✅
supportsTokenCounting false true true for system only
supportsImagePrompts false false true
supportsVisionTools false false true on a physical device
supportsSpotlightTool false false true on a physical device
import { apple } from '@react-native-ai/apple'
const info = await apple.getModelInfo()
if (info.supportsImagePrompts) {
// Send image parts
}

Use supportsReasoning before setting reasoning, and availability with { model: 'private-cloud-compute' } before using Private Cloud Compute.

apple.imageModel() uses Image Playground’s ImageCreator, which Apple added in iOS 26.4 and discontinued in iOS 27. It throws UNSUPPORTED_OS on other versions, and is deprecated.

Feature iOS 26 iOS 26.4 iOS 27
Image generation ❌ ✅ ❌
animation, illustration, sketch ❌ ✅ ❌
any, emoji, externalProvider styles ❌ Falls back to illustration ❌
personalization option ❌ ✅ ❌

These models do not use Foundation Models and have their own minimum versions:

Model Minimum iOS
Transcription iOS 26
Embeddings iOS 17
Speech Any, Personal Voice from iOS 17