iOS 17 / iPhone 15 battery woes

Over the weekend I loaded up Move X, Quantified, and configured Google Maps (Timeline) [so many permissions to have to dig through, ugh] so I can start to get a better sense of each and their battery consumption this week compared to Arc (as you suggested). Maybe I’ll add AllTrails or something similar later. This morning I wasn’t able to go on my normal commute, but I have a good snapshot of a stationary hour and battery consumption while idle at my desk. Here is what I gathered:

9am - 10am
Overall battery usage went from ~75% to ~65% (~10% loss).

Consumption breakdown by app:
Arc: 71%
Quantified: 28%
Find My: 1%
Everything Else: < 1% (including the 8 minutes of screen time for non-tracking apps)


I had tried Quantified a few weeks ago and was immediately turned off by the persistent location badge in the dynamic island. I was fearful it would kill my battery, but now that I’m comparing it’s not quite as bad as Arc. I believe Arc captures more data points so perhaps it’s not a great comparison, but if Arc is as battery efficient at collecting location information as you say I want to experience it. Quantified is better by a factor of 2.54. For this hour my estimate is that Arc drained about 7% of my battery while being idle (no screen time).

Decent technical bit to know. I really don’t care if Arc is technically running for a fraction of a second every minute and iOS tags it as a full minute. What matters most is how much does whatever it’s doing drain my battery over time? In my tests whatever it’s doing is draining battery life far greater than you are experiencing and you seem to be agreeing something isn’t right in my setup.

Here are the segments recorded over the 9am - 10am hour. I did not do any clean up, reassignment, or merging of the segments. My reading of this is that it thought I was stationary over that hour which historically I always am so no anticipation of leaving. As an aside, it’s really tough to read and see a segment’s path and timeline in the app to understand what it’s trying to tell me. I’ll post about this separately.

To setup this morning I woke up at about 5:30am and carried my iPhone with me to change to go running. I leave my iPhone at home and record runs with my Apple Watch. I have Arc import the HealthKit workout which would explain the path you see coming from the home location. The run was from 5:47am - 6:09am.

Edit: Adding in another Arc screenshot because the above might be from earlier in the day(?). It’s hard to read the timeline of these segments to know what they are attributed to. Each segment displays a single point in time rather than a range of time which is what a segment is (start and end). Arc may have thought I was walking a bit and stationary between 9am - 10am, but again its hard to read any of this.

Unless you’re super interested in the comparison, or in hiking recording or whatever, I wouldn’t fuss to much in doing it. It’s more a matter of understanding the “classes” of apps out there and what they do and don’t do, in terms of what you’re comparing.

In a sense Arc sits in a class of its own, in that other apps are either designed to record only Visits / Places (eg Life Cycle, Rond, Marauder), or only Trips / Paths (eg AllTrails, BikeMap), with the third class being app that record both, but only with low detail for the Trips / Paths (eg Move X, Google Timeline, Quantified Map). Arc instead records both Visits / Places and Trips / Paths in highest possible detail. So there’s no single app-to-app comparison that quite makes sense.

That said, when I was still doing daily comparison testing, Arc was still beating all of the latter two classes of apps (complete Trips/Paths, and low detail Trips/Paths + Visits/Places) in terms of energy consumption. If your testing shows up that that’s no longer the case, then I’ll dig back in and do comparison testing again.

It’s been probably a year or two since I stopped doing those daily comparisons, because it was really no contest, and not worth the daily effort. But if Arc has fallen behind, then I’ll dig in again and find out why.

Yeah at this point that’s still my main concern. If Arc is draining excessively during extended stationary periods, something is wrong. Assuming these are places where Arc (and iOS) has already seen a bunch of visits, it should be already recording at or near peak efficiency during those stationary periods.

Hmm. These segments look really clean. Perhaps the stationary segment radiuses are a bit large, indicating that there’s a fair bit of drift going on. The classifier is doing a good job of recognising that drift as still being stationary though, which could be hiding the underlying problem. Ironically, when the classifier used to do a worse job of correctly identifying stationary from drifting data it made it easier to spot cases of spurious wakeups.

