204

I've submitted my app for review to the App Store Connect. Although the app is still under review, I've received an email to inform me that I have to fix an error. Here is the content of the message:

Dear Developer,

We identified one or more issues with a recent delivery for your app XXXXX. Your delivery was successful, but you may wish to correct the following issues in your next delivery:

"Missing Purpose String in Info.plist File. Your app's code references one or more APIs that access sensitive user data. The app's Info.plist file should contain a NSLocationAlwaysUsageDescription key with a user-facing purpose string explaining clearly and completely why your app needs the data. Starting spring 2019, all apps submitted to the App Store that access user data will be required to include a purpose string.If you're using external libraries or SDKs, they may reference APIs that require a purpose string. While your app might not use these APIs, a purpose string is still required. You can contact the developer of the library or SDK and request they release a version of their code that doesn't contain the APIs.

After you’ve corrected the issues, you can use Xcode or Application Loader to upload a new binary to iTunes Connect.

Best regards,

The App Store Team

My app is fully built with Expo and I don't know how to access and modify the Info.plist.

Any idea?

9
  • 4
    I'm having the same issue with the latest build, given that I don't even use Location Services in my app. And Apple has no official document about this change.
    – huong
    Commented Aug 24, 2018 at 11:40
  • 4
    +1 Did a release for the same app 2 days ago and everything is fine. 2 days later, just changed a couple of lines of code to do a new release (didn't add more Pods or something like that) and I got this message Commented Aug 24, 2018 at 16:00
  • 2
    We've experienced the same issue. I suspect it's a bug in the approval process (hopefully). I'm going to ignore for the weekend and hope that it's fixed on Monday.
    – AMB
    Commented Aug 24, 2018 at 16:48
  • 3
    I faced the same exact issue just now although our App doesn't really need Location Services Always. It just needs NSLocationWhenInUseUsageDescription which we already have a purpose string for. Probably this is just a glitch on Apple's end?
    – ilight
    Commented Aug 27, 2018 at 8:06
  • 3
    And in Apple-fashion, the link they provide in the email to fix it, is broken. Commented Aug 27, 2018 at 18:55

19 Answers 19

83

EDIT April 2019 : You now have to add these two keys, as spring 2019 has begun. Note that NSLocationAlwaysUsageDescription is now deprecated (since iOS 11) and has been replaced with NSLocationAlwaysAndWhenInUseUsageDescription and NSLocationWhenInUseUsageDescription. If you want to support lower than iOS 11, you'll have to use the three values.

To sum up you have to:

  • Add NSLocationAlwaysAndWhenInUseUsageDescription AND NSLocationWhenInUseUsageDescription for iOS 11 and more
  • And add NSLocationAlwaysUsageDescription if you want to support iOS 10 and less
  • And finally, you can add NSLocationUsageDescription if you wan to support iOS 8 and less.


You can submit your app even if you got this message !

I’ve just faced the same issue yesterday, even if the app isn’t using the location functionality. It may be related to some framework included in the project that have this optional feature.

I can confirm that my app has been approved even without the NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription key in info.plist

Indeed, as Apple stated in the mail :

Starting spring 2019, all apps submitted to the App Store that access user data will be required to include a purpose string.

So the only thing to do is to add this key (right now is better, so that you won’t forget) in you project so that it will be included in your next update.

Just add two new entries in your info.plist, with NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription as keys and a short description of why you use them as the value (even if you don’t really use them...).

3
  • 2
    In your April 2019 edit, are you sure you don't have the deprecation reversed? From what I see NSLocationUsageDescription is the one that's deprecated. Looking here: developer.apple.com/library/archive/documentation/General/…
    – apricity
    Commented May 17, 2019 at 15:40
  • The email I received from apple mentions NSLocationAlwaysUsageDescription so i think he has it reversed.
    – Dror Bar
    Commented Jul 16, 2019 at 9:41
  • @apricity @DrorBar Sorry guys, indeed I had made a mistake. It was not reversed but there was still a mistake, NSLocationAlwaysUsageDescription should be replaced by NSLocationAlwaysAndWhenInUseUsageDescription and NSLocationWhenInUseUsageDescription , and not by NSLocationUsageDescription (as I previously wrote, sorry…). I've updated my answer to add a sum up of the process.
    – AnthoPak
    Commented Jul 16, 2019 at 15:25
63

If you're using Expo, you can add solve by adding infoPlist to app.json like so:

  "expo": {
     "ios": {
       "bundleIdentifier": "com.app.myapp",
       "infoPlist": {
         "NSLocationAlwaysUsageDescription": "Some message to appease Apple.",
       },
     },
   }

Expo Docs

7
  • 45
    Actually it is NOT "some message to appease Apple" but to let the user know WHAT are you doing with the user's generated data (location) in this case. It is a matter of privacy concerns and I do think it is good to be fair to your apps users.
    – Lookaji
    Commented Sep 18, 2018 at 10:23
  • 4
    Gotcha! I was thinking to newbies that may be tempted to leave it so! I did not want to sound grumpy :) cheers!
    – Lookaji
    Commented Sep 18, 2018 at 21:58
  • @gwalshington I don't have any expo object in app.json Commented Apr 18, 2019 at 8:14
  • 3
    What text to type if we don't collect and Location data? We need to make up a lie :S
    – c0dehunter
    Commented Apr 29, 2019 at 11:42
  • 1
    @Lookaji since Google is not asking for it, as a Flutter dev, I AM doing it just to please Apple. Hence I don't even know if the <string> gets translated I'll have to figure this out
    – MwBakker
    Commented Jun 26, 2023 at 22:22
