What determines the presence of the iPhone Location Services icon in the status bar?
Here's my situation. I'm developing an iPhone application that uses Core Location to determine the device's location. There is an icon: the Location Services Icon, that appears in the device's status bar. I know enough to say that the purpose of the icon is to tell the user that Location Services are currently being used by something. To the perceptive user, this means decreased battery life. For that reason, I want to be sure that the icon is displayed only when Location Services are actually being employed by my app.
Enter confusion. We, as developers, do not get access to the status bar via the official SDK. This means that the OS will display that icon automatically based on the behavior of the app. Try as I might, I cannot find a clear definition of what exactly causes that icon to show up.
As it stands, the icon appears before my app delegate gets control, and stays visible as long as the app is installed, running or not. This is clearly the worst case possible, and it made me doubt my use of CLLocationManager
. I would elaborate on my use, but as an extreme case I tried removing the CoreLocation framework (and the MapKit framework, which I suspect also uses CoreLocation), and all code relating to location. The app still caused the icon to appear and stay until I deleted the app. I then made a brand new app, and made no changes except to change the app identifier to match the identifier of my app. The icon still appeared. I changed the identifier to use the identifier of one of my apps that did not use location, and the icon did not appear. I did make sure to reset the device during this testing.
This issue is really killing me. I cannot imagine what the application ID has to do with the Location Services icon, but I see no other cause for its persistence. It seems like a Red H开发者_运维问答erring hiding the real issue, but I'm at a loss as to the real issue.
Here's an update and a solution I've come to after some fiddling. Since my problem was clearly an issue with the OS making some connection between my app's ID and the Location Services icon, I tried resetting the device's location warnings, which I did not originally know I could do. For the curious, this can be accomplished through the Settings app, then General > Reset > Reset Location Warnings. After making this reset and upon reinstalling the app, it again requested to use Location Services. Now, the icon appears precisely on startUpdatingLocation
and disappears precisely on stopUpdatingLocation
, exactly as I originally intended.
I have no idea what initially caused this condition, and I have little doubt that the condition itself is an OS bug, as indicated by Matthew Frederick, but, at least in my case, the condition is curable.
There's a known bug that's causing this problem. I reported it to Apple a couple of months ago and was informed that it was a dupe of a known problem. Unfortunately it doesn't appear to have been fixed.
I first discovered it when I saw the symbol appear (and my app showing as having permission to use location info in the Settings app) simply by installing my app on a device that no longer had the app installed, not having even run it.
For whatever reason the device keeps a reference to the app having once received permission for location services.
Worse, if the app actually received permission in the past, then gets uninstalled, then an updated version of the app is installed, not only does the icon appear but the upgraded app no longer actually receives location information because the app never gets to ask the OS for location permission. It's effectively permanently denied.
Very frustrating for me and a small number of my users.
You haven't enabled the location option in the UIBackgroundModes key of your app's .plist, have you?
精彩评论