Flutter开发之iOS后台定位开发详解

需求目的

开发一个功能持续获取用户的位置发送给后端,PC端会根据后端传来的移动端发送的位置信息,来绘制使用者的运动轨迹。

实现需求 是否实现
后台定位
持续定位
后台正常运行

前言

因为笔者使用的是Flutter 来跨端开发,并不是专门的iOS开发人员,所以对iOS的技术不是非常的了解,因此走了很多弯路,本文会以一个 非专业的iOS 兼容开发者角度来记录笔者遇到的问题及解决方案。

出现的问题

  1. 定位权限 :按部就班申请定位权限,但是发现在设置中,应用跟别的应用(高德地图,滴滴出行)等少了 “始终” 使用位置
  2. 定位失效 :息屏或者按Home键 ,就立即或者在一定时间后无法正常定位

查询资料

根据 各方面资料及开发者文档中,得出以下结论:
iOS 7以前:永不始终 选项的位置权限
iOS 8-10:永不始终 选项 ,可以通过配置NSLocationWhenInUseUsageDescription 可出现 使用App期间 选项
iOS 11 - 12:
不用配置NSLocationAlwaysUsageDescription,就会出现永不始终使用App期间
iOS 13:增加 允许一次 选项
Allow Once 提出了 Temporary authorization 的概念。当用户选择 Allow Once 后,我们的 App 就获得了 Temporary authorization ,也就是临时权限
该权限有以下特点:

  1. 实际的权限类型是:WhenInUse;
  2. App 重启后,定位权限会重新变成 NotDetermined,下次开启定位时再申请定位权限会重新弹框让用户确认;
  3. 在 iOS 13 系统,申请 WhenInUse 或 Always 权限时,系统都会先弹出来下面的弹框让用户选择:
    “使用app时允许、允许一次、不允许”
    用户选择 Allow While In Use
    如果用户选择 Allow While In Use ,我们的 App 会获得 WhenInUse 权限。
    如果之前申请的是 WhenInUse 权限,那么就跟 iOS 13 之前版本的系统表现没什么区别;
    系统会在某个时间再弹出一个弹框询问用户是继续给我们的 App WhenInUse 权限,还是切换成 Always 权限,iOS 13 中,没法直接向用户要 Always 权限了,必须要经过一个二次确认。

备注:系统确认弹窗弹出时,为打断状态(UIApplicationStateInactive)。

开发实现

解决权限问题

Flutter 提供了对应的权限插件,可以在pubspec.yaml文件中引入

permission_handler

还需要在 info.plist 文件中声明权限

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>需要您提供定位信息,才能使用xxx功能记录您的正确工作轨迹</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>需要您提供后台定位信息,才能使用xx功能记录您的正确工作轨迹</string>
<key>NSLocationUsageDescription</key><string>需要您提供定位信息,才能使用xx功能记录您的正确工作轨迹</string>
<key>NSLocationWhenInUseUsageDescription</key><string>需要您提供定位信息,才能使用xx功能记录您的正确工作轨迹</string>

iOS审核有一个明确的规定:申请像拍照、相册、位置这些敏感权限时,必须在 info.plist文件中详细说明 什么功能,或者为什么要使用该权限,像
需要你提供相机,才能拍照 这些类似 描述是会影响上架的。

至于 Flutter 权限管理具体建议请参考笔者这篇文章 Flutter Android权限问题
都是使用了Flutter 框架,并且也是提到了 permission_handler 插件的封装使用。

if (await PermissionHelper.check(PermissionType.locationAlways)) {// 这里写应用获取权限之后的业务逻辑
}

这里强调一下,建议用 PermissionType.locationAlways,对应的是 permission_handler插件的 Permission.locationAways,这样双管齐下才能出现 始终获去 位置的 选项。

最后的结果如下图所示

后台保活问题

尽管解决了定位问题,但是用户反馈熄灭屏幕一段时间之后 位置轨迹就不准确了,还有用户反馈 移动过程中,接听了一次电话或者使用Home键切换后台之后(并未杀死进程)位置轨迹不准确了。根据用户描述,判断应该是在这些条件出现之后,程序无法执行代码,后台进程并未存活。所以接下来 面对的就是 iOS 后台保活。

根据苹果开发者文档:
iOS与Android 的后台机制不同,Android一般采用的是真后台机制,iOS采用的墓碑机制来管理 后台应用进程。
在Android系统中, 它允许APP留存在后台, 依靠着Service服务组件继续运行,抢占前台CPU资源, 这是Android手机使用时间长后卡顿的主要原因
iOS中,系统会对非前台应用,实施墓碑冻结进程,CPU将资源让出,但是仍在内存中保留

iOS 7以前 ,应用在后台最多存活10分钟,
iOS 7 - 9,应用在后台最多存活 180秒
iOS 10-13,

墓碑机制在不同的版本会有不同的表现,大致就是应用无法长期在后台存活,会被系统冻结进程,最后当内存不足的时候随机会被系统强行回收内存。

当下的目的就是必要要保证应用能在“无限运行”。

解决后台保活

如图1,在 Mac OS 下以Flutter项目为例,进入 /${项目根路径}/ios 目录,双击 Runner.xcodepro ,进入图3。

图1

如图 2 可以在Android Studio里面 右键点击项目 ,然后依次选中 Flutter -> Open iOS module in Xcode 然后也能打开 XCode编辑 项目中的iOS模块。

