App Performance

iOS App Performance Monitoring Best Practices

Nezar Mansour
December 28, 2023
0
Minutes
iOS App Performance Monitoring Best Practices

Summarize and analyze this article with 👉

💬 ChatGPT or 🔍 Perplexity or 🤖 Claude or 🔮 Google AI Mode or 🐦 Grok (X)

iOS app performance monitoring tracks how your app behaves on real iPhones and iPads, from launch time and app hangs to frozen frames and network latency. Apple's tools help in development, but production is where most slowdowns appear. We'll cover the metrics, targets and workflow that keep iOS apps fast.

When we talk about iOS app performance, the term "performance" can mean just about anything, but you hear it all the time. Anything and everything can be related to performance. In this specific case, we're talking about technical application performance monitoring. This is still a broad term when it comes to performance monitoring: should you be looking at CPU usage? Stability? UI speed? The quick answer is yes! Understanding how your app performs from a technical perspective is vital to understand the user experience it offers, but doing so isn’t very straightforward and requires a lot of detailed context to help make sense of all the raw data.

Before we get into details of the how to monitor your iOS app performance and what to use for it, let's take a quick look at why the importance of app performance cannot be understated.

‍

In this post, we're going to examine the following key aspects of iOS mobile app performance that need to be monitored. The list can go on and on with increasingly specific metrics, but these cover the main technical iOS performance monitoring metrics.

  • Stability
  • App launch time
  • UI response time
  • Network performance
  • Logic execution speed
  • Aggregated performance

‍

iOS Performance Monitoring Metrics and Targets

‍

App stability

App stability is measured in crashes per session or user. The industry standards for crash-free rates to target are:

Crash-free users > 99 %
Crash-free sessions > 99.95 %

One of the best ways to both monitor and help improve your app’s stability is with a crash reporting tool.

‍

‍

Luciq lets you know your crash-free rate and monitors crashes occurring in real time. By catching upticks in crashes before they affect a majority of users, you can quickly adapt to many issues. Luciq’s crash reporting also gives you a detailed breakdown of why a particular crash is occurring, along with a complete stack trace to resolve issues.

Additionally, Luciq gives you visibility over other fatal stability issues like Out Of Memory (OOM) and (ANR) errors, capturing their detailed context and allowing you to easily debug them with tools like flame graphs and AI SmartResolve.

‍

App launch time

App launch speed is very indicative of the overall quality of your app and sets the user’s first impression. Based on an analysis of the top 100 apps, 39% complete a cold app launch in under or around two seconds, and 73 in under three seconds. Ideally, you should be targeting a cold app launch time of 1.5-2 seconds, a warm app launch time of under 1 second, and a hot app launch time of under 0.5 seconds.

‍

‍

Of course, your mileage may vary depending on the nature of your app. With Luciq APM, you can set your own threshold for the app launch time you’re trying to achieve. And based on that, you can see if it’s poor, average, or good and easily determine if slow launches are related to app versions, devices, or OS versions.

Learn more about cold, warm, and hot app launches.

Learn more about optimizing mobile app launch time.

‍

Network response time

Network calls play a huge role in the speed and responsiveness of your app. Studies show that to be competitive, your app should respond to user requests within 1 second. It also indicates that many apps fail to meet that due to unreliable or slow services.

‍

‍

Because Luciq’s SDK is built with iOS devices in mind, you can track the full round trip of your network requests as seen on the client-side and be alerted to timeouts and issues. Most APM tools will settle for tracking server-side, but this won't give you the full picture. And for even more control and visibility, with Luciq APM you can also track custom URL patterns.

Learn more about optimizing mobile network performance.

‍

Logic execution speed

To best understand your end-user experience, you need to be able to assess your client-side logic and see how long specific traces in your app take to execute. On average, key traces should be completed in under two seconds.

‍

To help tackle these issues, Luciq’s performance monitoring lets you define custom execution traces to track, and you can set target thresholds for your traces.

‍

UI response time

Users can experience UI hangs for various reasons. If there’s a longer than usual delay (250ms on average) or a failure to respond to a user’s input, it’s considered a UI hang.

‍

UI hangs interrupt the focus of your app's users, increasing their cognitive load and delivering a choppy performance. You should aim to detect and fix them as soon as possible before the negative reports and comments start streaming in. Luciq APM gives you a detailed distribution of UI hang occurrences per screen to help you easily identify where your app’s UI is unresponsive.

‍

Aggregated performance

To gain a bird's-eye view of your app's performance and align your team over a north-star KPI, you need to combine all these different metrics. The Apdex score serves as a quick tell-all score that highlights your app’s overall performance as perceived by users and makes it much easier to align the team around one KPI and communicate it to all stakeholders.

‍

‍

Luciq’s app Apdex score tells you whether your app’s overall user experience is Unacceptable, Poor, Fair, Good, or Excellent, and you can track it over time and across versions. For more granular analysis, you can also see individual Apdex scores for app launch, specific app traces, and specific network requests.

Learn more about the Apdex score.

Why isn't MetricKit enough for iOS performance?

MetricKit is Apple's built-in performance reporting framework, and it's worth using. It has real limitations in production, though.

The biggest is delivery timing. MetricKit delivers diagnostic reports once per day, batched, after a 24-hour delay. If something breaks on a Monday morning, you're looking at the data on Tuesday. For fast-moving releases or time-sensitive events like a sale, a major launch, or a new iOS version rollout, that's too slow to be actionable.

The second limitation is opt-in behavior. MetricKit hang reports depend on users allowing diagnostic data sharing with Apple, which not all users do. The result is that hang diagnostics in MetricKit represent an opt-in subset of your user base, not the full picture.

Third: MetricKit's hang detection has a threshold of 250ms, and reports can be inconsistent across iOS versions. Some hang scenarios that would register clearly in a real-user session don't appear reliably in MetricKit.

MetricKit is a useful signal, especially for Apple's own performance thresholds. But production observability for iOS needs continuous, per-session data that doesn't wait 24 hours and doesn't depend on user opt-in.

Boost your iOS App Performance With Luciq

Luciq's Signals captures every session on real iOS devices, breaks down slow launches and hangs, and ties each issue to the users it affects. Companion finds the cause, and Autopilot can open the fix.

Frequently Asked Questions

What are app hangs on iOS?

An app hang is when the main thread is blocked long enough that the UI stops responding. The user tries to tap a button, swipe, or scroll, and nothing happens. If the block lasts long enough, iOS terminates the app.

Apple's threshold for what counts as a hang in App Store metrics is 250ms of main thread blocking. In practice, users notice anything above about 100ms on interactions they expect to be instant, like button taps or swipes.

The most common causes in production:

  • Synchronous network calls on the main thread (any network work should be on a background queue)
  • Heavy JSON parsing or data transformation run synchronously
  • Core Data fetches on the main thread, especially with large result sets
  • Synchronous disk I/O (reading or writing files from the main thread)
  • Long-running timers or notification handlers that block the run loop

Catching hangs in development is straightforward: Xcode's Thread Performance Checker flags main thread violations, and Instruments' Time Profiler shows where time is being spent during a hang.

In production, you're looking for hang rate: the percentage of sessions that included at least one hang above a given duration, segmented by iOS version, device model and app version. A spike in hang rate after a release almost always points to something new that ran on the main thread that didn't before.

What should you track to measure iOS app performance?

App launch time, app hangs, frozen frames, crash-free sessions, memory use and network latency. Track them on real devices in production, not just in development.