56

I have some apps in the store and I tried to distribute a version for QA and the same thing happened in two different Apps. I think this is a new criteria to accept the builds uploads to Appstore connect.

The solution is simple, add the following lines in the .plist file.

<key>NSLocationAlwaysUsageDescription</key>

<string>custom message</string>

<key>NSLocationWhenInUseUsageDescription</key>

<string>custom message</string>

PS: In my case have not using any feature of location, but I added these lines in order to comply with Appstore connect guidelines. Btw after receive that email, I could test the app even when they said that build it had some issues.

I hope this work for you guys.

5
  • 5
    Wow, I just got this, realized everyone is just getting this too! Commented Aug 26, 2018 at 5:31
  • first key has changed as of now to <key>NSLocationUsageDescription</key> Commented Mar 28, 2019 at 8:01
  • 1
    Do we have to re-archive after updating the info.plist ? Commented Apr 12, 2019 at 16:37
  • 1
    Do I have to increase the bundle version or version number to upload a new binary?
    – Dror Bar
    Commented Jul 16, 2019 at 9:39
  • @BishoyHanna YES! Dror Bar YES! Commented Dec 29, 2021 at 10:20
23

It's a new requirement from apple, even if you do not use location. If you want to add the permissions in Xcode, look for "Privacy - Location Usage Description" and "Privacy - Location When In Use Usage Description" and type a custom string for each of them.

enter image description here

5
  • 1
    In other app update, Apple requested this permission too: "Privacy - Location Always Usage Description" Commented Aug 31, 2018 at 22:34
  • 2
    So if I don't use these features, what I have to write there, a lie, something like "collect location for future use, maybe"? Commented Apr 24, 2019 at 18:02
  • yes, apple will reach to you if they have questions Commented Jul 10, 2019 at 14:37
  • 1
    I am not able to find Information Property List in my xcode 10.1, you should have mentioned where to find it, I have looked for Build Settings both for Targets and Project Commented Sep 7, 2019 at 6:41
  • 2
    Okay So Targets->Info->Custom ios Target Properties was the exact location Commented Sep 7, 2019 at 6:59
22

For more simplifying you can add these lines in your info.plist. These error are coming because Starting spring 2019, all apps submitted to the App Store that access user data will be required to include a purpose string.

  1. Open info.plist as source code.
  2. Add these following lines in your plist

    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
    
2
  • 3
    I had to remove extra spaces in <key> tags and then it worked.
    – innich
    Commented Mar 28, 2019 at 9:04
  • @innich thank you for pointing it out, I have changed my answer. Commented Mar 28, 2019 at 9:44
11

"Missing Purpose String in Info.plist File. Your app's code references one or more APIs that access sensitive user data. The app's Info.plist file should contain a NSLocationAlwaysUsageDescription key with a user-facing purpose string explaining clearly and completely why your app needs the data. Starting spring 2019, all apps submitted to the App Store that access user data will be required to include a purpose string.If you're using external libraries or SDKs, they may reference APIs that require a purpose string. While your app might not use these APIs, a purpose string is still required. You can contact the developer of the library or SDK and request they release a version of their code that doesn't contain the APIs.

Open Info.plist as source code.
Add these following lines in your plist

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
9
##Use this key in info.plist file

NSLocationAlwaysUsageDescription Your location is required for xyz benefits for you NSLocationWhenInUseUsageDescription Your location is required for xyz benefits for you

8

We did receive the same email and we aren't using the CoreLocation at all. After a quick search, we found that Parse SDK could use CoreLocation. In Apple's email, they clearly say:

If you're using external libraries or SDKs, they may reference APIs that require a purpose string.

