起因

用户群反馈app可能请求了不合适的定位权限:始终定位。

看到这个截图,根据经验判断可能是后台定位功能导致可能不得不请求始终定位权限。再加上之前提交审核时,苹果要求在plist文件中新增NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationAlwaysUsageDescription键值对。猜测可能是对某些点的理解混淆了,因为这种用户体验的确不好。

解决思路

因为此项目是前同事遗留代码,自从接手后迭代次数比较有限。于是计划根据以下步骤进行排查和验证:

查现有代码和plist文件

查官方文档

改工程代码

提交审核,查看邮件提醒

app退入后台,查看定位信息是否输出

查plist文件和权限请求代码

plist文件

以下键都已加入:

NSLocationAlwaysUsageDescription

NSLocationWhenInUseUsageDescription

NSLocationAlwaysAndWhenInUseUsageDescription

权限请求代码

全局搜索request,找到定位权限请求代码,发现

if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {

[_locationManager requestAlwaysAuthorization];

}

查官方文档

plist文件配置

NSLocationAlwaysUsageDescription

Discussion

Use this key if your iOS app accesses location information in the background, and you deploy to a target earlier than iOS 11. In that case, add both this key and NSLocationAlwaysAndWhenInUseUsageDescription to your app’s Info.plist file with the same message. Apps running on older versions of the OS use the message associated with NSLocationAlwaysUsageDescription, while apps running on later versions use the one assocated with NSLocationAlwaysAndWhenInUseUsageDescription.

If your app only needs location information when in the foreground, use NSLocationWhenInUseUsageDescription instead. For more information, see Choosing the Authorization Level for Location Services.

If you need location information in a macOS app, use NSLocationUsageDescription instead.

Important

This key is required if your iOS app uses APIs that access the user’s location at all times and deploys to targets earlier than iOS 11.

NSLocationWhenInUseUsageDescription

Discussion

Use this key if your iOS app accesses location information only when running in the foreground. If your app needs location information when in the background, use NSLocationAlwaysAndWhenInUseUsageDescription instead. For more information, see Choosing the Authorization Level for Location Services.

If you need location information in a macOS app, use NSLocationUsageDescription instead.

Important

This key is required if your iOS app uses APIs that access the user’s location information while the app is running in the foreground.

NSLocationAlwaysAndWhenInUseUsageDescription

Discussion

Use this key if your iOS app accesses location information while running in the background. If your app only needs location information when in the foreground, use NSLocationWhenInUseUsageDescription instead. For more information, see Choosing the Authorization Level for Location Services.

If you need location information in a macOS app, use NSLocationUsageDescription instead. If your iOS app deploys to versions earlier than iOS 11, see NSLocationAlwaysUsageDescription.

Important

This key is required if your iOS app uses APIs that access the user’s location information at all times.

对比可知:

如果app需要前台运行定位权限,需要配置NSLocationWhenInUseUsageDescription;

如果app需要后台运行定位权限,需要配置NSLocationAlwaysAndWhenInUseUsageDescription;如果适配iOS11之前版本,还需要配置NSLocationAlwaysUsageDescription

这几种键的区别主要在于区分app 前后台运行 时的权限配置。

权限请求代码

requestAlwaysAuthorization

When the user grants “Always” authorization to your app, your app can start any of the available location services while your app is running in the foreground or background. In addition, services that allow your app to be launched in the background continue to do so.

Important

Requesting “Always” authorization is discouraged because of the potential negative impacts to user privacy. You should request this level of authorization only when doing so offers a genuine benefit to the user.

requestWhenInUseAuthorization

You must call this method or the requestAlwaysAuthorization()method prior to using location services. If the user grants “when-in-use” authorization to your app, your app can start most (but not all) location services while it is in the foreground. (Apps cannot use any services that automatically relaunch the app, such as region monitoring or the significant location change service.) When started in the foreground, services continue to run in the background if your app has enabled background location updates in the Capabilities tab of your Xcode project. Attempts to start location services while your app is running in the background will fail. The system displays a location-services indicator in the status bar when your app moves to the background with active location services.

官方建议:

The type of authorization (“when-in-use” or “always”) that you request determines which location services your app can access and when it can use them:

When-in-use authorization. Your app can use most services but cannot use services that automatically relaunch the app. Your app must always start services while running in the foreground. If you enable the background location capability for your app, a suspended app will wake in the background to handle location events. However, if your app is not running, it will not be launched.

Always authorization. Your app can use all location services, and it can start those services from either the foreground or the background. If a location-related event occurs when your app is not running, the system launches your app and delivers the event.

官方更详细说明:

https://developer.apple.com/documentation/corelocation/choosing_the_location_services_authorization_to_request

改工程代码

保持plist配置不变

修复请求方法:

if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {

[_locationManager requestWhenInUseAuthorization];

}

提交审核,查看邮件提醒

新增version,打包上传,查看邮件提醒:并未提及定位权限有何问题。

app退入后台,查看定位信息是否输出

为验证app退到后台依旧可以定位,故实测退到后台后,gps回调方法中log是否持续输出,结果:会!

结论

