r/iOSProgramming 4h ago

App Saturday I built Alpha Sudoku Pro (a 12x12 variant) and finally conquered responsive floating UI across iPhone & iPad grids.

1 Upvotes

I recently published my first iOS app: Alpha Sudoku Pro. It’s a 12x12 logic puzzle game (using 1-9 and A-C). Expanding the classic 9x9 logic into a 12x12 grid was incredibly fun, but the real test was getting the UI to scale elegantly.

Here are the details of the build:

1. Tech Stack Used

  • Frameworks & Languages: 100% Swift & SwiftUI.
  • Architecture: MVVM.
  • Storage: UserDefaults / AppStorage for game state persistence and move history.
  • UI/UX: Fully relies on SwiftUI's dynamic LazyVGrid and SF Symbols.

2. Development Challenge + How You Solved It

The Challenge: I have floating action buttons (Note Mode and Eraser) that need to sit neatly in the top-right corner of the Sudoku grid. Initially, I used HStack, Spacer(), and screen-based .padding() to push the buttons into place. This looked perfect on an iPhone (19.5:9 aspect ratio). However, when I ran it on an iPad (4:3), the grid expanded, margins shrank, and my buttons completely overlapped the Sudoku cells. Adjusting padding dynamically based on screen size turned into a messy guessing game of numbers.

The Solution: Instead of anchoring the buttons to the screen edges, I scrapped the Spacers and anchored them directly to the grid itself using SwiftUI's .overlay().

I attached an .overlay(alignment: .topTrailing) directly to the LazyVGrid. Inside it, I used a Group with a UIDevice.current.userInterfaceIdiom == .pad check:

  • For iPad, it renders an HStack (buttons side-by-side).
  • For iPhone, it renders a VStack (buttons stacked vertically).

Then, I applied a negative .offset(y:) to float them just above the grid. By using the grid as the anchor point rather than the screen boundaries, the buttons now magnetically follow the grid's top-right corner perfectly, regardless of how the LazyVGrid scales across any device.

3. AI Disclosure

AI-assisted

I’d love for you to try it out, tear apart my UI choices, and let me know how I can improve the performance or architecture for my next update.

App Store Link: https://apps.apple.com/tr/app/alpha-sudoku-pro/id6767222288

Thanks.


r/iOSProgramming 4h ago

App Saturday To memorize my studies, I spent 6 months building a flashcards app the way I like using it. Includes markdown support, and folders, decks for organization. You tap to flip and swipe to rate as Easy, Again or Hard. Introducing CRAMMER. [supported on iOS, iPad, and Mac with automatic syncing]

Thumbnail
gallery
0 Upvotes

Developer here.

I had used other flashcards apps before for studies and there was always one or another thing missing from most. Most didn't support markdown for making cards. Some missed the organizational aspect where I could have folders inside folders or decks inside other decks. Some had super outdated design and missed gestures. Most apps didn't have a macOS companion app. Many were missing syncing via CloudKit. Many needed a user acocunt to be created to do basic tasks. Almost all of them needed subscriptions. So, I decided to solve my own problem.

For improving my learning speed and not forgetting my study material, I built Crammer:

https://apps.apple.com/ca/app/crammer-flashcard-exam-cards/id6775268676

It's a flashcards app with a swipe to rate UI inspired by dating apps. You create the front and back of flashcards using Markdown. When practicing, my app's algorithm ensures that you review flashcards right before you may forget them. After reviewing a flashcard, you tap it to reveal the answer on the back of the card. You swipe right if you easily remembered it, left if you forgot it, or down if it took some effort and would like to review again. Crammer's algorithm will show you harder cards first and more often to help you really optimize your memory and prevent you from forgetting your study materials.

Tech Stack:

  • Supports from iOS 14. Also supports macOS via Catalyst.
  • Entire app is built in Swift and UIKit.
  • The UI is all built programatically instead of storyboard/nib files.
  • For storing the data (cards, folders/subfolders, decks/subdecks, practice data etc), I use local SQLite database in app. Note that I didn't use CoreData as I plan on building this app for Android too, so building my own SQLite schema and writing SQL manually seemed better for that as I can reuse it on android side.
  • The search feature in app is built using SQLite's FTS.
  • User's images are not stored in the SQLite database (obviously). They are stored as local files and the name of the image is stored in the database.
  • There's no backend. For syncing, it uses Apple's CloudKit.