That mean the minute your code or any other Library or SDKs can use CoreLocation, even if you don't use it, you need to provide privacy description for "When In Use" and "Always Use".

It is also something new from Apple and for now it's only a warning but it will be required starting in Spring 2019 for new submissions.

2
  • It's just stupid.... If I'm not using it, it could make peoples dont downloading my app just because of that. -_-
    – Mayoul
    Commented Sep 3, 2018 at 12:18
  • 4
    Not really. The alert asking you to use your localization won't show unless somewhere in the code the CLLocationManager.requestWhenInUseAuthorization() is called. Apple analyzed each app code to see if such a function could be called. If it's never called, the alert won't show up.
    – sebleclerc
    Commented Sep 4, 2018 at 14:39
7

There are the following cases:

NSLocationAlwaysAndWhenInUseUsageDescription (iOS>11)
NSLocationWhenInUseUsageDescription          (iOS>11)
NSLocationAlwaysUsageDescription             (iOS<=10)
NSLocationUsageDescription                   (seems very old, iOS8?)

Apple states at:

Add the NSLocationWhenInUseUsageDescription key and the NSLocationAlwaysAndWhenInUseUsageDescription key to your Info.plist file.

and:

If your app supports iOS 10 and earlier, add the NSLocationAlwaysUsage

NSLocationUsageDescription seems dead, the only ref in ADC site is: https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf

So to be sure, use first 3.

6

This issue is occurring because you haven't included

 <NSLocationAlwaysUsageDescription>

for your app. I faced the same issue when I tried to submit my app on the AppStore. After the app was processed, I got the same mail. I just added the description and now its resolved.

Hope this helps.

1
  • This helped me. If you are using Location in your app (or maybe just always) you need to add this line and a string below it. <key>NSLocationAlwaysUsageDescription</key> <string>Always And In Use Permission</string> Commented Oct 17, 2019 at 22:27
4

These answers all tell you how to comply with the App Store rules to avoid the warning but the true fix would be for Expo to allow you to disable their SDKs requirement for Location Services unless you actually use them - I'm not sure if this is possible.

4

Please review the email you received from **App Store Connect **

Identify The Missing Key enter image description here

Instructions

  1. Open info.plist file.

  2. Add and search for the missing key from the options provided (e.g. Contacts = Privacy - Contacts Usage Description)

  3. Add Usage Description:

$(PRODUCT_NAME) needs Contacts access to "Provide The Reason Here".

Example:

3
  • 1
    sir i got same error but why add to info.plist actually i m not used contact feature in my app so why we need to add it?
    – Kapil Soni
    Commented Feb 26, 2020 at 8:02
  • @Kapilsoni Please ensure you are not accessing one or more APIs that has access to sensitive user data
    – dbrownjave
    Commented Feb 26, 2020 at 12:20
  • 1
    :sir I have used only camera and location in my app?
    – Kapil Soni
    Commented Feb 26, 2020 at 13:31
3

same issue in Feb 19, got an email with a bunch of permissions I am not using, I assume they are from plugins. Apple says in March 19 it is a requirement so I am adding these in info.plst and uploading again.

It is very silly indeed.

1
  • 2
    More of a comment really...?
    – Steve
    Commented Feb 11, 2019 at 2:14
3

I had <key>NSLocationWhenInUseUsageDescription </key> instead of <key>NSLocationWhenInUseUsageDescription</key>

be sure to remove trailing whitespace

3

I also face the same issue but after 27 hours, I received the email about approved even I did nothing. So wait for approximately 24 hours instead of doing all this process again.

1
  • 1
    Yes, it’s a bug!
    – Danh Huynh
    Commented Oct 8, 2019 at 0:37
3

With Xcode 11 copy the key NSLocationAlwaysUsageDescription and add this to Info -> Custom iOS Target Properties -> Click + in the bottom left of this tab and as a value insert some kind of description like This app requires location access to function properly..

1

My app also got that, and I do nothing about it but it can run well ,next time I think should add such key in plist,just do some description

1

A short answer to the above problem -

NSLocationAlwaysUsageDescription must be updated with the following description in Info.plist file

{Your App Name} requires access to the location to suggest dengue outbreak zones.

1

In our case, we were using NSLocationWhenInUseUsageDescription in our app, but not NSLocationAlwaysUsageDescription.

Reading from the comments here (thanks matt-oakes), it looks like NSLocationAlwaysUsageDescription is being used by one of the dependency frameworks we use.

Running our app it doesn't show the actual NSLocationAlwaysUsageDescription permission modal, so it looks to just handle this in the background.

So in summary, adding NSLocationAlwaysUsageDescription to the Info.plist fixed the warning email, and did not change any behaviour in the app 👍🏻

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.