Build1 distinct publisher2 min readUpdated
A practitioner post argues a server buys a two-person iOS app nothing. It also, without saying so, trades four operational costs for four client-side correctness problems.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The trade on offer here is substitution, not subtraction. The post's case against a backend lists four costs a server adds to a two-person game or icebreaker: latency, a line item, an account system nobody wants to sign up for, and a single point of failure for a feature that is two people in the same room [3]. The peer-to-peer version hands four obligations back, all of them inside your client. Decode incoming data off a background queue and hop to main before touching published state, or SwiftUI drops the update without complaint [8]. Render `.connecting` as its own screen, because a handshake that takes a couple of seconds reads as a frozen app [12]. Impose ordering yourself, either by sending one serialized snapshot per update or by carrying a sequence number [13]. And rebuild the link when discovery works and then drops mid-session, which the author names as the part everyone forgets to build [14]. Four operational costs out, four correctness problems in [1].
The best idea in the piece is the smallest. Early versions had Host and Join buttons, and users picked the wrong one, or one app opened its browser late and missed the advertisement window entirely [10]. The fix is to advertise and browse on both devices from the moment the screen opens and let whichever pairing the OS completes first win [11]. That takes the number of setup choices a user can get wrong from one to zero [2], and it follows from the shape of the API rather than fighting it: both peers run both roles anyway, so there is no host to designate [7].
Everything else in the connection model derives from a single delegate callback. `didChange` maintains `connectedPeers`, and the author's rule is to derive all connection state from that array rather than keeping a separate flag that can disagree with it [9]. Configuration is one string, lowercase, one to 15 characters, hyphens as the only punctuation [5], and the template asks for required encryption on the session, so the link is not something you bolt on later [16].
What the post does not supply is measurement. It says Bluetooth and peer-to-peer Wi-Fi differ in range and reliability, and that an app tested on a desk with both radios strong will surprise you in a noisy room [14], but no ranges, no discovery times. The reconnect gap it identifies is named and left there: the listings cover session setup and the two delegate callbacks, not recovery [3]. Which makes the closing promise of a five-minute addition with no backend ticket [15] true only of the part that was already easy.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
MCSession is the pipe data flows through, MCNearbyServiceAdvertiser broadcasts availability, and MCNearbyServiceBrowser looks for those broadcasts.
In practice both devices run advertiser and browser roles simultaneously, so the design is two peers rather than a client and a host.
The didReceive data callback fires on a background queue, and touching @Published state without hopping to main first causes SwiftUI to silently drop updates.
The didChange callback is the entire connection-state model; the author advises deriving everything from connectedPeers rather than keeping a separate is-connected flag.
Early versions of the author's apps had Host and Join buttons; users picked the wrong one, or one app was slow to open the browser and missed the advertisement window entirely.
The author's rule is to advertise and browse on both devices from the moment the feature screen opens, letting whichever connection the OS completes first win so neither user makes a choice that can be wrong.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One practitioner account with runnable code, no corroboration
The framework mechanics, delegate behavior, service-type constraints and encryption setting are shown directly in the post's own code listings, which makes the technical core internally checkable and specific. But the cluster has a single source and a single author, no Apple documentation, issue reports, or second practitioner to confirm behavior, and the evaluative claims (tutorial landscape, server costs, effort estimate) carry no measurement at all.
No adoption signal in supplied sources
The cluster contains no release, deployment, download, usage, benchmark, or pricing disclosure. The author refers generally to phone-to-phone experiences he has shipped but names no app, user count, or install base, and no third party reports using the pattern, so no adoption level can be measured without guessing.
Solid mechanics, overstated effort and cost story
Positive but moderate. The technical guidance is concrete and largely self-evidencing, so the gap is not in the mechanics; it is in the framing. The post asserts a server buys nothing without any figures, then closes on local multiplayer as a five-minute addition, while its own body introduces four client-side correctness obligations and supplies no reconnection code for the very failure mode it calls the one everyone forgets. A reader following the article verbatim ships an app that works on a desk with both radios on.
Low commercial stake, practitioner credibility building
The author promotes no product, SDK, or service of his own: MultipeerConnectivity is Apple's, and the recommended architecture removes rather than adds vendor spend. The visible incentive is reputational — a developer-community post that cites his own shipped phone-to-phone apps and frames a pattern he already uses as the correct one, which plausibly explains the unhedged framing that a server buys nothing and setup takes five minutes. No sponsorship, affiliate, or funding disclosure appears in the source.
Moderate on mechanics, low on the story overall
Confidence in the code-level assertions is reasonably high because they are demonstrated in listings and internally consistent. Confidence in the story as a whole is held down by a single publisher and single source, complete absence of adoption evidence, unquantified economic comparisons, and an effort estimate the article's own content undercuts.
build
Splitting a SwiftUI body into computed properties tidies the file, not the view tree1 distinct publisher
build
Thirty minutes a day, and none of it from letting the agent write Swift1 distinct publisher
build
One game, two codebases: where parity belongs when you ship native on iOS and Android1 distinct publisher
build
Eleven bugs, one HStack: what a five-minute XXXL screenshot pass found that code review didn't1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 23, 2026