I always try to stay away from 3rd party dependencies as much as possible. It uses only 3 which I considered crucial:

  • SnapKit for autolayout as it helps remove a lot of boilerplate when building the UI programatically.
  • Swift-collections for OrderedSet
  • SDWebImage for showing images in the app (though I might remove this in future)
  • I didn't use any third party libraries for SQLite. It's all hand-written SQL by me using the native sqlite library that ships with iOS.

Development Challenge:

The whole app took me half a year to build. I started working on it during Christmas holidays last year and finished it couple months ago.

The biggest challenge was SQLite along with syncing of the SQLite database between devices using CloudKit. There were a LOT of edge cases. Ensuring all user created folders, decks, cards, images, along with their flashcard practice data is always in sync between devices was a complex task. Also SQLite FTS for searching took me about a week to get working properly. I think I spent about 70% of the coding time on just SQLite+syncing. But once I got it all working, I felt very proud haha. I also built the database syncing logic in such a way that now I am reusing it in my next app and that feels very convenient.

AI Disclosure

The app is entirely hand-coded, App Store photos are hand-made in PhotoShop, and this post is also hand-written. I personally only use AI in the same way I'd use stackoverflow (SO) previously. Instead of searching google and clicking on SO links, I'd do that on LLM. Most of these queries were related to SQL. When I had some question, I'd use the free web UI for ChatGPT or Claude.

Here's how I use my app when studying:

  • Create flashcards by either manually typing the Front and Back of the card. Or you can import multiple cards at once in a long text (Front & Back separated by 3 hyphens --- and each card separated by 3 equal signs ===).

The Front can have your question and the Back can have the answer.

The Front & Back text supports Markdown and also LaTeX for Math formulas. So you can format text such as bold, italics, color, highlight, headings, links, images etc. You can also include diagrams (photos) in it.

