mgx

my first attempt at iOS app development

A week ago, I knew nothing about Swift. Today, I have a working iOS app sitting on my Mac and my test device. I'm still a bit surprised by how it all came together.

I'm more of a product and GTM guy, often dabbling in code for specific problems or client projects. I have Xcode installed, sure, but mainly because I need it to test stuff. Most of my time is spent in other languages and ecosystems. But last week, something shifted. Maybe it was frustration with the photo management apps, or maybe it was just curiosity, but I found myself thinking: "How hard could it be to build a simple iOS app?" Turns out, the answer is both "harder than I thought" and "easier than I expected.

What started as a casual exploration turned into an intense three-day journey. My goal was modest: to build something that could help manage photos, find duplicates, and allow for swiping and deleting pictures. The process became an interesting dance between Cursor, me, and Xcode. I'd start with Cursor, bouncing ideas back and forth, getting boilerplate code and structure suggestions. Then I'd take those code snippets into Xcode, and extend. This became my rhythm: AI and I would collaborate, then I'll validate, debug, and research. It's slower than just "vibe-coding" but faster than learning Swift from scratch in the traditional way. Each error message became a mini-lesson. Each successful compilation felt like a small victory.

One thing that struck me immediately was how much iOS offers out of the box. The native libraries, the APIs -- there's so much functionality just waiting to be plugged in. Coming from other platforms, this felt almost too easy. However, I'd then encounter something iOS-specific -- like code signing, target management, or deployment configurations -- and be reminded that every platform has its learning curve. These weren't coding problems; they were ecosystem challenges. Honestly, AI (Gemini) proved invaluable here too, guiding me through setup steps that would have taken hours to decipher from documentation alone.

Not everything went smoothly. Two days into the project, I discovered an interesting quirk with Apple's CLGeocoder, which I was using for a "places" feature in my photo manager. If a device or network is detected as China-based, it switches to using Autonavi and will only reverse geocode locations within China. This presented a problem for me (and will also affect users in China). The solution required building a fallback system: catching the specific error code and then switching to another reverse geocoding service for international locations. These kinds of edge cases made the whole process more enjoyable.

While building, I kept thinking about the existing apps in this space. Most photo management utilities (similar to what I'm building) charge weekly or monthly subscriptions for what are essentially straightforward operations. I've seen apps charging $5-10 per month for bulk deletion and duplicate detection -- something that, once you understand the APIs, isn't particularly complex to implement. This bothered me, not because these developers don't deserve to make money, but because the pricing models feel disconnected from the actual value delivered. Why should de-cluttering Photos cost $59 to $99 per year? I'm planning to charge once, maybe $2.99, and call it done. No subscriptions, no freemium tricks, no dark patterns. Just a tool that does what it says, priced fairly.

The more I researched this space, the more I noticed the marketing patterns. There's a whole ecosystem of companies (many of them China-based, from what I could tell based on my experience working with Chinese teams) that seem to follow the same playbook: develop a bunch of new utility apps each year, create flashy ads with foreign actors, spend heavily on Meta advertising, and charge subscription fees that seem designed more for recurring revenue than fair pricing. I've seen these ads -- they're often borderline ridiculous, but they work. They grab attention, create curiosity, and drive downloads. As someone with a marketing background, I can appreciate the strategy even if I don't love the execution. However, I don't have a marketing budget, and I'm not interested in that approach anyway. My app will have to succeed on its own merits.

Using AI for coding has offered significant insights. It's not that AI always writes perfect code -- it doesn't. What it does is help you iterate faster and learn from your mistakes more quickly. When I get stuck on a concept, I can explain what I'm trying to accomplish and receive three different approaches to consider. When I encounter an error, I can paste it in and gain context about what might be going wrong. When I want to understand iOS design patterns, I can have a conversation rather than reading through dense documentation. However, there are limits. For anything involving user authentication or sensitive data, I won't use agentic AI. I know enough to understand the limitations of AI when it comes to coding, and AI-generated security code feels risky if you're not experienced enough to audit it properly.

One pleasant surprise has been the app's performance. The WIP app doesn't use a lot of RAM during normal operation. CPU usage spikes only when scanning for duplicates -- which makes sense since it's processing potentially thousands of images -- but even then, it's manageable. I've been monitoring these metrics and threads obsessively, partly because I can (Xcode makes it easy) and partly because I want to understand the impact of my code choices.

I'm about 90% done, I think. The core functionality works, but I want to polish the user experience. I haven't paid for the Apple Developer Program yet. The whole experience has made me wonder why I waited so long to try iOS development. Sure, there's a learning curve, but it's not insurmountable, especially with AI as a learning partner.

This project started as a matter of curiosity and turned into something that might actually help people. A few years ago, building an iOS app as a non-iOS developer would have meant weeks of setup, configuration, and concept learning. Today, with the right tools and a willingness to iterate, you can have something working in days.