All Issues

iOS Dev Weekly — Issue #20

Opening

Telemetry in shipping apps is getting noisier even as observability gets more powerful. Teams wrestle with high-cardinality logs and ad-hoc identifiers that hide real latency and causal boundaries — which makes debugging expensive and iteration slow. This week I show a practical pattern for emitting low-overhead, platform-visible intervals that survive async hops without creating telemetry debt.


This Week’s Big Story

Instrumenting iOS Apps with OSSignposter

OSSignposter lets you emit intervals that map directly into Instruments and MetricKit, giving you causal structure instead of a flood of one-off logs. Used well, signposts avoid high-cardinality metadata and make performance signals actionable in production. Read the piece to see the rollout and sampling trade-offs that actually matter when you scale this across users.


Trend Signals

• Expanding Swift’s IDE Support — Swift is being enabled in more editors through VS Code extension compatibility, which could shift where teams author and review Swift code. [Source: Swift.org Blog]

• Get Bootcamp Training to Make Real-World iOS Apps — there’s ongoing demand for pragmatic training focused on shipping maintainable apps, not just UI demos. [Source: Medium]

• I Plugged Ollama Into My iPhone Keyboard — people are crafting self-hosted ML tooling for iOS integrations, showing appetite for local inference and bespoke stacks. [Source: dev.to]


Swift Snippet of the Week

import SwiftUI
import OSLog

private let networkSignposter = OSSignposter(subsystem: "com.example.app", category: "network")
private let signpostName = "HTTP Request"

struct InstrumentedNetworkView: View {
    @State private var lastDuration: TimeInterval?
    var body: some View {
        VStack(spacing: 12) {
            Button("Fetch Resource") {
                Task { await fetchDemo() }
            }
            if let d = lastDuration {
                Text("Last request: \(String(format: "%.2f", d))s")
            }
        }
        .padding()
    }

    func fetchDemo() async {
        guard let url = URL(string: "https://api.example.com/resource") else { return }
        let id = networkSignposter.makeSignpostID()
        // Begin interval with a stable name and bounded metadata (host only)
        networkSignposter.beginInterval(signpostName, signpostID: id, "host: %{public}s", url.host ?? "unknown")
// … (truncated for newsletter)

This pattern matters because it encodes the judgment to keep signpost names stable and metadata bounded so traces remain queryable and cost-controlled as you scale.


Community Picks

More community links next issue.

https://medium.com/@anusandanam675/get-bootcamp-training-to-make-real-world-ios-apps-d3ec49a3f6eb?source=rss——ios-5

https://dev.to/omachala/i-plugged-ollama-into-my-iphone-keyboard-heres-the-full-self-hosted-stack-1ii8

https://abhishek-kureriya.medium.com/scriber-i-built-a-macos-app-that-turns-your-voice-into-polished-messages-30ad84ce0500?source=rss——swiftui-5


Until Next Time

If you instrument production, start with a small, sampled rollout and stable signpost names — profile in staging with Instruments and watch MetricKit for unexpected cost. Hit reply with the tradeoff that surprised you most when sampling traces in production, or forward this to a teammate who owns telemetry. I’ll roundup notable replies next issue.