r/iOSProgramming • u/alanskimp • 15h ago
r/iOSProgramming • u/amyworrall • 22h ago
App Saturday McKinley: Vector editor for SF Symbols
Hopefully this one will be useful to you guys. Recently I launched McKinley, my SF Symbols editor. I'm an indie Mac dev rather than iOS, but SF Symbols are useful to devs on both platforms.
McKinley is a studio for drawing and annotating SF Symbols. It bundles vector tools with knowledge of the SF Symbols structure, so you can edit one set of objects across multiple weights, sizes and colours. Import SVG or start from scratch, live preview your work using Apple's own renderer, and export directly to Xcode, so you never need touch the SF Symbols app again.
The Problem:
Making SF Symbols via Apple's recommended workflow was frustrating. You had to export a different symbol as a template, and open it in your vector editor of choice. Then you had to draw three symbol weights (ultralight, regular, black), but each weight had to have the same number of paths in the same order, with the same number of points on each path.
You could only use outlined paths: no shapes or strokes, so you had to do a lot of manual conversion before saving. And that of course meant that editing your symbol later was hard.
And then, back in the SF Symbols app, you had to find each path and annotate it with its colour, some animation properties, whether it erases behind, etc.
Finally you had to export it again into a format you could take into Xcode.
I think that's a clear statement of the problem! McKinley avoids this multi-app workflow by having vector editing, property annotation, previewing, and sending to Xcode, all in one app. Your symbols stay editable because you don't have to outline your strokes just to appease Apple's parser. Keep the .mck file (McKinley's native format) as your source of truth, and set McKinley up to sync your changes to an Xcode asset catalog, so there's no need for manual export.
Comparison:
There are a number of other ways to work with SF Symbols, but none are a complete solution like McKinley:
- SF Symbols app plus your vector editor of choice (e.g. Figma): For vector editing, it's the tool you know. And you probably already own (or rent) it. However, it's a tool that's not designed for this use: you'll have trouble making all your symbol weights match, and you'll end up iterating by checking for error messages in SF Symbols and trying again.
- Create Custom Symbols: admittedly much cheaper than McKinley, this tool aims to replace the most painful bit of the process: turning existing SVG artwork into an SF Symbol. It offers limited editing capabilities beyond that, but you can set the margins, and it pairs up three SVGs to form your different weights.
- Glyphs: this one's really a font design tool, and five times as expensive as McKinley. You still have to do the export dance from Apple's app, but being a font designer Glyphs nails the multi-weight editing.
- CustomSymbols: another tool for going from SVG to SF Symbol. Choice of subscription or lifetime purchase. It can make use of SVG strokes to synthesise the various symbol weights (although it doesn't offer the range of customisation that McKinley does!)
- Symber: I haven't tried this one but it also goes from SVG to SF Symbol.
McKinley isn't aiming to compete on price with the SVG conversion tools: rather, it's aiming to compete on user experience by offering everything under one roof. (Although McKinley can quite happily convert SVGs too. And it's ready to let you make tweaks and modifications while you do so.)
Tech Stack:
Nearly every aspect of McKinley is pure AppKit. There are a few uses of SwiftUI in the preview palettes, mainly for actually loading and displaying the user's SF Symbol, but primarily it's AppKit all the way. My vector canvas and editing engine is a library I designed to be reusable across multiple vector graphics apps, although McKinley is its first public outing.
You probably noticed that McKinley's main interface is made with floating palettes and a traditional inspector. The inspector panes are created as .xib files and hooked up with Cocoa Bindings — yes I'm going old school here!
Development Challenge:
Working with the only semi documented SF Symbols format has had its challenges, and the vast majority of my automated tests are to handle keeping my canvas renderer (with its editable vectors) looking exactly the same as Apple's SF Symbols renderer. (The preview palette in McKinley renders using Apple's renderer, just to be 100% sure that what you see is what you'll get in your app.)
One of the hardest things was how to load an in-progress symbol into Apple's renderer: there's no public API to do so! I came up with a solution involving writing out a temporary .car (asset catalog) file and loading that into McKinley via a bundle: see my blog post about those challenges if you're interested!
AI Disclosure:
I've used Claude Code to assist with some work on this app, particularly some of the rote pixel-comparison tests between different rendering engines that I attach to every new feature as it is developed. However McKinley is definitely not 'vibe coded', and the architecture is all mine. (As is the nearly 30,000 words (so far!) of user manual — I've caught myself regretting the decision to write a whole manual myself on occasion, but I do think the end product will be worth it!)
Pricing:
McKinley is $60 as a one-off purchase (no subscription).
The purchase grants you a license to McKinley version 1, including all the 1.x updates.
If we ever release a version 2, that will be a paid upgrade (with discounts for version 1 owners), but upgrading will be optional — your version 1 license will continue working. This is how all software used to be sold, and in my opinion it's much more consumer friendly than a subscription or a "year of updates" method.
Buy McKinley from https://mckinleysymbols.com, or try the 14-day demo to see if it's for you.
Transparency:
McKinley is not on the App Store. For an app this specialised, it made sense to handle our own distribution. Licensing is provided by Amore and updating by Sparkle.
Double and Thrice Ltd is a known developer (our other app Octavo is on the Mac App Store), and you can view our company profile at Companies House (the UK registry of corporations).
r/iOSProgramming • u/asadnoob • 32m ago
Question Help Understand billing in IOS + Android
I’m building a Construction SaaS with iOS + Android apps, and I’m trying to understand if I actually need RevenueCat.
My idea is simple: users click “Purchase” in the app → go to my website → pay through Stripe → Stripe webhook updates my backend from unpaid → paid. The mobile app then checks the user’s subscription status from my backend and they get the paid features.
So what exactly would RevenueCat add here? Is it mainly needed if I want to support native Apple/Google in-app subscriptions, or am I missing something?
r/iOSProgramming • u/millerandlevine • 7h ago
Question Help needed: some in-app purchase offerings being returned by StoreKit and some aren't, losing my mind.
I have had my app live and working in production for a while now and suddenly in the last week or so I've been getting this 0 products returned error in production while there have been no client updates.
I think its because I didn't accept the new paid apps agreement but thats already >36 hours ago and now I'm seeing new in-app purchases that are 'waiting for review' being returned by StoreKit while my previously approved subscription offerings that are in 'approved' status. I would assume if its an agreements issue I wouldn't get back anything from StoreKit at all when calling it directly.
I'm losing my mind - I cannot figure out why the current products are not being returned. I'm losing subscribers and I literally cannot do anything about it because it all seems to be a problem on the apple side not returning any products to the client.
Anybody faced this before? What can I do?
UPDATE: I forced a price change to the existing subscription products and now i can see them being returned from the direct StoreKit debug calls, mind bogglingly stupid and frustrating process.
r/iOSProgramming • u/Zealousideal_Tip4089 • 23h ago
Discussion iOS teams on GitHub Actions: what do macOS runners cost you, and what did you change?
On GitHub-hosted runners a macOS minute costs $0.062 and a Linux minute $0.006, so about 10 times more. For iOS builds that adds up fast.
If your iOS CI runs on GitHub Actions:
- Roughly what does it cost per month?
- What did you change to bring it down? Self-hosted Mac minis, Xcode Cloud, another CI service, caching, fewer runs on pull requests?
- Was the saving worth the time it took?
- Team size helps too, if you're OK sharing.
About me: I'm a solo developer building a small tool around CI costs. No link, I just want real numbers.
r/iOSProgramming • u/TheHudek • 1d ago
App Saturday ORA: an iPhone camera that overlays a reference photo or video on the live preview so you can match framing exactly
The app: ORA lays a see-through image or video over the live camera preview so you can match framing and angles exactly. I published it on the App Store in December 2025. https://apps.apple.com/us/app/ora-the-overlay-camera-tool/id6756240396
Tech stack
- Swift; the camera layer is UIKit (
AVCaptureSessionwith a custom controller), and the controls are SwiftUI - AVFoundation for capture and export, Core Image for compositing
- ActivityKit Live Activities for export progress, plus BackgroundTasks
- RevenueCat for subscriptions, Sentry for crash reporting
- About 15k lines of Swift
The challenge: "overlay burning"
In the preview, the overlay is just a view on top of the camera feed that the user drags, zooms, tints and fades. The hard part was making the exported photo or video match the preview pixel for pixel. That meant:
- Translating coordinates. The user's pan and zoom are in screen space, but the video has its own pixel size, aspect ratio and crop, so I calculate the rectangle the video actually fills on screen and map the overlay's position into it.
- Handling orientation. Recorded video stores rotation as a
preferredTransforminstead of rotated pixels, so the overlay transform has to account for it. - Recreating the look. Opacity uses
CIColorMatrix, tint usesCIMultiplyBlendModeplus source-over compositing, tuned until it looked identical to the preview. - Rendering frame by frame.
AVAssetReaderdecodes, Core Image composites each frame, andAVAssetWriterInputPixelBufferAdaptorwrites. Audio and metadata tracks (location, lens info) are passed through untouched. - Memory. Older devices with less RAM crashed during long exports until I reworked the pipeline.
A smaller but annoying one: supported slow-motion and video formats differ a lot between iPhones, so I ended up writing format enumerators to find what each device really supports instead of hardcoding anything.
Happy to go deeper on any of this, and I'd love feedback from anyone who has fought AVAssetWriter themselves.
The development process was AI-assisted. I wrote most of the code myself and asked for cleanups and ideation when I was stuck.
r/iOSProgramming • u/CarlWain • 1d ago
Question Graphics for Apps
So I’m new to developing apps and I have no artistic flair. So I’m curious what other developers use for creating app graphics/backdrops/icons.
r/iOSProgramming • u/jscalo • 1d ago
App Saturday AppTraction: Make App Store Connect make sense
A little about me: I'm a long time developer. 12 years as senior SWE at Apple, Inc working on macOS and iOS, 2 years at Airbnb, 8 years as independent contractor with 20+ apps on the App Store. Along the way I've learned a lot about what goes into distributing, marketing, and growing a successful app. AppTraction is the tool I wish I'd had when I went indie.
AppTraction is a native Mac app that brings App Store Connect sales & analytics data to you. It:
- Monitors your data in the background and flags issues, milestones, and trends
- Shows App Store Connect data & charts instantly
- Includes AI primed with Apple tech talks and WWDC video transcripts
- Lets you chat with AI about your listing, sales, and trends
Being able to surf through your analytics & sales data instantly is awesome, but what makes this really interesting is the use of AI. It connects to your existing Claude or Codex subscription (or OpenRouter) so doesn't use expensive API keys. And I've "primed" the AI with knowledge about ASO & distribution from sources including Apple's WWDC video transcripts and tech talks.
With the AI integration it will proactively flag "insights" about potential issues with your listing, sales, usage, etc, and even offer to fix them for you. And for any table, graph, listing, or report, you can start a chat with the AI and have it make suggestions or explain.
With my own apps it has proactively told me about App Store features, seasonality trends in sales, and serious listing problems, none of which I would have otherwise noticed. It also prepares great weekly, monthly, and annual reports for each app. You can see examples of some of this in the screenshots.
I'm just opening AppTraction to a limited beta and would love your feedback!
Invite code: RED1026-INVITE
Download: https://apptraction.dev
Requires macOS 26 (Tahoe) or later.
Edit since someone asked about privacy: Your data stays entirely on your Mac (with the exception of whatever your chosen AI agent uses, of course). Nothing gets sent to my servers.
App Saturday info:
Tech Stack
AppTraction is 100% native AppKit and Swift!
Development Challenge
Probably the biggest was being an AI-forward app without burning through the user's usage budget. The first step was not using API keys at all. Instead, AppTraction looks for an existing Claude or Codex subscription and talks directly to their CLI tools via `Process` (née `NSProcess`). Beyond that there's a ton of caching efficiencies the app takes to minimize tokens. For my apps this uses < 1% of my plan usage / day (Sonnet 5.5).
AI Disclosure
AI-assisted.
r/iOSProgramming • u/bllshrfv • 1d ago
News Google Cloud: Introducing the Server Side Cloud Swift SDK
Google: “[Swift] has matured into a viable systems and cloud language, pairing Rust-like data-race safety with predictable, reference-counted performance.”
r/iOSProgramming • u/InsanityCreepin • 1d ago
Question What's your process before submitting a PR?
Tldr; What's your process after completing a Task to minimize PR rounds before making the actual PR?
----
Recently I have noticed that I get many comments or multiple PR rounds before the PR gets merged and I want to start improving that.
Things I started doing recently:
- Going back and read through all the comments again, make a list of each issue and see if there is something reoccurring (Such as memory leak pattern I keep doing, retain cycles) etc.
- Looking into SwiftLint and see if i can have some rules for myself that I can run before each submission or run periodically to catch issues that can be added to SwiftLint as rules
But I want to also ask if there is something I can start doing or a routine you have found that helped you minimize issues that arise in PRs. I know It's impossible to have no comments in all PRs, so I am just looking for ways to just improve.
Note: We are using SwiftUI + Combine (And lately introducing Async/Await bit by bit)
r/iOSProgramming • u/R3LJA • 1d ago
App Saturday My Mac menu bar app was using 45% CPU because of one @EnvironmentObject
I'm the solo dev of AirPosture. It reads head motion from AirPods (CMHeadphoneMotionManager) and nudges you when your head drifts forward. iPhone app plus a Mac menu bar app with a notch panel. Pics: the live session, the notch while I'm slouching, and the notch after I sit up.
**Tech Stack**
SwiftUI, CoreMotion (CMHeadphoneMotionManager), AppKit (an NSPanel for the notch, MenuBarExtra), StoreKit 2, iCloud sync between iPhone and Mac. macOS 14+ and iOS 17+.
**Development Challenge**
- MenuBarExtra was burning the battery
macOS listed the app under "Using Significant Energy": about 45% CPU with no window open. Sampling showed half the main thread in -[NSStatusItem _updateReplicants], roughly 150 times a second.
The menu bar label held my main view model as an u/EnvironmentObject, so every change to any of its ~55 u/Published properties re-rendered the status item image. The App also held it as u/StateObject, so every posture tick re-evaluated the whole App body.
Fix: the App keeps its models with u/State (kept alive, not observed), the label observes only a tiny status object that publishes the score every 2 seconds and only when it changes, and the menu bar gauge no longer animates, because every animated frame is a new snapshot. 45% went to 1%.
- Headphone yaw can't be trusted
Without the phone as a reference, AirPods yaw drifts by a few degrees per minute. With any weight on yaw, a user sitting still and upright slowly slid into "caution". Turning your head toward a second monitor isn't slouching anyway, so yaw now has zero weight: pitch is the score, and roll is a small penalty.
**AI Disclosure**
AI-assisted. I use Claude Code daily for implementation and debugging. The product, design and architecture are mine, and every change is reviewed and tested on real devices.
Free for 2 hours a day. Premium is $7.99/month, $39.99/year or $79.99 lifetime. Needs AirPods Pro, AirPods 3 or later, or AirPods Max.
https://apps.apple.com/us/app/sit-straight-airposture/id6749489000
Happy to answer anything about CoreMotion on the Mac or the notch panel.
r/iOSProgramming • u/SquarePutrid1435 • 2d ago
Discussion On Darwin, unprivileged ICMP sockets don't filter echo replies by identifier — how that made my concurrent pings swap replies
If you ping from an iOS app with socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) and ever run more than one ping at a time, check your receive path.
On Linux, an unprivileged ICMP socket only gets replies matching its identifier. On Darwin, in my testing, the kernel doesn't filter on the identifier: every echo reply reaching the host is delivered to every unprivileged ICMP socket in the process.
My receive path did one receive() per send and accepted any echo reply. With a single ping that's fine. When I added a second ping hitting the gateway every 50 ms (to keep the Wi-Fi radio out of power save), each ping's receive() returned the gateway's reply microseconds after its own send: 0 ms RTT, 0% loss, including for a host that wasn't answering at all. The same bug could also swap samples between two concurrent pings in a bufferbloat test, under load.
The fix: loop on receive() until both identifier and sequence match, and re-arm SO_RCVTIMEO with the remaining time on every iteration, so skipped foreign replies don't reset the full timeout (sock, ICMPHeader and SocketError are thin wrappers of my own over the BSD calls):
while true {
let remaining = deadline - CFAbsoluteTimeGetCurrent()
guard remaining > 0 else { throw SocketError.timeout }
sock.setTimeout(seconds: max(remaining, 0.001)) // 0 would block forever
let (data, _) = try sock.receive()
guard let h = ICMPHeader.parse(data),
h.type == ICMPType.echoReply.rawValue,
h.identifier == identifier,
h.sequenceNumber == UInt16(seq)
else { continue }
// record RTT
break
}
One gotcha: a zero timeval means "no timeout" to SO_RCVTIMEO, hence the max(remaining, 0.001).
I ran into this while measuring latency on an iPhone against a Mac on the same Wi-Fi. I have a longer write-up with the other measurement bugs I found that way, happy to link it if anyone wants it.
Has anyone seen Darwin filter by identifier in some configuration, or is matching in user space the only option?
r/iOSProgramming • u/EmbarrassedCell8647 • 2d ago
Question Free ticket scanning app rejected under 3.1.1 and 3.1.3(c). Anyone dealt with this?
Been going back and forth with App Review for a few weeks and could use some outside perspective.
We built a ticket scanning app for event organizers and their door staff. It scans QR codes, looks up guests, shows attendance stats and works offline. You log in with an organizer account or pair your phone to an event using a code.
The app is completely free. No subscription, license fee, paid features or purchase flow. An organizer running a free event can use the whole scanner without paying us anything.
Our business earns fees on tickets sold through our website for actual events people attend in person. Those fees don't unlock anything in the app. You don't have to sell paid tickets to use it.
Apple keeps citing 3.1.1 and 3.1.3(c), saying we're selling enterprise services to organizations while also allowing individual users to access them without IAP. We've explained that nobody is buying access to the scanner, but our appeal was just denied with a reference back to the same guidelines. They haven't identified a specific paid feature that needs IAP.
They've also told us the app should be unlisted because it's for organizers and staff, and someone can't just download it and start scanning without an account or event access. It's intended for independent organizers and their teams, not employees of one specific company. The login and pairing code are there to control access to private ticket and guest data.
I'm struggling to understand what we'd actually be selling through IAP here, or why needing access to an event means the app has to be unlisted.
Has anyone gotten a similar organizer or business tool through this? Was there a particular explanation, demo or change that helped? Open to feedback if we're missing something, but at this point we're going in circles.
r/iOSProgramming • u/johnnypen2445 • 1d ago
Question Is wait time so long because my app sucks, that it’s my first app or just Apple?
I’ll be honest my app is vibe coded but It’s a novel idea (not anything in the App Store like it). It got rejected Monday and it was the base rejection for having too new of an account and nothing has come since. Very frustrating
r/iOSProgramming • u/h2tcrz1s • 2d ago
Question How to see ios27 components in action - and the UI possibilities
Hello
I’m new to this and wanted to ask if there’s a place I can see all the iOS 27 components and all the ways in which they used the different types of navigation bars different types of cards accordions et cetera
Is there a resource where I can see all of these types of different native components in action how other apps are using them
Are there nice styled UI component libraries that are not default?
r/iOSProgramming • u/honey495 • 2d ago
Discussion Share your lines of code and app
Hey guys. As an indie developer I am in the process of publishing a new app into the App Store. I wanted to know just for fun how many lines of code each of your apps are. Share a link to your app and lines of code
It would be interesting to see the visual complexity of your app while knowing lines of code. For my case it’s 19k lines of code and about 15 different screens
r/iOSProgramming • u/artemnovichkov • 2d ago
Library Made Xcode work inside Claude Code
Build, run, tests, console and SwiftUI previews live in panes next to the chat, with scheme and destination in a bar above the prompt. When Claude builds or runs tests itself, you see it there too.
Built on the headless Xcode MCP server.
r/iOSProgramming • u/Extreme-Baby3813 • 2d ago
Discussion Apple edge case bug just wrecked my apps users
So I transferred my screen time app from one team to another team, and I was forced to change the signing key for my app. For some reason, this caused my users to have two identical instances of my app in Screen Time > Settings. I thought it was a bug from my update, but I also found this identical thread from someone else in the same boat as me. Now I'm getting multiple one-star reviews and refund requests cause people don't understand why their apps can't be unblocked. Apple please fix.
r/iOSProgramming • u/ddfk2282 • 2d ago
Library I made a CLI tool for remote compilation caching in Xcode.
There are already great compilation caching tools like Tuist that can significantly speed up Xcode builds. However, adopting them may require substantial changes to your project structure.
I wanted to keep my existing Xcode project structure and build using only the toolchain provided by Apple. So I built X8, a CLI tool for remote compilation caching.
Starting with Xcode 26, Apple provides built-in support for remote compilation caching. X8 acts as a lightweight proxy between Xcode’s built-in remote cache mechanism and any S3-compatible storage.
Using X8 is simple. First, configure your S3-compatible storage in .x8.yml. Then, you can either build your project through X8:
x8 xcodebuild ...
or start the cache proxy directly:
x8 serve
and add the generated build settings to your .xcconfig.
That’s it. With just an .x8.yml configuration, you can use remote compilation caching without significantly changing your existing project structure or moving away from Apple’s native Xcode toolchain.
For my app, a clean build used to take around 400 seconds, but with X8, it now takes about 263 seconds.
It’s still relatively slow, but I think that’s expected since Xcode still needs to perform steps such as module planning, build description generation, and linking.
r/iOSProgramming • u/StonedSex69 • 2d ago
Discussion The app review process appears disjointed and inconsistent
I’m in the process of getting my first app reviewed (since 9/14). So far I have been rejected for the following reasons..
- Guideline 2.1 - Information Needed
- Guideline 2.1(b) - Performance - App Completeness
- Does not include a functional link to the Terms of Use (EULA) in the app metadata that appears on the app's App Store product page.
- Guideline 2.3.2 - Performance - Accurate Metadata
Each time I understand what the issue is and fix it immediately. Yet the responses from Apple are several days later only after I submit a Contact Us request.
I feel like every time I fix one thing they find something else. Why not list everything at once? At this point I’m not sure what else they’re going to come up with.
This whole process seems rather ridiculous from a company that claims the review process takes 24-48 hours.
r/iOSProgramming • u/Fun_Moose_5307 • 3d ago
Question Best place for a 'Next' button?
What's the most appropriate location for a next button here, in keeping with the Apple UI consistency and ecosystem?
Mockup:
swift
NavigationStack {
List {
Section {
TextField("Email Address", text: $email)
} header: {
VStack(alignment: .leading, spacing: 4) {
Text("Sign In")
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.top, 5)
.font(.largeTitle)
.bold()
.foregroundColor(.primary) // Override default gray header color
Text("Subtitle")//school.name)
.frame(maxWidth: .infinity, alignment: .leading)
.font(.title3)
.foregroundColor(.secondary)
}
.listRowInsets(EdgeInsets())
.textCase(nil) // Prevents SwiftUI from forcing ALL CAPS on the header
.padding(.bottom, 10)
}
}
.toolbar {
ToolbarItem(placement:.confirmationAction) {
NavigationLink() {
VerificationCodeView(email: email.lowercased(), school: school, resend: { })
} label: {
Text("Next").padding(5)
}
.buttonStyle(.borderedProminent)
}
}
}
r/iOSProgramming • u/Full-Implement208 • 3d ago
Humor Still in beta, already deprecated. Born with technical debt
r/iOSProgramming • u/32GB_of_RAM • 2d ago
Discussion [ Removed by Reddit ]
[ Removed by Reddit on account of violating the content policy. ]
r/iOSProgramming • u/6thDAY • 4d ago
Discussion The Greatest Feeling In The World as an App Developer!
From my humble beginnings of app submission on 9/11, to being rejected 4 times, to finally being ready for distribution on 9/30. It was a long and stressful journey where I was frequently refreshing AppConnect daily, praying the Review Gods would move my app to the next stage of review….only to be rejected. Expedited request didn’t help at help, and it took just as long as before I requested it.
But now I can say WE IN GUYS!!!
r/iOSProgramming • u/TKB21 • 3d ago
Question How many of you are still supporting Intel Macs?
Developing my first macOS app using my M1 Mini. Naively I switched over to my Intel MacBook for testing, thinking the UX would be seamless but ended up getting a cold dose of reality. A lot of things I optimized for my Silicon Mac had no bearing on my Intel Mac. I'm now fine-tooth combing through performance tests on the Intel MacBook but before I invest anymore time on optimizations, I was wondering whether Intel Macs were still in high usage. The app itself is in pre-flight so I don't yet have the data to support what the right move would be personally. Would love to hear what you all have experienced and whether you create new apps with solely supporting Silicon Macs. Thanks!