iOS Dev Weekly — Issue #59
Opening
App Intents are the new growth surface, but they’re fragile: one flaky macro target in CI and your extension silently drops from a release. Teams are also relearning that generated code can hide entitlement or lifecycle mistakes until Shortcuts or Spotlight simply stop surfacing your features. This week is about treating macros like production code, not a convenience.
This Week’s Big Story
Generate App Intents with Swift 6.3 Macros
When macros synthesize 80% of your Intent boilerplate, you win back cycles for the two things that matter: identity and execution. The cost is real if CI, entitlements, or extension lifecycles drift beneath what generation assumes. The piece digs into attached macros, opt-outs, and the guardrails that keep discoverability alive across releases.
Trend Signals
• Apple says more ex-employees may have taken confidential data to OpenAI — security posture appears to be tightening, so expect sharper audits around AI SDK integrations and internal tooling. [Source: HackerNews]
• What’s new in Swift: June 2026 Edition — the language cadence is steady post‑WWDC, and teams should budget time to adopt incremental Swift 6.3 improvements rather than batch it next year. [Source: Swift.org Blog]
• withContinuousObservation Re-Arms a One-Shot Tracker — observation is maturing in practice; re-arming patterns can simplify state sync without overusing Combine or custom publishers. [Source: Medium]
Swift Snippet of the Week
import AppIntents
import Foundation
actor TodoStore {
static let shared = TodoStore()
private var open: Set<String> = ["A1", "B2", "C3"]
func complete(id: String) async throws {
guard open.remove(id) != nil else { throw NSError(domain: "Todo", code: 1) }
}
func suggest(prefix: String?) async -> [Todo] {
let ids = open.filter { p in prefix.map { p.hasPrefix($0) } ?? true }
return ids.map { Todo(id: $0) }
}
}
struct Todo: AppEntity, Identifiable, Hashable, Sendable {
static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "To‑Do")
static var defaultQuery = Query()
var id: String
var displayRepresentation: DisplayRepresentation { .init(title: "\(id)") }
struct Query: EntityQuery {
func entities(for identifiers: [String]) async throws -> [Todo] { identifiers.map { .init(id: $0) } }
func suggestedEntities() async throws -> [Todo] { await TodoStore.shared.suggest(prefix: nil) }
func defaultResult() async -> Todo? { try? await suggestedEntities().first }
}
// … (truncated for newsletter)
Actors for intent data access plus explicit default queries give you deterministic concurrency and predictable discovery behavior, which is exactly what you want when Shortcuts indexes your world at 2 a.m.
Community Picks
Apple says more ex-employees may have taken confidential data to OpenAI — Worth a read for the compliance angle; inventory where your app and tooling touch third‑party AI.
withContinuousObservation Re-Arms a One-Shot Tracker — Practical pattern for re-arming state observation without bespoke plumbing.
withContinuousObservation Re-Arms a One-Shot Tracker — Same topic, different lens; useful if you’re deep in Swift concurrency migrations.
Until Next Time
If App Intents are part of your product surface, read the feature piece and tighten your macro strategy before CI does it for you. I’d love to hear how you’re balancing generation with hand-written intent logic—hit reply, or jump into the LinkedIn thread and share your safeguards. And if this helps, forward it to the teammate who owns your Shortcuts integration.