To see the actual recorded samples within a stationary segment, on the Individual Segments view tap on the stationary segment in the list and choose “Not stationary”. That next view will then add a map annotation to show the actual path of the samples within the stationary segment. It’s not what the view is actually designed for, but I use it as a handy debug method, to see what’s inside stationary segments when they don’t feel right (eg radius looks too large).

My guess is that the jagged mess of samples within the stationary segment will indicate drift over perhaps 100 metres, at a guess of the map scale. That amount of drift shouldn’t be causing extended energy expensive wakeups.

Although if it’s sustained drift over more than 100 metres for long periods of time (which has been a recurrent iOS bug that’s come and gone with iOS versions), then it can be significant enough to look very much like sustained walking around the neighbourhood. That would definitely cause higher energy drain. Though I’m not convinced from your screenshots that that’s what we’re seeing (depending on the map scale, I guess).

Here’s an example of sometimes sustained drift over about 100 metres inside a large hotel:

That’s actually as good as it ever got inside that building - iOS’s wifi hotspot triangulation had finished doing the best it could, and Arc’s Trust Factor was by that point well trained to entirely distrust iOS’s reported “horizontal accuracy” (which is the crux of the above described transient iOS bug - iOS periodically lies, in big ways).

The top left prominent bit of drift likely indicates a period where the location data was impressively faking an extended walk around the neighbourhood. That would’ve almost certainly caused an extended wakeup, with active recording. The rest of the messy samples would I think possibly have been within bounds, such that the recording engine stayed in sleep mode.

Here’s an example of one of my first days at that hotel, with significantly worse drift, such that I decided to manually classify a bunch of it as bogus, to stop the visit radius being too absurdly large.

Each of those bogus segments would have caused an extended wakeup, with one of them being over 2 hours. grumbles. That there is the more extreme example of the “iOS lies” problem, in that iOS would have been reporting wildly wrong “horizontal accuracy” during those periods, insisting that it was achieving 10 metres or better accuracy, while providing location data that was more than 100 metres from the real location.

Here’s what that two hour bogus segment looked like:

That kind of bogus data looks very convincingly like sustained walking (aside from the lack of accelerometer data, which is something the recording engine can’t use for sleep mode, due to it being too energy expensive to power up the accelerometer).

Anyway, that’s all just to demonstrate what the extreme end of the problem looks like. (Though in previous years / previous iOS versions / some locations still now, it can get much more extreme than that, with drifting up to a kilometre or more away, all while still reporting accuracy of 10 metres or so. Bain of my existence, that one!)

I don’t think your screenshot is showing anything that extreme, so I’m not seeing an obvious clue for the excess energy use yet. Just thinking what to check next…

Well, a screenshot of the actual path/samples of the stationary segment within the visit will tell us a little bit more (ie the trick I mentioned above about choosing “not stationary”, just to see the extra map annotation). But I’m not convinced it will reveal the smoking gun, unless perhaps I’m quite wrong about the map scale in your screenshots.

I’ve got a bunch of performance profiling work scheduled to do before the next update ships. So as part of that I’ll be hunting for anything that might’ve snuck in as an extra energy drain.

I think I’ll also do a week of comparison testing again too. Though frustratingly there isn’t really any definitive comparison app at the moment. I might focus on Move X, Google Timeline, and Quantified Map. (Though frustratingly, Move X only offers 3 day trials, and their pricing is almost as high as / higher than Arc’s! I wonder if their recording quality has stepped up considerably since I last checked, or whether they’re just capitalising on the influx of users they no doubt got when Arc dropped its free tier last year).

Google Timeline in the past hasn’t been worth the comparison effort, because its results are far too low quality to compare on a qualitative level. From memory, Move X and Quantified Map achieved decent recording quality, albeit at significantly less detail than Arc’s. Oh there’s also Gyroscope - I almost forgot them. Can’t remember what level of detail they were recording.

