How to implement iOS widgets in Expo apps
Key Points
- native Swift widgets
- @bacons/apple-targets plugin
- preserve Expo + EAS Build
Summary
Glow is a widget-first iOS app built with Expo that uses native Swift widgets to surface affirmations on lock and home screens. Because widgets run natively (not JavaScript), integrate them into an Expo-managed project with an Expo Config Plugin such as @bacons/apple-targets to generate Apple widget targets while preserving EAS Build and the Expo workflow. Widgets should share data with the React Native app via a shared storage mechanism so the small native surface and the JS app stay in sync.
Key Points
- Widgets must be implemented in native Swift/WidgetKit — they cannot run React Native or JavaScript.
- Use an Expo Config Plugin (for example, @bacons/apple-targets) to add native Apple/widget targets without manual Xcode project management.
- Keep using Expo tooling and EAS Build while adding native targets generated by the plugin.
- Design the product around the widget: prioritize ambient presence and minimal friction (the widget can be the primary interface).
- Share data between the widget and the React Native app using a shared container/App Group or another interprocess mechanism so both sides remain synchronized.
- Be prepared to write and maintain a small amount of native Swift code for widget UI, timelines, and updates.