plist权限配置的定义和通过代码请求权限不是绝对的一一对应关系,容易被误解,前同事也是在这个地方混淆了。这也是本bug出现的根本原因。

以后遇到类似易混淆概念,还是查好多篇相关官方文档,并充分理解后再写代码比较好。关于本知识点,网上有的教程可能会混淆,请注意鉴别。

让我们杜绝浅尝辄止,追求精益求精!

原文:https://www.cnblogs.com/Dast1/p/12133174.html

ios定位权限plist_iOS定位权限问题易犯的错误小结相关推荐

  1. css html 对错号,HTML_DIV+CSS编码时易犯的错误,CSS+DIV是网站标准(或称“WEB - phpStudy...

    DIV+CSS编码时易犯的错误 CSS+DIV是网站标准(或称"WEB标准")中常用的术语之一,通常为了说明与HTML网页设计语言中的表格(table)定位方式的区别,因为XHTM ...

  2. Linux管理员易犯的错误

    对于初入linux的管理员们来说,迁移到Linux是一场噩梦,而且在Linux管理中稍微不小心就会出错,如果不避免这些错误的话就会给我们的网络和系统带来风险,那么我们现在就去看看Linux管理员易犯的 ...

  3. Android4.0 Design之UI设计易犯的错误2

    想成为Android的杰出开发工程师,不懂得Android的设计规则怎么可以,Android4.0问世后谷歌公司为Android程序员规范了一系列的设计原则,不要再盲目的模仿IOS的设计了,因为And ...

  4. 7个跑步易犯的错误和解决办法

    似乎所有人都认为跑步是一种非常简单的锻炼方式,然而,其实不然,跑步涉及到许多专业知识.错误的跑步,不仅影响锻炼效果,而且还容易导致受伤. 1.鞋子不合适 问题:穿着太旧的跑步鞋或者类型不合适的运动鞋容 ...

  5. 外汇资金管理上易犯的错误

    赚钱是做外汇投资的最终目的,为了获取更多的钱,首先管理好自己手中的钱是每位投资者走向成功的必由之路,能够正确冷静科学合理的运用资金,很大程度上区分了一位投资者是否优秀.一般而言,在外汇资金管理方面投资 ...

  6. 5个golang中易犯的错误

    点击上方蓝字关注我们 To err is human,to forgive divine. -Alexander Pope 初学golang我们经常会犯一些错误,虽然它们不会产生类型检查的异常,但是它 ...

  7. javascript中易犯的错误有哪些

    javascript中易犯的错误有哪些 一.总结 一句话总结: 比如循环中函数的使用 函数中this的指向谁(函数中this的使用) 变量的作用域 1.this.timer = setTimeout( ...

  8. Linux初到者五个最易犯的错误

    随着Ubuntu 10.10的到来,为你的业务试用Linux的理由列表又变长了一些.此款自由与免费的操作系统现在变得空前用户友好,而又提供了其竞争对手所不具备的安 全性等其他优势.如果你是新Linux ...

  9. Android4.0 Design之UI设计易犯的错误1

    想成为Android的杰出开发工程师,不懂得Android的设计规则怎么可以,Android4.0问世后谷歌公司为Android程序员规范了一系列的设计原则,不要再盲目的模仿IOS的设计了,因为And ...

最新文章

  1. 热部署插件JRebel使用解决方案(安装+踩坑+使用方法)傻瓜式超详细!!!
  2. 方法的绑定机制-静态绑定和动态绑定
  3. java entity转dto_java 使用反射在dto和entity 实体类之间进行转换
  4. Python进阶:并发编程之Asyncio
  5. win10计算器rsh_Win10计算器在哪里?
  6. elementui table某一列是否显示_elementui 中 loading 组件源码解析(续)
  7. QT初探(QT+VS2010)
  8. PyQt5 QTreeView树图
  9. Arduino相关函数
  10. PassMark PerformanceTest v10.1.1004 电脑性能测试工具直装版
  11. matlab int积分常数,matlab int 积分
  12. DC算法竞赛——员工离职预测
  13. 阿里云部署Java网站和微信开发调试心得技巧(下)
  14. 网络布线的概念和IP的计算
  15. Cloud Compare快速大规模配准
  16. 学习微博中情感分类的句子表达(NLPCC2013)
  17. 初学入门YOLOv5手势识别之制作并训练自己的数据集
  18. 2021软科计算机科学与技术,2021软科排名,NTU 十学科跻身世界前十!
  19. 提取节点最大应力应变方法(APDL)
  20. Linux之网络配置

热门文章

  1. 网易有道面经(2013校园招聘杭州站)zz
  2. 联想电脑window10点击电池图标无法显示电池模式切换bug解决
  3. ESLive课件白板介绍
  4. 文档生成工具docsify光速上手
  5. crazy的比较级最高级_小学英语比较级和最高级知识点
  6. CSDN“让弹幕飞”全新玩法攻略,独享今年双11
  7. 葡萄酒产业成就迪庆雪域高原“紫色传奇”
  8. php云人才系统分站,PHP云人才系统(PHPYun) 4.0 正式版
  9. 计算机if函数,计算机IF函数
  10. 只有B股没有A股的股票