iCalvin.org

Location Permissions In iOS 11

There's been some big changes to Location Permission and how iOS reports apps using those permissions to users in iOS 11, and since I spend most of my days working on an app that uses those permissions pretty heavily I figured I would weigh in on some of the changes, including some recent developments.

TLDR: I agree with the intention behind the new changes in iOS 11 B1-4, and see the drive for the new behavior in B5, but I think that the defaults are wrong and the source of control is wrong.

On to the details!

Since iOS 8 apps have been able to request access to Location Services and specify whether they need access at all times (kCLAuthorizationStatusAuthorizedAlways) or only while the app is in the Foreground or otherwise 'In Use' (kCLAuthorizationStatusAuthorizedWhenInUse).

If an app had 'While in use' permission and was still 'In Use' while you were in another app, you would see a double height Blue status bar that would call out your app, and allow the user to quickly jump back to your app by tapping it. This may happen because your app is in the process of finishing whatever Location usage it was in the middle of when you left the app, or if it was accessing location permission in response to a notification action or something. Either way the scope was limited, and you would shortly see that Location Usage Indicator disappear.

On the other hand, if an app had 'Always' permission it could access your location at any time and the only indication would be the Status Bar 'Arrow' Indicator, which doesn't specify which or how many apps are currently using your location. You could dig into the Privacy -> Location Services screen and take a look through all apps that have requested location permission and see an app-specific indicator, but otherwise you had no visibility into what apps with 'Always' permission were actually using your location or when.

This is usually fine. For instance, I use an app called Moves that tracks my movement from place to place so I can see at the end of the day not only how much time I spent commuting, or out to lunch, but also how long I spent at each individual place I visited. That app would not work without 'Always' permission, and I didn't feel the need to see a large Status Bar indicating that the app was working properly. This led to some terrible app behavior though from certain apps. I'll pick on Uber here because it's a well known case, but they are far from the only ones to abuse this system.

When the Uber app requested location permission they only requested 'Always' access, and there was no option to fall back to only 'While In Use'. And since the Uber app functionality is severely limited if you don't allow any location access, every user pretty quickly agreed that Uber should 'Always' be allowed access to their location. Eventually, however, people started to notice that the Uber Location Access Indicator in the Settings app would remain active long after a ride ended. Uber has since said that this was to improve their analytics and ensure user safety, but just recognizing that the Uber app was using user's location more often than they assumed made many of them uncomfortable, to say nothing of the other apps that may be doing similar practices.

In response to this behavior Apple made some changes to location permission in iOS 11. First, apps can no longer only request access to the 'Always' permission level. Any system prompt for 'Always' access will still allow the user to opt for 'While In Use' level permission, so in the case of Uber this would mean that user's concerned about how and when Uber accesses their location could enable the less invasive permission level, even if Uber didn't provide them that option explicitely. Secondly, apps with 'Always' permission would show the double height blue 'Location Access Indicator', so users would be very aware of which apps were taking advantage of that access and when.

It's important to note at this point that just because an app has permission to access your location at any time doesn't mean it necessarily uses that access all the time. Apps can be smart and conservative here about determining when the best time is to reach into those capabilities, so even if you have 'Always' permission for an app you might not see the app using your location all the time.

However, there are certain classes of apps, such as Moves, or my company's app, which do take advantage of this access level and are pretty much always accessing or monitoring your location as part of key features, and for these apps the new Bar behavior very quickly became a problem. The bar would be present at all times, it may clash with the UI of whatever app you were trying to use, and any accedental taps, when trying to press a button on the Navigation Bar for instance, would jump you to the app using the permission. Every screenshot I took on my phone would prominently feature the "{appName} is actively using your location" message at the top of the screen. This was obviously not ideal, and plenty of developers made their feelings on the matter very clear. It's a very classic case of Apple making a decision on the side of user privacy that ends up making developer lives more difficult, but it also made these apps annoying to use as users. I ended up turning off Moves and disabling location access for my company's app because it got too annoying to constantly have that blue bar.

Apple has made some changes now, however, in iOS 11 Beta 5 which change the behavior of the blue bar again, but I personally feel like it goes too far in the direction of appeasing developers and easing this Quality of Life issue that user's have at the expense of the very real benefits that this new behavior solved.

Now whether or not the Location Usage Indicator Bar is displayed for apps with 'Always' permission is controlled by the new CLLocationManager showsBackgroundLocationIndicator boolean property, but the default value is set to false. I have no idea why this would be the default value, or even in the developer's hands at all. If anything I would expect the default value to be to show the usage bar, for all of the user focused privacy reasons why the behavior was originally implemented. If developers want to disable it and hide their location usage again, make them take an extra step to actively disable the indicator. Or better yet, don't leave that in the hands of the developer at all.

In my case the constant Blue Bar is annoying, for sure, but it serves an important purpose to inform me of what apps are using my location and when. If I want to take an extra step to hide it, acknowledging that the app is using my location and that I'm ok with it, let me do that from the Location Permissions page. It could be a toggle, on be default, under the 'Always' option when selected. That would allow for all of the benefits of having users aware of how their location permissions are being used, while still allowing user's to disable the behavior if it ever gets intrusive.

Really hope that this behavior changes. It feels like they're so close now to something that works and is informative and useful, but I completely disagree with where they are placing the power to mask location access.