◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
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-max40controlwidgetwidgetkitapp-intentsretention10

✦ 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-05-11
Building Fortune & Manifestation Apps with Rork — Daily Delivery Design That Survives Day Three
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-04-28
Choosing a Revenue Model for Your Rork App — Ads, Subscriptions, or One-Time Purchase, Backed by Real Operating Numbers
Drawing on the years I spent running ads in my own wallpaper apps, I rebuilt the comparison of ads, subscriptions, and one-time purchases under identical conditions — with genre-by-genre guidance and implementation notes for Rork.
⟐ Business2026-04-28
Monetizing SwiftUI Native Apps Built with Rork Max — From App Store Approval to Subscription Revenue
How to take SwiftUI code generated by Rork Max through App Store review and add StoreKit 2 subscriptions, with working code and the items review actually checks.