A couple of months ago, I was a few minutes away from joining a video call in my office when I noticed I hadn’t set up my ring light yet. I use a ring light for video calls because the lighting in my office comes mostly from the top. That lighting is perfectly fine for working, but it casts shadows under the eyes and chin that are exacerbated by the built-in camera in my Studio Display. I don’t…
Some bugs are more interesting than others . Last time I mentioned how CVE-2025-24091 was one of my favorite iOS vulnerabilities so far. That was because I wasn’t yet allowed to disclose my actual favorite! This post is about CVE-2025-31212, the most ironic vulnerability I’ve ever found, and here's why... Transparency, Consent, and Control As those who read my reports already know, Apple’s…
I was listening to an episode of one of my favorite podcasts this weekend. The show is called Search Engine , and every episode tries to answer a question that can’t be easily answered through an actual search engine (or even AI). This episode grabbed my attention because it was about an iOS bug, and a really weird one. The bug is that, if you try to send an audio message using the Messages app to…
This is the story of how I found one of my favorite iOS vulnerabilities so far. It’s one of my favorites because of how simple it was to implement an exploit for it. There’s also the fact that it uses a legacy public API that’s still relied upon by many components of Apple’s operating systems, and that many developers have never heard of. Darwin Notifications Most iOS developers are likely used to…
If you’ve been reading my previous posts about security vulnerabilities that I discovered on Apple’s operating systems, you’ve probably noticed a pattern of bugs being caused by improper validation of clients by XPC services. So it’s probably not a surprise that the latest CVEs also fall into that category, but the first one that I'm going to talk about has a slight twist. CVE-2023-23506/28192:…
TL;DR: Any app with access to Bluetooth could record your conversations with Siri and audio from the iOS keyboard dictation feature when using AirPods or Beats headsets. This would happen without the app requesting microphone access permission and without the app leaving any trace that it was listening to the microphone. Access to Sensitive Data on Apple's Platforms One of the biggest myths when…
This year's WWDC introduced many new APIs, two of which caught my attention: ExtensionFoundation and ExtensionKit. We've been able to develop extensions for Apple's apps and operating systems for a while, but Apple never offered a native way for third-party apps to provide custom extension points that other apps can take advantage of. With ExtensionFoundation and ExtensionKit on macOS, now we can.…
Phishing attacks are a very common threat in our digital lives. So much so that many companies try to trick their own employees into falling for fake phishing attacks in order to assess their skills when trying to identify a certain message as genuine or not. If you don’t know what a phishing attack is, here’s what Wikipedia has to say about it: Phishing is a type of social engineering where an…
My friend, podcaster and fellow indie developer Casey Liss has just released his latest app, MaskerAid . Rather than trying to explain the app to you, here's Casey himself: In short, MaskerAid allows you to quickly and easily add emoji to images. Plus, thanks to the magic of ✨ machine learning ✨, MaskerAid will automatically place emoji over any faces it detects. MaskerAid is free to try but you…
I’ve been working on a new app in my spare time using the new Swift Playgrounds 4 for iPad. As mentioned in my previous post , this app is document-based. I’ve chosen the JSON format to be the underlying data format for my app’s documents because I (and possibly future users) would like to be able to have the app’s documents in version control, and dealing with merge conflicts and diffs of binary…
It’s been just a couple of weeks since Apple introduced the new Swift Playgrounds 4 for iPad , which now enables full app creation and publishing directly from an iPad, but many people are already making some really interesting projects with the app. Of course bringing app creation into a new platform that’s much more limited in general than macOS and Xcode means that Apple had to prioritize which…
The most common application of CloudKit by far is to store private user data with the goal of keeping their devices in sync. This is mostly what my CloudKit 101 post is focused on, as well as explaining the basic concepts of how CloudKit works and the best practices around that type of data synchronization. In that post, I did mention that you can use the public database offered by CloudKit for…
Programming microcontrollers is something I’ve always liked to do, there’s something very satisfying about writing code that controls things in “real life”, instead of just pixels on a screen. Recently, I decided it would be a fun side project to turn a cheap air humidifier into a HomeKit accessory . I started out with an Arduino board to test things out, but then people reminded me of the ESP32…
The Mac has always been very different from its close relative, iOS, especially when it comes to what a user is or is not allowed to run on their system. Even with the introduction of Apple Silicon, Apple has made it very clear that the Mac is still the Mac, and is still hackable , even when running on the new architecture. What this means for us developers is that, when targeting the Mac…
Update (September 29, 2020): With Xcode 12.2 beta 2, Apple has added an official template to create macOS Intents extensions. One of the most exciting additions to iOS 14, WidgetKit is also available on macOS Big Sur, where it replaces the legacy “Today extensions”. Widgets created with WidgetKit can be configured by the user in a system UI which is configured by an intent definition in Xcode. I’m…
One of my favorite new things announced during this year’s WWDC was App Clips . They allow developers to offer a small experience from their app to users, without the need to install the entire app from the App Store. App Clips can be activated through a variety of methods: NFC tags, QR codes, special App Clip codes from Apple, or through a simple link somewhere, like your app’s website. When I…
UPDATE JUL 10, 2020: It has come to my attention that implementing the Facebook login flow without using their SDK is against their terms of service for third-party applications , further confirming that Facebook is more interested in gathering data about an app's users than it is in providing a useful service (shocker). NOTE: I know we’re not living in the best time of our lives right now. If…
The new iPad Pro is here! It features a brand new LiDAR sensor and there’s also a cool new Magic Keyboard with a built-in trackpad coming in May. But the best thing about this latest Apple launch for developers is the new and improved mouse and trackpad support on iPadOS 13.4, which works on every iPad model that can run the version. The way mouse interaction works on iPad is not the same as it…
Writing automated tests like unit, integration, or UI tests can be a great way to have reproducible steps that ensure an app is working the way we expect it to. But there are some circumstances where automated testing just doesn’t cut it. Some behaviors of mobile apps have subtleties that can only be assessed by holding a device in your hand — just like your users do — and seeing how things…
Note: this article is a revision of the article I wrote back in 2017. If you’d like to listen to an informal conversation about CloudKit, check out iPhreaks episode #226 . Apple introduced CloudKit in 2014. Since then, it has received many improvements, like the ability to use it outside Apple's platforms and to use it on apps distributed outside the App Store on the Mac. Even though CloudKit is…
This article is basically the script from the talk I presented at dotSwift in Paris. If you prefer, you can watch the video . INTRO Today I want to talk about MVC. Model View Controller is the architecture iOS developers love to hate. I will be focusing most of this talk on the “C” part and what leads to single controller files getting out of hand. But before I do, let’s address the elephant in…
DISCLAIMER: this is not a tutorial on how to use the Keychain or Keychain Sharing. I am a huge fan of app extensions, since they allow us to expose our app’s functionality to other parts of the system without requiring the user to necessarily launch the app if they want to get something done quickly. Eventually, when you’re working on an app that requires some sort of authentication or stores any…
Whenever Apple introduces a new technology for developers, there’s always the question: “Can I use this thing right now for my projects?”. The answer many times ends up being the good, old, and boring “it depends”, but more often than not it leans toward “probably better to wait for a few OS versions”. With SwiftUI, it’s the same. While there are some brave developers using it to create production…
Every time I’ve had to change something in the launch screen on any of my iOS apps, I’ve faced an issue: the system caches launch images and is really bad at clearing said cache, even after the app has been deleted. Sometimes I’d change the launch screen storyboard, delete the app and re-launch, and it would show the new storyboard, but any images referenced in the storyboard wouldn’t show up,…
Update 2019, Nov 22: Apple reached out and resolved the situation. I’ve been unable to access my Apple developer account since August. When I try to access any part of the developer portal, like the beta downloads page or the certificates control panel, I get redirected to a contact form that reads “Need assistance with accessing your developer account?”. My developer team doesn’t show up in Xcode…
Using private APIs can be fun. When working with private APIs, I usually prefer to write code in Objective-C, since the runtime makes it a lot easier to use classes and call methods Apple doesn’t want you to. That’s of course when I’m working in Xcode on my Mac. But what if I want to use my other computer? You know, the one I can carry with me a lot more easily than my 15” MacBook Pro. I just…
I should start by explaining what I mean by “animations are assets”. I don’t mean that every single animation in an app must be represented by an asset and can’t be done programmatically, since that would be dumb. What I do believe in is that complex animations, especially ones that are not very dependent on dynamic data that’s only known at runtime, should be assets. I’ve always been in favor of…
Maybe this is not common for all developers, but as an iOS developer, one of my favorite things to implement are beautiful user interfaces and cute animations. When the UX people at my job presented me with a new onboarding screen for our app, it consisted of static screens on Zeplin, without any animations specified. I asked for the Sketch file and came up with this: Needless to say, they were…
Bundles and asset catalogs are features of Apple's systems every developer and app is using, even though many developers are probably not aware of their existence or how powerful they can be, especially when used together. Today, I want to talk about what those two things are, what each one of them is supposed to do and how you can use both of them together to create a theming system for an app.…