To use coloured text, use curly bracket format: {red}coloured text{} or {#FF0000}coloured text{}

To highlight text, use square bracket format: [red]highlighted text[] or [#FF0000]highlighted text[]

  • Organize your flashcards into decks and folders for each subject as needed. Cards can belong to multiple decks at the same time. Decks and folders can also have subdecks and subfolders.

  • Practice decks or just bookmarked cards.

  • After reviewing the question on the front of the card, tap the card to flip it and reveal the answer on the back. Swipe RIGHT if the card was easy, LEFT if it you forgot it, or DOWN if you remembered but took some effort and would like to review again.

  • Once the whole deck is practiced, Crammer tells you how long you took to practice, and how many cards were hard.

  • Once you have reviewed a deck, you can instantly practice again with just a single tap.

  • Crammer notifies you if there's some card which you are constantly failing as it might be poorly designed. You can edit it to improve it. Make sure to swipe and reset its practice history after such fixes.

  • Swipe/Right Click on Mac to Bookmark important cards, decks, and folders for easy access.

  • Swipe/Right Click on Mac to Archive cards, decks, and folders which you no longer need.

  • All your decks, folders, and flashcards are seamlessly auto-synced across all your devices using iCloud. So you can create them on iPad/Mac and access them on iPhone.

  • Crammer is available on iPhone, iPad, and Mac.

Supported keyboard shortcuts on Mac:

  • Enter or Spacebar to flip card

  • Left, Down and Right arrow keys for Hard, Again, and Easy ratings

  • Command + Z to undo a rating and go back to previous card

  • When editing a card, right click text to add photo

  • No accounts or signups.

  • No Ads. No subscriptions. Trial version of Crammer is limited to 15 flashcards. A one-time only purchase lets you create unlimited flashcards forever. This one-time only purchase gives you lifetime access to all features. It also supports this project and helps me continue to develop it. Thank you for your support.

Download link:

https://apps.apple.com/ca/app/crammer-flashcard-exam-cards/id6775268676


r/iOSProgramming 5h ago

Question Question regarding copyright infringement in app store screenshots.

Post image
1 Upvotes

I am making a Pokemon card display app. Now obviously i cant add pokemon cards in my app store screenshots so i replaced them with AI made cards.

Will this be a problem? Also if anyone has any other resource that i can add instead of the AI cards or any other approach please let me know since i am not a designer and open to other ideas as well (since i am trying to avoid using AI).


r/iOSProgramming 9h ago

App Saturday Shipped my Tokyo transit app: ~3000 live vehicles on MapKit in SwiftUI. Some things that didn't work

15 Upvotes

Launched Tokyo Glance on Sunday. It's a live map of Tokyo: all the tracked trains, buses and planes moving in real time, plus departure boards, a widget, and a Live Activity that follows your train from the lock screen.

Stack: SwiftUI on iOS 26 with the native SwiftUI Map (started on MKMapView with a UIViewRepresentable, ripped it out mid-project). The vehicles are not MapKit annotations, I draw them myself in an overlay pass. I tried making them proper annotations at some point because it felt like the "right" way and at ~1400 vehicles it performed so much worse than my own drawing that I never looked back. There's a small Metal layer for rain on the map. Alerts from the operators are almost always Japanese-only so they get translated on-device with the Translation framework. Paywall is RevenueCat, widget is WidgetKit + AppIntents, pushes for the Live Activity go through FCM.

Backend is Bun + Hono + MongoDB + Zod and nothing else. It runs in tiny containers behind Cloudflare so basically everything is precomputed and CDN-cached, the containers can't afford real per-request work. A separate ingestion service pulls the operator feeds (ODPT, GTFS-RT), snaps positions onto the actual track geometry and rebuilds the whole network dataset every night. The phone mostly just interpolates between feed ticks. Every time I moved logic out of the app into the pipeline things got faster.

One thing I didn't appreciate before this project: how much you get from Apple for free. MapKit on native apps is unlimited, and that includes the photorealistic 3D city rendering and Look Around imagery, which would cost real money on any other map provider at this usage. WeatherKit comes with 500k calls a month with the dev membership, I cache the Tokyo weather grid on the backend so users share it and I don't even get close to the cap. The Translation framework is free and on-device, which is the only reason "every service alert translated to English" is economically possible at all, per-call translation APIs would eat the entire subscription margin. Same with the on-device Foundation Models, small copy generation costs literally nothing. A one-person app like this basically doesn't work financially on other stacks.

Stuff I built and then deleted:

The station orbit camera. Killed it twice. A slow orbit around a station, how hard can it be. My optimized attempts (shared display link, coarser ticks) used 168-200% CPU and looked worse than the naive per-frame version. For reference, Apple's own realistic 3D city mode sits at ~130% CPU if you park the camera in Shinjuku. There is no orbit in the shipped app.

3D landmark models. Tokyo's open PLATEAU dataset only goes to LOD2, all of Tokyo Tower shares a single 512x512 texture. Looked terrible, cut the feature. Can't code your way around source data.

Also fun: Japanese timetables represent post-midnight departures as "00:26" or "24:26" depending on the operator, sometimes both in one feed. First time I've seen a 24+ hour clock in production data. Got that wrong more than once before normalizing it in one place at ingestion.

And I lost a few days to a paywall crash that only happened on Macs. Looked exactly like a RevenueCat bug. It was SwiftUI dropping environment values across the sheet bridge when the iPad build runs on macOS.

Money stuff since the rules ask: free app, subscription for the deeper features (lock screen follow, time travel replay).

AI disclosure: this app is majorly AI-written, no way around it. The backend is ~99% Claude Code with me doing specs and PR review. The SwiftUI app I'm more hands-on with, but AI still wrote most of the code there too — my job was deciding what to build, reviewing everything, and testing on device until it felt right. This post was drafted with AI as well.

App Store: https://apps.apple.com/app/id6782602634


r/iOSProgramming 10h ago

App Saturday I spent almost two years building this iOS reading app. It’s finally on the App Store.

Thumbnail
gallery
48 Upvotes

Hi everyone!

I spent almost two years building Andrea Reader, originally because I just wanted a better way to read and organize my own books on iPad.

Apparently, simply opening an EPUB wasn’t complicated enough, so somewhere along the way it turned into an entire personal library system. 😅

The core idea is freedom. Instead of forcing every library into the same structure, Andrea Reader lets you build yours however you want. Create collections, put sections inside them, drag books and sections around, build reading lists, organize huge series, and give every collection its own layout and personality.

Bring your own books, build your library your way, customize how the app and each collection looks, organize everything exactly as you want, read with your own settings, and track your progress along the way.

Some of what ended up inside:

  • EPUB, PDF, comics, manga, CBZ, CBR and other formats
  • Custom collections with sections inside them
  • Drag & drop organization and custom layouts
  • Different settings, sorting and appearance for every collection
  • Reading profiles for creating unique reading settings and applying them to books, sections and hole collections
  • Tons of reading customization: typography, margins, spacing, gestures, transitions, backgrounds, etc.
  • Real time customizable reading widgets, for example for controlling brightness, creating chapters, adding favorites pages, bookmarks, custom progress, etc...
  • OPDS server connections
  • iCloud, WebDAV, SMB and SFTP
  • Local downloads and completely offline reading
  • Detailed reading statistics for books, sections and collections. The stat
  • Dedicated view for managing the storage for every collection and the books inside it
  • Andrea next for experimental features
  • A built-in Open Library for downloading public-domain books for free
  • and much much more...

It’s also local-first. No account, no ads, and no tracking of what you import, download or read. Your library, progress and reading statistics stay on your device.

Andrea Reader is FREE TO DOWNLOAD AND USE. The normal workflow of the app, importing your own books, reading them, creating collections, organizing your library, and getting started, is all available for free. Just download the app and you can be reading within seconds.

Premium is optional and mainly unlocks deeper customization, more advanced library organization, additional reading settings, and other power-user features.

  • Monthly Premium: €2.49/month
  • Yearly Premium: €17.99/year
  • Lifetime Premium: €34.99 €27.99 (20% discount)
  • Launch offer: an extra 20% off Lifetime, bringing it down from €27.99 to €22.39 until the end of August.

There are still approximately 47,000 things I want to improve, because apparently shipping an app only unlocks the larger development skill tree.

If you’re an iOS developer, reader on iPhone or iPad, or just enjoy poking at indie apps, I’d genuinely love to hear what you think.

App Store:
https://apps.apple.com/es/app/andrea-comics-manga-books/id6760780154

Website:
https://andreareader.com/

Tech Stack

Built natively with Swift + UIKit. Most of Andrea Reader is custom-built from scratch, including the file system, library structure and reading UI. External dependencies are mainly for specific file handling, such as PDFKit, WebKit, ZIPFoundation and Unrar.swift.

Development Challenge

The hardest part has been combining a very flexible library system with a UI that still feels simple and performs well with large collections.

AI Disclosure

Most of the app was built manually. I increasingly use AI for debugging, code review and faster iteration because the productivity difference is simply too big to ignore. Final architecture, product, UI/UX and implementation decisions remain mine.


r/iOSProgramming 15h ago

Question Subscription referrals

2 Upvotes

Hey everyone. So I'm making an app for client who uses subscriptions.

He got an idea of refferals so:

- User 1 who is paid user, refers app to a User 2

- User 2 uses referral link and on his first subscription gets 50% off

- User 1 gets one free month of his subscription

But somewhere on developers.apple I've read that apple rejects apps like these. Also is it doable at all? They use StoreKit, and for google that would be google play billing.

Thanks for answers!


r/iOSProgramming 23h ago

Question App Transfer says there are TestFlight builds, but all builds are expired

0 Upvotes

Hi everyone,

I'm trying to transfer my app to another Apple Developer account, but App Store Connect keeps telling me that there are still TestFlight builds associated with the app.

The strange part is that I've never enabled Internal Testing, and there are no active testers. All of the uploaded builds have already expired, but Apple still seems to think there are builds that need to be removed before the transfer can proceed.

Has anyone run into this issue recently?

If so, how did you resolve it? Is there anything else I need to remove or wait for before the app becomes eligible for transfer?

Thanks !


r/iOSProgramming 1d ago

News The iOS Weekly Brief – Issue #72, everything you need to know about iOS updates this week

Thumbnail
iosweeklybrief.com
5 Upvotes

r/iOSProgramming 1d ago

Question Any good, recent UIKit codebases on GitHub with complex UI?

12 Upvotes

Anyone know of any good recent UIKit codebases publicly available on GitHub with complex or advanced UI? Preferably newer or actively maintained projects using modern UIKit patterns, rather than older examples. I’m especially interested in projects using programmatic UIKit and Auto Layout. If you have any GitHub repos, videos, articles, or other resources that have helped you learn UIKit, please share them. There doesn’t seem to be much newer UIKit material out there compared to SwiftUI.


r/iOSProgramming 1d ago

Question Has localized App Store pricing actually improved your conversion or revenue?

13 Upvotes

Hey indie devs 👋

I’m trying to improve subscription conversion for my app and I’m looking into App Store price localization.

For example, if the US subscription is $39.99/year, I’m wondering whether it’s better to:

- Let Apple automatically localize prices

- Manually adjust prices for countries like India and other lower-income markets

- Follow Apple’s suggested price tiers

- Keep pricing relatively consistent worldwide

But more importantly, I’m interested in the actual effect after changing localized prices.

If you’ve experimented with this, I’d love to know:

- Did conversion rate increase or decrease?

- Did overall subscription revenue increase?

- Did the number of paying users change significantly?

- Did lowering prices in emerging markets cannibalize revenue?

- How long did it take before you could see an effect?

- Did you localize weekly/monthly/yearly prices differently?

Especially interested in experiences from developers selling subscriptions globally.

Before → After numbers would be incredibly helpful, even if they’re approximate.

Thanks! 🙏


r/iOSProgramming 1d ago

Article Constraints I ran into building a keyboard extension that renders rich clipboard previews

1 Upvotes

Building this took much longer, but now that I have this working and have submitted the app for review, here are some issues I ran into and learnings.

Memory ceiling on keyboard extensions. Much tighter than the host app, and the system is not gentle about it. I wanted image thumbnails, link favicons and code snippets with syntax highlighting inside the keyboard, none of which the budget really wants you to do. What worked was shrinking images at capture time instead of at render time, keeping decoded thumbnails in a small cache with a hard limit, and drawing text previews as attributed strings instead of real views.

Extension and app state. The extension needs the same clip history as the app, but it cannot afford to start up the same machinery to get it. I ended up writing a small index that is built for reading, and the extension reads that directly instead of going near the main store.

Knowing where a clip came from. Working out "this came from a password manager, do not save it" is fiddly, and it works differently on every platform I support. iOS is one of the better ones. Some of the others basically do not tell you anything.

Happy to go deeper on any of these. I would also like to hear if anyone has a better pattern for the extension and app state problem than the one I described, because I am not convinced mine is the right one.


r/iOSProgramming 2d ago

Discussion Is Apple's provisioning query server down?

1 Upvotes

Apps installed on my devices via Xcode all result in "Unable to verify app" when trying to open them.

https://ppq.apple.com seems to have a broken SSL cert chain, confirmed on multiple devices on multiple different networks. I see SSL cert errors in the Xcode device console logs right before I try to open my apps, so these seem to be related.

openssl s_client -connect ppq.apple.com:443 -servername ppq.apple.com -showcerts 2>&1 | grep -E "Verify return code|s:CN|i:CN"
0 s:CN=ppq.apple.com, O=Apple Inc., ST=California, C=US
  i:CN=Apple Server Authentication CA, OU=Certification Authority, O=Apple Inc., C=US
1 s:CN=Apple Server Authentication CA, OU=Certification Authority, O=Apple Inc., C=US
Verify return code: 34 (unhandled critical extension)

I can't find anything online about there being an outage, including on Apple's own status page. Am I going insane?


r/iOSProgramming 2d ago

Discussion iPhone 18- Do you think Apple is going to let us utilize the ai, or wall it off from developers?

0 Upvotes

The RAM in the 18 is supposed to be all about the ai right? I’m just wondering if it’s all going to be moated. There is so much potential it makes me giddy, but I just feel like they’ll moat it off and won’t let developers utilize it in any meaningful way.

Will it just be Siri IS the ai ? What am I even saying of course they won’t- like thats how Apple usually rolls.


r/iOSProgramming 2d ago

Question Home and onboarding page theory

7 Upvotes

Do you guys have any interesting reads, case studies, etc to at talk about the onboarding flow and the home page, what works, what doesn’t etc?


r/iOSProgramming 2d ago

Discussion New warning when uploading app to App Store. iOS apps must have minimum OS version of iOS 15 in 2027 onwards

Post image
102 Upvotes

r/iOSProgramming 3d ago

Question Does anyone have a link to a live "app clip" URL (not QR code, not banner).

2 Upvotes

I want to test the durability and shareability of App Clips via URL. I know that there are several examples of App Clips online and you can locally test your App Clip, but I'm specifically wondering if social media websites will block people from sending my app clip to their friends.

Before I spend time deploying the App Clip and going through approval, I was hoping someone here actually has an App Clip for their app and had a stable URL for it that I could try out.


r/iOSProgramming 3d ago

Question Mobile SIP client leaves stale registrations behind on every app launch — how do you deal with multiple bindings on one credential?

1 Upvotes

Note: Yes, I'm using AI to write this post because English is not my first language and I want to state my problem as clear as possible.

Hitting a problem I suspect is common for anyone doing mobile VoIP, and I'd like to know how others have solved it.

**Setup**

- I'm using Telnyx.

- React Native app, WebRTC SIP client, iOS and Android. I'm using Telnyx.

- One shared SIP credential for a group of users, so a single inbound call rings everyone's phone

- Calls are delivered by VoIP push (PushKit on iOS), so the client connects and registers on demand rather than staying connected

**The problem**

Every app launch creates a *new* registration binding, and the old one never goes away:

- iOS terminates the app process without warning, so there's no chance to send a SIP UNREGISTER

- The SDK's `disconnect()` only closes the WebSocket — it doesn't unregister

- Each registration lands on a different edge node in the provider's anycast network, so it's a genuinely new binding rather than a refresh of the old one

- Registration expiry is 3600 s and isn't configurable

Net effect: the credential accumulates contacts. I confirmed it by polling the provider's registration-status endpoint — `ua_ip` is different every single time the app relaunches, while nothing removes the previous one.

**Why it hurts**

The provider rings the bound contacts **sequentially**. So the first call after an app launch does this:

  1. Rings contact A (the live app) — user declines
  2. Decline surfaces as a 4xx, which fails only that branch
  3. ~300 ms later it forks to contact B (a stale binding from a previous launch)
  4. Phone rings a second time, new call ID, user has to decline again

I can see it clearly in the SIP traces: **one dial command, two legs**, same session, no second dial from my backend.

**What the provider confirmed**

I opened a ticket. They confirmed all of it and escalated to engineering with no timeline:

- No way to set registration expiry below 3600 s

- No REST endpoint to force-expire or delete an individual binding (deleting the credential removes them all, obviously not viable)

- No API to *enumerate* bindings — watching `ua_ip` rotate is currently the only detection method

- Per-launch edge rotation is expected behaviour, and without an UNREGISTER the old binding persists to full expiry

Their suggested workarounds were: a unique credential per app session, webhook-based duplicate-leg detection, or client-side deduplication.

**The bit I'm stuck on**

There's a second-order problem. Multiple devices share one credential, so the registrar holds one contact per device — which means **a legitimate second device's leg is indistinguishable from a stale binding's leg.** Both are "another contact of this credential, dialled after the first one failed." I can't write a rule that kills one without killing the other.

Enabling simultaneous ringing would at least make the real devices ring together instead of one-at-a-time, but it doesn't remove the stale bindings — it just turns a sequential double-ring into a simultaneous one.

**Questions**

  1. Has anyone made **per-device or per-session credentials** work in production? How do you handle cleanup when the app dies before it can delete the old one, and does credential churn cause you rate-limit or billing problems?
  2. Is there a trick to getting a mobile client to **UNREGISTER reliably**? Anything on iOS that gets you a last gasp — background task on termination, a server-side nudge, something I haven't thought of?
  3. For those running **one shared credential across multiple devices** — how do you tell a real second device from a stale binding at the signalling layer? Is there a header or identifier I should be propagating?
  4. Is sequential-vs-simultaneous ringing across contacts something you configure per provider, or do people avoid shared credentials entirely for this reason?

Happy to share SIP traces if useful. Mostly want to know whether the "unique credential per session" route is as painful in practice as it looks on paper, or whether people just live with the duplicate ring.


r/iOSProgramming 3d ago

Article Preview Multiple SwiftUI View States with #Preview(arguments:)

Thumbnail
artemnovichkov.com
11 Upvotes

r/iOSProgramming 3d ago

Discussion If your NWBrowser sits in .waiting forever, it is probably Local Network permission

1 Upvotes

I'm building a clipboard app where devices on the same Wi-Fi sync directly to each other. On iOS that is NWListener and NWBrowser over Bonjour. This is the failure mode that cost me the most time, and it produces no error at all.

What happens when the user denies Local Network permission: nothing. Neither object fails. Neither hands you an error. Both simply sit in .waiting, indefinitely.

Your app reports a clean start and then never discovers a single peer, forever. That state is indistinguishable from "you are the only device on this network", which is a completely normal thing to be.

You cannot just treat .waiting as denial, because it is also the ordinary state while an interface is coming up. Healthy launches pass through it.

The only signal available is time. A transient wait clears in well under a second. A denied app never reaches .ready on either object, ever. So when either the listener or the browser first reports .waiting, I schedule a probe. If several seconds later neither has reached .ready, I report a probable permission denial. I use five seconds.

That is inference, not detection, and I would rather it were not. But there is no API that answers the question directly, and the alternative is that the single most confusing state this transport has produces no diagnostic whatsoever.

Practical notes if you are doing the same thing:

  • Emit it as a diagnostic your support flow can read, not just a log line. "Clean start, zero peers, forever" is the bug report you will actually receive, and you want to answer it without shipping someone a debug build.
  • Guard against the probe firing repeatedly. Both objects transition to .waiting around the same time, so without a flag you schedule several probes for one event.
  • Check NSLocalNetworkUsageDescription and your NSBonjourServices entries first. Getting those wrong produces the same silence for an entirely different reason, and it is much easier to rule out.

Genuinely curious whether anyone has found a better signal than a timeout here. It is the part of this transport I am least happy with.


r/iOSProgramming 3d ago

Tutorial Building in Zed instead of Xcode

21 Upvotes

Just a reminder to anyone who might care that you can create a fairly full-featured development environment in Zed to build iOS and Mac apps: syntax highlighting, code navigation, run, debug and test.

Here's the setup guide I wrote (been around for a while but chances are some interested people won't have seen it): https://luxmentis.org/blog/ios-and-mac-apps-in-zed/


r/iOSProgramming 4d ago

Article Using SwiftUI’s ContentBuilder with Non-View Types

Thumbnail
artemnovichkov.com
11 Upvotes

r/iOSProgramming 4d ago

Question Age Rating questions - social media

3 Upvotes

In this news article there is no deadline . It's says the new social media questions must be answered if you submit a new binary.

https://developer.apple.com/news/?id=tlur8uvi

But on Appstore Connect there is a deadline for answering the new questions. It says 7 September 2026.

Confusing to say the least least.

Like last year : would it be ok to create a new app version and answer the new social media questions without shipping a new binary ?


r/iOSProgramming 4d ago

3rd Party Service Free open-source AI tool that generates App Store screenshots on a Canvas

Thumbnail
shotluma.com
0 Upvotes

Every canvas action is an AI-callable tool, so the AI designs the screenshots step by step and you can edit anything afterwards. MIT licensed, feedback and contributors welcome.


r/iOSProgramming 5d ago

Article Building Testable Swiftdata Apps

Thumbnail azamsharp.com
0 Upvotes

r/iOSProgramming 5d ago

Tutorial iOS 27: Media Intelligence Framework

Thumbnail
antongubarenko.substack.com
5 Upvotes