Skill: Expo iOS Integration
Package Expo app as XCFramework artifacts, link them into host iOS app, and initialize Expo-compatible RN runtime.
Quick Command
npx brownfield package:ios --scheme <framework_target_name> --configuration ReleaseWhen to Use
- User requests Expo iOS brownfield integration
- Host app must render Expo-backed React Native UI
Prerequisites
- expo-quick-start.md completed
- iOS host app builds successfully
- Framework scheme name resolved (
BrownfieldLibby default unless overridden in Expo plugin options)
Agent-Assisted Verification
Use agent-device after the host build succeeds. Read the agent-device skill or CLI help when available before exact commands. If it is missing and verification needs it, install it through the environment's approved/trusted path or ask the user to install or enable it. Then open the host app, navigate to the Expo-backed RN surface, capture snapshots/screenshots, and collect logs for Debug and Release behavior.
Step-by-Step Instructions
Progress checklist:
- [ ] Package XCFrameworks
- [ ] Link frameworks in host app
- [ ] Configure startup
- [ ] Render RN module- Package iOS artifacts:
npx brownfield package:ios --scheme <framework_target_name> --configuration Release
- Link artifacts from package output directory (
ios/.brownfield/packageor.brownfield/ios/package) into host app project:<framework_target_name>.xcframeworkReactBrownfield.xcframeworkhermesvm.xcframework(orhermes.xcframeworkfor older RN)
- Initialize runtime in app entrypoint:
ReactNativeBrownfield.shared.bundle = ReactNativeBundle
ReactNativeBrownfield.shared.startReactNative {
print("React Native has been loaded")
}
ReactNativeBrownfield.shared.ensureExpoModulesProvider()- Forward
didFinishLaunchingWithOptionsto brownfield handler. - Render RN UI using the module registered in JS (
AppRegistry.registerComponent):ReactNativeView(moduleName: "<registered_module_name>")- or
ReactNativeBrownfield.shared.view(moduleName: "<registered_module_name>", initialProps: nil)
Stop Conditions
Mark complete only if:
- package command exits with code
0 - host app builds in Debug and Release
- selected module renders successfully
- device evidence is captured with
agent-devicewhen possible
Canonical Docs
Common Pitfalls
- Missing
ensureExpoModulesProvider()in Expo startup flow - Not forwarding
didFinishLaunchingWithOptions - Using wrong module name instead of JS-registered component name
Related Skills
- expo-quick-start.md - Expo setup and plugin wiring
- expo-android-integration.md - Expo Android equivalent