I know this has been lately decaying.. most referenced are very old, such as this one: https://github.com/richardjrossiii/CBasediOSApp<p>Hence my question: Is it possible?
Objective-C is designed in such a way that, generally speaking, anything you can do with Objective-C syntax can also be done with a simple C function call to one of the Objective-C runtime functions. So you can write an entire iOS app in pure C. However, the Objective-C stuff is a lot more pleasant to use if you use the syntax for it.<p>As others have mentioned, for something like a simple game (rather than a normal GUI application), SDL offers a convenient wrapper that allows you to avoid touching anything Objective-C-related yourself, so you could write an entire app using only the SDL API, which is pure C. A nice bonus of that approach is that it would then work on other platforms with zero code changes.<p>Another source of C wrappers is Apple themselves, as iOS has a number of C interfaces like CoreFoundation that reduce how much Objective-C stuff you have to directly interact with, but there's nothing like that for UIKit, and every iOS app has to use UIKit at least a little.
If you just want to write C and are ok linking to stuff that is in other languages, then I used SDL2 for my game which I wrote in C and is on the app store. It was a very pleasant experience, and if I were doing an iOS thing again, I would likely do something similar.<p>I think I had one objective C file in there for calling a library function I needed, but otherwise I just wrote C code.
Yes. And many are when you require a common code-base for iOS, Android, and other devices. (But C++ is used more commonly)<p>Video games are the ones that do this by default. It would be close to impossible to have feature parity by coding a game for iOS in Swift, for Android in Java, for Steam in C++, etc. Unreal or Unity will have C/C++ code-bases with very light integration layers to do system calls.(The payment system may have code in Objective-C, for example, but mostly a wrapper for convenience reasons)<p>The other extreme is to just use webapps in an electron wrapper. But electron itself is build in C++.<p>My guess is that most developers are going to use the default Java/Swift combination for mobile development because that is what each company taught in their websites. I would prefer, thou, that engineers were more inclined to use opensource solutions to create common interfaces and avoid vendor lock-in. But cool events and free tutorials are hard to beat.
Yes, technically it's possible by wrapping the ObjC runtime API, see solutions like these:<p>- <a href="https://github.com/garettbass/oc">https://github.com/garettbass/oc</a><p>- <a href="https://github.com/mitchellh/zig-objc">https://github.com/mitchellh/zig-objc</a><p>Whether that's better than writing ObjC directly is another question, think of ObjC as a convenient syntax sugar wrapper around macOS/iOS APIs which you only need in those parts of your application that talk directly to operating system APIs.<p>Also Apple is maintaining a C++ Metal API wrapper now (ok, technically that's not C): <a href="https://developer.apple.com/metal/cpp/" rel="nofollow">https://developer.apple.com/metal/cpp/</a><p>If you just want do to simple 'game-y stuff' (3D rendering, audio, low level touch input) you can also check out the Sokol headers (shameless plug): <a href="https://github.com/floooh/sokol">https://github.com/floooh/sokol</a>, or I guess SDL will work too (especially with the new GPU API in SDL3) - at least the sokol header implementation code needs to be compiled as ObjC on macOS/iOS though (e.g. pass `-x objective-c` to Clang), since the macOS/iOS specific code paths are written in ObjC.<p>For the general case or when you need to access OS frameworks that are not wrapped by 3rd-party libraries:<p>If your app is mainly C code, have a thin layer of ObjC code that sits on top of the system ObjC APIs and which exposes a C API to the rest of the application.<p>Don't just tunnel every ObjC call through to C, instead wrap small feature blocks in ObjC and expose those features through a much simplified C API.<p>E.g. a hybrid C/ObjC application with only the necessary amount of ObjC code for talking to OS APIs, and all the 'business logic' in C (or another language, like C++, Zig or Rust).
No, not really.<p>You will notice that everyone that is replying that you can, also mentions that actually you have to make use from the Objective-C runtime from C.<p>So for all pratical purposes you will be writing an Objective-C application, manually writing the code that the Objective-C compiler used to generate when it was originally designed as a macro pre-processor generating C code at StepStone.<p>The way iOS is designed the bottom layer for userspace applications is Objective-C, not pure C UNIX style, and using the C APIs from the Objective-C runtime hardly changes that, you will be calling into the Objective-C runtime one way or the other.
Yes, it's basically writing a nibless objective-c application but manually translating all invocations to objc_msgsend yourself. You're not going to be able to avoid the objective-c runtime though.
Yes, Objective C is built on some deep C calls you can call directly. I was a part of a project that built an automatic wrapper generator for C. Check it out at <a href="https://felixk15.github.io/posts/c_ocoa/" rel="nofollow">https://felixk15.github.io/posts/c_ocoa/</a>
There is this beautiful single-header library to write simple graphical programs in C, portably to standard unixes, macos, and windows:<p><a href="https://github.com/ColleagueRiley/RGFW.git">https://github.com/ColleagueRiley/RGFW.git</a><p>It was discussed recently around here: <a href="https://news.ycombinator.com/item?id=42217535">https://news.ycombinator.com/item?id=42217535</a><p>The macos backend is a neat hack, written in pure C.
Here is the original StackOverflow question that inspired that GitHub project: <a href="https://stackoverflow.com/questions/10289890/how-to-write-ios-app-purely-in-c" rel="nofollow">https://stackoverflow.com/questions/10289890/how-to-write-io...</a><p>One of the other answers also explains how to write a MacOS app using pure C.
There is Objective-C++ (.mm extension), which I used extensively, where you have what is essentially a C/C++ implementation file, but you can use types and syntax from Objective-C, e.g. allowing you to call iOS APIs (UI, bluetooth, etc).
Disk acccess can be done directly without objective C. Also network access. It is surprisingly unrestricted. This was a year or two ago. You need to get a path string to the app's Document folder through an Objective-C call though.<p>The benefit of using C/C++ is that you are not writing 100% vendor locked code, only the HAL portion that interacts with some of Apple's Obj-C APIs will be platform-specific.<p>For example, if you write Linux-HAL then you can run your code, at least for testing, locally. And of course it opens the door to an Android port.
Obj-C apps are not deprecated yet, so the approach in that GitHub repo must still work. That app is indeed written in C, but a big chunk is about building Obj-C classes and using other Obj-C objects - so it’s not quite C. You won't get much performance benefits or additional flexibility this way.<p>C is Turing-complete, so you can technically write anything in it. But on iOS, you'd need to build your own C library for application-level Apple SDKs, since Apple doesn't provide one. For simple apps (like small games or toy utils) - a minimal wrapper in Objective-C or Swift could be just a few hundred lines.
I remember having to set up an Ogre3D (A C++ 3D engine) project so I could compile it with XCode.<p>For some reason it required a bit of objective C for it to work with opengl.<p>I sold my macbook about 2 years later, around 2015.
I made RGFW, which calls Objective-C MacOS's API functions in Pure C.<p>BUT I would also like to mention a project a friend and I made called Silicon. Silicon is a single-header C wrapper around the Pure-C calls, which makes it far more convenient to use.<p><a href="https://github.com/eimamei/silicon">https://github.com/eimamei/silicon</a><p>I no longer use it in RGFW because I wanted to remove the extra dependency.
I think a better question is - could people practically write macos/ios apps without xcode.<p>I remember the feeling I first got (decades ago) when moving from C to objective C.<p>Having an xcodeproj was like the camel's nose under the tent, and then you couldn't go back. And you frequently had a big mess going forward when the next xcode version came out and it wouldn't work.
I wrote an app that has minimal Objective C that then just calls C++ code. You can either add .cpp files to your project, or if I recall correctly, you can just define C++ functions in your obj c files. In my app, Objective C just sets up the UI and then it calls C++ functions to do calculations. Not exactly your question, but might be helpful.
Recently I have built a iOS network extension by porting fd.io vpp to Darwin platform, though the UI part is written by SwiftUI. But the core is written using good old C and dns component is written using rust with hickory library, I was considering using c-ares but wanna get a try with rust.<p>So I think if UI stuffs can be written using C it then can build app using pure C.
Well, you could basically do any llvm supported language.
I remember a few years ago I tried creating a DSL just for fun and the sake of testing on iOS.<p>You can create a frontend of whatever language you want for llvm so it’d translate it to llvm-ir.<p>You just need a small wrapper in objective c to make it work.
Ha I ported my c solitaire program (uses SDL2) to iOS a couple years ago and it was pretty smooth. I didn't know or think this was unusual, but I suppose most people would not start an iOS app this way.
Yes. It is absolutely possible.
We have been including for more than 10 years a pure C web server on some of our apps that is currently 100% compatible for both Android and iOS
Yes, it's still technically possible to write an iOS app in plain C in 2025 — but with caveats. You’ll need to wrap your C code in a minimal Objective-C or Swift layer to satisfy UIKit/AppKit requirements and Xcode’s project structure. Apple’s SDKs are built around Obj-C/Swift, so things like UI, lifecycle, and event handling need some glue code.
The CBasediOSApp repo you linked is still a good starting point, but expect to adapt it for modern toolchains and signing requirements.
Realistically, you'd write most logic in C (e.g. a game engine, parser, or core library) and interface with minimal Obj-C or Swift for the UI.
Anyone trying it in 2025 will likely be doing it for fun, education, or embedded-style constraints — not App Store production unless there’s a really good reason.