Anyway, I’ll do some comparison testing. And will see if anything shows up in the profiler when I get to that this week, before shipping the next update. Oh and if you could send a screenshot of that map annotation for the actual path inside the stationary segment, that’ll tell us a bit more too. Hopefully we can get to the bottom of this!

Oh one more thing to check, if you’ve got Arc Mini installed:

Mini has all the debug views included (they’re in Arc App too, but only for TestFlight builds). Anyway, tap the more/ellipsis button in Mini, then “Recording Debug Info”, and have a look at what the “Trust Factor” value is while you’re stationary at home.

Trust Factor is a value from 1.0 to 0.0, and lower values mean lower trust, and that the location data has been drifting further/faster while stationary at that location.

You can also see how the recording engine is using that Trust Factor value to fudge the reported “horizontal accuracy”. Where it says “Receiving horizontal accuracy” a couple of rows above, when there’s a non-nil Trust Factor the accuracy value will show the corrected/fudged value first, then in brackets an estimate of what iOS was actually reporting. So for an extreme example, “210m (10m)” would indicate that iOS was reporting about 10 metres accuracy, but based on Trust Factor the recording engine is treating that as 210 metres accuracy.

That’s basically how LocoKit (Arc’s underlying recording engine) deals mathematically with being lied to. If the reported horizontal accuracy is wildly, absurdly wrong, then the maths falls apart and there’s probably going to be energy expensive wakeups that shouldn’t have happened. But by fudging it with Trust Factor, based on what it’s learned from previous drifting data at that location, it can make the maths work again, and avoid those wasteful unnecessary wakeups.

The Trust Factor coordinate buckets are roughly 30 metres square, so you might see the Trust Factor value changing every 12-60 seconds while stationary, if the incoming data is drifting a bit right at that time.

If there’s no Trust Factor row shown at all in the debug view, it’ll mean that no samples have been manually confirmed as stationary inside that ~30 metre bucket. Which would indicate a path to improving energy consumption, by manually confirming some of the stationary inside a visit to Home. Though typically that shouldn’t be necessary, so I don’t think that’s really what we’re looking for - it’s just an extra detail of information to help unravel the puzzle.

Hmm. This is interesting. While doing energy/time profiling I was lead back to an Apple tech support incident I had to file last April, because Apple made an undocumented change to the rules of what was necessary or an app to stay alive in the background when recording location data.

I suspect that change is why Quantified Map is now showing that annoying persistent location badge in the status bar / Dynamic Island.

Basically the response I got was that from iOS 16.4 onwards apps had to either show that status bar / Dynamic Island indicator, or had to request better than 1000 metre accuracy, with no distance filter applied.

LocoKit’s sleep mode used to drop down to requesting the lowest possible accuracy, and with a distance filter that would ensure no updates came in while sleeping. But that was no longer allowed.

That change was frankly bad from any angle, in terms of energy efficiency, and I did ask for that feedback to be passed back to the team. No idea if it was, but I’m going to experiment with reverting that change, to see if they did indeed backtrack on that.

What I’m seeing in the profiler is that during LocoKit’s sleep mode, location updates are continuing to periodically come in (then LocoKit correctly ignores them). iOS Location Services generating those updates is purely wasted energy.

Though I’m not quite convinced that that’s the cause of the excessive energy use you’re seeing. If it were the cause, I would expect it to be seen on all devices, but my “canary in the coal mine” iPhone 11 Pro test device isn’t seeing it.

But it clearly is an unnecessary cost that’s being paid, and that’s not cool. Quantified Map must’ve gone the route of turning on the annoying indicator instead of adhering to the newly required energy inefficient CLLocationManager settings.

I didn’t have that option, because showing that indicator would at the very least cause me a mountain of customer support headaches, and also likely lose subscribers, not to mention being a persistent visual annoyance.

Anyway, judging by what I’m seeing in the profiler so far, I think that’s costing some non-negligible amount of energy per hour while stationary, that would be enough of a difference to show up in Settings → Battery view while stationary. Whether it’s enough of a difference to have a noticeable impact on battery life per day… I don’t know. And it might differ by location - the CLLocationManager might be sending more pointless updates under some conditions than others. Hard to know.