图2

如下图,打开Xcode之后,点击Runner 就可以弹出 配置面板。首先点击 Signing & Capabilities ,

图3

如下图所示


点击 Change All

iOS为我们提供了 几种场景下 可以使用 无限后台的能力
比如 下图所示,分别提供了 :音频、定位更新、基于IP的网络通话、外部必要的访问、使用蓝牙访问、后台拉取、远程通知、后台运行 等这么几项场景下可以做到 无限后台的能力。当然笔者所遇到的场景应该属于 后台定位,再加上需要不断发送位置信息给服务端,所以 再勾上 后台运行,就可以了(注意的是可以利用这种方式可以实现后台常驻,但是AppStore会对应用非常严格的审核,防止开发者滥用权限)

结果

最终效果如下图所示


代码虽然写完了,还剩下最后一步的最重要的上架环节,在上架申请页面中一定要表述清楚自己的目的,否则很容易被审核拒绝。

码字不易,如果对您有帮助,可以一键三连。有遗漏的地方,我会后续在本文中补充添加。

Flutter开发之iOS后台定位开发详解相关推荐

  1. iOS 高德地图开发详解

    Demo地址 如果有所帮助记得关注,点Star demo中添加了查看路况功能,如果不需要,可以删除. ##一:基本地图功能实现 ####1.申请密钥流程 申请密钥链接 2.配置环境(重点) 高德地图提 ...

  2. IOS后台运行机制详解(一)

    一.iOS的"伪后台"程序 首先,先了解一下iOS 中所谓的「后台进程」到底是怎么回事吧? Let me be as clear as I can be: the iOS mult ...

  3. Flutter开发之iOS真机调试(六)

    一.首先你要有个开发者账号. 二.真机数据线直连Mac 电脑,并保持解锁状态. 三.选择真机设备运行工程. VS Code 终端执行 lxx-Mac-mini:uuuu suning$ flutter ...

  4. Discuz!X论坛开发(九)二次开发之Discuz X2 文件目录功能详解

    原文链接: http://www.discuz.net/forum.php?mod=viewthread&tid=2359270&reltid=1625972&pre_thre ...

  5. Flutter开发之iOS应用打包发布(23)

    Flutter iOS android 编译打包 安卓开发者如何使用Flutter打包IOS应用 https://www.jianshu.com/p/a052cbfd12fa Flutter的菜鸟教程 ...

  6. IOS后台运行机制详解(二)

    (温馨提示:亲,请先看上篇,此文乃下篇) 三.iOS长时间后台运行的实现代码 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhon ...

  7. android开发之eclipse调试debug模式详解

     之前我写了一个相关的帖子,但是今天看了一个还是写的比我详细,于是我拿过来和大家分享. 1.在程序中添加一个断点 如果所示:在Eclipse中添加了一个程序断点 在Eclipse中一共有三种添加断 ...

  8. Android开发之Activity的生命周期详解

    Android生命周期分为两部分: (1)典型情况下的生命周期. (2)异常情况下的生命周期. 典型情况下的生命周期分析 ​图1 Activity的生命周期图解 ​图2 Activity生命周期的金字 ...

  9. Flutter开发之ListView下拉刷新上拉加载更多(35)

    在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...

最新文章

  1. 深度学习框架集成平台C++ Guide指南
  2. 预告:Javascript全栈开发的系列文章
  3. tcp校验和计算校验和例子_浅谈TCP协议,总算明白它是干什么的了
  4. MATLAB 中怎么求图像在水平方向和垂直方向的像素和,用图表示
  5. C#检测转换是否成功
  6. 【大数据教程】MapReduce基本架构、统计每个人三次考试成绩的最高分,统计每一个人花费的总流量、按地区,统计每一个人花费的总流量
  7. Cewolf使用小结
  8. Java实现将日志信息存到TXT中
  9. C++ 获取函数耗时
  10. int转换为cstring_PostgreSQL 隐式类型转换探秘
  11. lnmp—MemCache的作用
  12. 神州租车:陆正耀辞任公司董事会主席及非执行董事职务
  13. Java中常见的URL问题及解决方案
  14. Hadoop简单安装配置
  15. Unicode - 16 位统一超级字符集
  16. PT100/PT1000热电阻值计算
  17. html 页面北京怎么设置,怎么给html设置背景色
  18. 是时候重估“返利网”的市场价值了
  19. gromacs 安装_Gromacs 4.0.3、4.5.5版安装方法
  20. 2021SC@SDUSC山东大学软件学院软件工程应用与实践--Ebiten代码分析 源码分析(三)

热门文章

  1. android 播放器评测,山灵M6新版评测 简谈山灵所有安卓播放器音质差异
  2. 大课深度复盘、解密研发效率之道 | 第42届MPD工作坊成都站日程公布!
  3. 五子棋人机对弈代码——之博弈树算法
  4. NEUQACM双周赛(二)
  5. 类似比心的电竞游戏约玩陪玩APP基础版,需要开发什么功能
  6. Python爬虫系列之逆向淘股吧app签名sign算法
  7. 树莓派安装Ubuntu Mate解决无法连接WiFi问题,并部署Ros系统
  8. COM编程之三 QueryInterface
  9. Socket编程-应用编程接口(API)--套接字(及其函数介绍)
  10. cad10版计算机快键在哪,AutoCAD2010快捷键有哪些?快捷键的详细介绍