RORK LABJP
BUILD — Rork Max generates native Swift apps, reaching areas React Native struggles to touchPLATFORM — Rork Max supports iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessageNATIVE — Tap native features like HealthKit, Core ML, NFC, Dynamic Island, and Live ActivitiesTEST — A browser-based streaming iOS simulator lets you test without Xcode or a MacDEPLOY — Automated builds, certificates, and App Store submission simplify shippingPRICE — Start free; paid plans begin at $25/month and Rork Max is $200/monthBUILD — Rork Max generates native Swift apps, reaching areas React Native struggles to touchPLATFORM — Rork Max supports iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessageNATIVE — Tap native features like HealthKit, Core ML, NFC, Dynamic Island, and Live ActivitiesTEST — A browser-based streaming iOS simulator lets you test without Xcode or a MacDEPLOY — Automated builds, certificates, and App Store submission simplify shippingPRICE — Start free; paid plans begin at $25/month and Rork Max is $200/month
Articles/Business
Business/2026-07-02Intermediate

Putting Your Own Control in Control Center — ControlWidget Design That Adds Launch Paths to a Rork Max App

Implementing iOS 18 ControlWidget to place custom controls in Control Center, the Lock Screen, and the Action button: working ControlWidgetButton and ControlWidgetToggle code, its value as a launch path, and how it feeds retention.

rork-max38controlwidgetwidgetkitapp-intentsretention9

Premium Article

A few years ago I added a Home Screen widget to one of my live apps. The feature set barely changed, yet morning-hour launches rose visibly. Ever since, whenever the OS grows a new "place to put things," I evaluate adding a launch path before I evaluate adding a feature.

iOS 18's new place is Control Center. With WidgetKit's ControlWidget, you can put your own buttons and toggles into Control Center, the Lock Screen, and the Action button. Rork Max handles native Swift and extension targets, so this territory is reachable — as long as you know how to phrase the instructions.

As a feature it is unglamorous. But as a device for getting an indie app remembered daily, its return on effort is among the better ones I know.

Where It Sits — Compared to the Places You Already Use

If you already ship Home Screen widgets or App Shortcuts, here is how the three differ in character.

AspectHome Screen widgetApp Shortcuts (Siri/Spotlight)ControlWidget
User effortNavigate to the Home Screen and lookSearch or speakOne swipe from any screen
ExpressivenessHigh (information display)Low (text-centric)Low (an icon and one action)
Best forAmbient state displayOperations you call by nameReflexive one-shot actions

The essence of ControlWidget is that it is one swipe away from any screen. It trades expressiveness for minimal reach cost. Creating a new note, starting or stopping a recording, opening today's single item — pick exactly one operation that fingers perform without thinking, and put that there.

In retention terms, this parks a launch trigger on prime OS real estate. If your app runs on ad revenue, lifting DAU lifts revenue directly. Having run AdMob-supported apps for years as an indie developer, I find investments in "remembering devices" like this far easier to forecast than feature work.

The Minimal Implementation — a Button That Opens the App

ControlWidgets are defined inside a widget extension target. Start with the simplest form: a button that opens a specific screen.

import WidgetKit
import SwiftUI
import AppIntents
 
// The intent fired by the control; openAppWhenRun brings the app to the foreground
struct OpenQuickMemoIntent: AppIntent {
    static let title: LocalizedStringResource = "Open Quick Memo"
    static let openAppWhenRun: Bool = true
 
    func perform() async throws -> some IntentResult & OpensIntent {
        // The app receives this via onOpenURL or scene restoration
        return .result(opensIntent: OpenURLIntent(URL(string: "myapp://quick-memo")!))
    }
}
 
struct QuickMemoControl: ControlWidget {
    var body: some ControlWidgetConfiguration {
        StaticControlConfiguration(kind: "com.example.myapp.quickmemo") {
            ControlWidgetButton(action: OpenQuickMemoIntent()) {
                Label("Quick Memo", systemImage: "square.and.pencil")
            }
        }
        .displayName("Quick Memo")
        .description("Opens memo entry from any screen.")
    }
}

Two things matter here. Forget openAppWhenRun = true and the intent executes in the background without ever surfacing your app. And the deep link target (myapp://quick-memo in this example) needs a separate receiving implementation in the app itself. The control is the front door; guiding the visitor is the app's job.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Working code for ControlWidgetButton, ControlWidgetToggle, and ControlValueProvider, plus how to split Rork Max prompts around the widget extension target
Where ControlWidget sits next to Home Screen widgets and App Shortcuts as a launch path — and how it feeds retention and, by extension, ad revenue
Fixes for the traps everyone hits once: controls that never update, controls missing from the gallery, and taps that do nothing
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Business2026-06-22
A Wallpaper App's Real Work Starts After Launch — Content, Retention, and Revenue Notes from Running One on Rork
A wallpaper app is decided less by its launch and more by how you tend it afterward. Building on a Rork implementation, here are field notes on scheduled publishing that keeps content fresh, onboarding that survives the first week, and a revenue setup whose per-download return doesn't thin out over time.
Business2026-05-11
Building Fortune & Manifestation Apps with Rork — Daily Content Delivery and Retention Design from 50M+ Downloads
Fortune apps lose most users in three days. A Rork design for daily delivery, push timing, and widgets that turns the niche into a habit.
Business2026-05-03
7 Design Principles for Apps That Keep Growing After Launch with Rork Max
When building with Rork Max, 80% of post-launch growth is determined by decisions made during development. Here are 7 design principles to build into your app from the start.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →