Articles Projects About Subscribe
← All issues Newsletter

iOS Dev Weekly — Issue #47

Opening

App Intents are finally showing up in real products, and the glossy demos don’t cover the mess when Shortcuts, Siri, and Spotlight each run your code differently. Teams are quietly discovering that “works in the app” doesn’t mean “works in the host,” especially when defaults, entity queries, and response rendering race each other. This week: getting deterministic about which process you’re actually debugging and why your dialog text drifts.


This Week’s Big Story

Debugging App Intents Responses in Xcode

Shortcuts shows the wrong dialog, your AppEntity icon is blank, and logs insist everything is fine because they’re attached to the wrong process. The fix starts with attaching to the host at launch, instrumenting with signposts, and letting displayRepresentation drive UI text and icons across all surfaces. If your response copy “migrates” between Shortcuts and Siri, this piece breaks down the timing traps and how to make intent runs boringly consistent.


Trend Signals

• UHF X11 for visionOS hints at a serious tinkering wave: devs are pushing legacy UI into new form factors to test input models and latency constraints. [Source: HackerNews]

• Ember, an open-source native iOS Hacker News reader focused on accessibility, shows the bar rising for VoiceOver-first navigation in feed apps. [Source: HackerNews]

• Apple detailing the TrueType hinting interpreter migration to Swift underscores Swift’s expanding role in performance-sensitive, system-adjacent code. [Source: Swift.org Blog]

• Articles praising SwiftData’s declarative model changes suggest teams are actively shedding manual state notifications, with cleaner persistence pipelines as the payoff. [Source: dev.to]


Swift Snippet of the Week

import Foundation
import AppIntents
import OSLog

struct MyItem: AppEntity, Identifiable, Hashable, Codable {
    static var typeDisplayRepresentation: TypeDisplayRepresentation = .init(name: "Item")
    static var defaultQuery = MyItemQuery()
    let id: UUID
    let name: String
    var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(title: LocalizedStringResource(stringLiteral: name))
    }
}

struct MyItemQuery: EntityQuery {
    static let log = Logger(subsystem: "com.example.intents", category: "EntityQuery")
    static let signposter = OSSignposter(subsystem: "com.example.intents", category: "EntityQuery")

    func suggestedEntities() async throws -> [MyItem] {
        let interval = Self.signposter.beginInterval("suggestedEntities")
        defer { Self.signposter.endInterval("suggestedEntities", interval) }
        Self.log.info("Host: \(ProcessInfo.processInfo.processName, privacy: .public) suggesting defaults")
        return [MyItem(id: UUID(), name: "Fallback")]
    }

// … (truncated for newsletter)

This pattern bakes determinism into App Intents by making the host explicit in logs and timing with signposts, so you debug the process the user actually experiences—not the one you wish you attached to.


Community Picks

UHF X11: X11 Built for VisionOS and Apple Vision Pro — A clever bridge that stresses input and windowing on visionOS; useful for thinking about latency and pointer semantics before you ship.

Show HN: Ember, a native iOS Hacker News reader I built around accessibility — A solid reference for VoiceOver and dynamic type in a real feed app; worth skimming the navigation and focus handling.

Goodbye, Manual State Notifications. Hello SwiftData — Early field notes that mirror what teams are reporting: fewer hand-rolled observers, simpler mental model.


Until Next Time

If App Intents are giving you “works here, not there” vibes, the Big Story walks through a setup that makes host mismatches obvious and response text stable. Read it, try the attach-at-launch flow, then hit reply with what your signposts revealed—or jump into the LinkedIn thread and share your setup. And if this helped, forward to a teammate who’s knee-deep in Shortcuts right now.