I’ll experiment with the distance filter turned back on, to see if the Core Location team backtracked on that decision or not.

Ok, so Apple haven’t backtracked. The nonsense restriction is still there, and the only way to get peak efficiency is by showing that status bar / Dynamic Island indicator, which everyone hates.

I’m still not sure how much energy difference the less efficient CLLocationManager settings cost. It’s hard to do energy use comparisons when iOS is suspending the app. A suspended app uses zero energy, but also can’t wake up and start recording at the right time.

But my hunch is it’s enough energy difference to warrant adding an option in Arc’s Settings, to optionally turn on the indicator, to get potentially better energy efficiency while stationary. An utterly absurd setting to have to include, “turn on the blue bubble to get better battery life”, but hopefully the absurdity will eventually prompt someone at Apple to rethink their silly previous decision.

@denleschae Arc 3.15.0 is live now, which includes an option in Settings tab → Privacy for turning on the status bar / Dynamic Island indicator.

With that toggled on, LocoKit’s sleep mode can use the most efficient settings, which might make a difference to the energy drain you’re seeing.

I also made a couple of other energy use improvements when the app is in background and/or in sleep mode. But those were only minor regressions, that would be unlikely to add up to any noticeable difference in battery life.

Put all together, there might be enough difference to notice better battery life. But hard to say without a solid week of controlled testing.

Aside: I see now in iOS 17.2 the Settings → Battery view is showing “Connected to Charger” for some rows! That’s a nice improvement to my least favourite Settings view. It still doesn’t indicate how much of the actual energy use can be attributed to that, so it’s still just a fuzzy indicator, but it’s a step forward at least.

I noticed that update earlier and toggled that setting. I’ll see how it does. Thank you!

I also wonder if any of the greater battery drain of the iPhone 14/15 could be due to the dual band L1/L5 GPS not found in previous iPhones.

I pulled out an old iPhone 6S and loaded Arc ( whatever worked in iOS 15) to see how it fares knowing the battery there really stinks. It may be pointless, but I have a curious itch about all of this.

Oh I’d totally forgotten those models got dual band GPS! That actually gives me a “business expense” justification for upgrading from my 13 Pro :grin:

Yeah I’ve been pondering device model differences too, given that my 11 Pro does extremely well, but possibly won’t be a perfect “canary in the coal mine” if other device models act differently under some conditions.

But I can’t compare my 11 Pro to my 13 Pro, because the 13 is my main phone for both personal use and dev work, so it gets absolutely hammered, in different ways every day, so its energy use isn’t useful comparison data.

There have been device model energy efficiency regressions in the past. One notable one was when an iPhone generation came out that had more cores, coinciding with a new iOS version that changed how it calculated resource use and how it “punished” apps that went over certain thresholds. The calculation was accidentally being much more aggressive on the new phone models with more cores.

But certainly how each device model behaves in terms of location data at different locations can be significant factor. For example newer phone models have tended to produce more stable location data while stationary, which means better energy efficiency for large portions of the day. But it can go back and forth, with new models acting weirdly for a while until an iOS update comes out and fixes it (all undocumented, of course).

After a few typical weekdays with the new status bar indicator on it’s looking like my iPhone battery life is improved. Many thanks for listening, keeping with it, and digging up a fix. Yes, the indicator isn’t ideal, but I’m loving Arc so much that it’s worth the small visual clutter.

1 Like

That’s good to hear!

I’m not experiencing any noticeable difference myself, but my main phone gets absolutely hammered every day, and also differently every day, so there’s no way to accurately gauge it on that phone.

My 11 Pro was already getting 24 hour battery life, so it’s hard to notice any difference there either yet.

But at least in the profiler it shows up as doing less work with the more efficient settings, so it’s got to be at least better than before. Hopefully Apple will eventually backtrack on their weird decision too!