Flutter开发之iOS后台定位开发详解
Flutter开发之iOS后台定位开发详解
需求目的
开发一个功能持续获取用户的位置发送给后端,PC端会根据后端传来的移动端发送的位置信息,来绘制使用者的运动轨迹。
实现需求 | 是否实现 |
---|---|
后台定位 | ✅ |
持续定位 | ✅ |
后台正常运行 | ✅ |
前言
因为笔者使用的是Flutter 来跨端开发,并不是专门的iOS开发人员,所以对iOS的技术不是非常的了解,因此走了很多弯路,本文会以一个 非专业的iOS 兼容开发者角度来记录笔者遇到的问题及解决方案。
出现的问题
- 定位权限 :按部就班申请定位权限,但是发现在设置中,应用跟别的应用(高德地图,滴滴出行)等少了 “始终” 使用位置
- 定位失效 :息屏或者按Home键 ,就立即或者在一定时间后无法正常定位
查询资料
根据 各方面资料及开发者文档中,得出以下结论:
iOS 7以前:永不、始终 选项的位置权限
iOS 8-10:永不、始终 选项 ,可以通过配置NSLocationWhenInUseUsageDescription 可出现 使用App期间 选项
iOS 11 - 12:
不用配置NSLocationAlwaysUsageDescription,就会出现永不、始终、使用App期间
iOS 13:增加 允许一次 选项
Allow Once 提出了 Temporary authorization 的概念。当用户选择 Allow Once 后,我们的 App 就获得了 Temporary authorization ,也就是临时权限
该权限有以下特点:
- 实际的权限类型是:WhenInUse;
- App 重启后,定位权限会重新变成 NotDetermined,下次开启定位时再申请定位权限会重新弹框让用户确认;
- 在 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后台定位开发详解相关推荐
- iOS 高德地图开发详解
Demo地址 如果有所帮助记得关注,点Star demo中添加了查看路况功能,如果不需要,可以删除. ##一:基本地图功能实现 ####1.申请密钥流程 申请密钥链接 2.配置环境(重点) 高德地图提 ...
- IOS后台运行机制详解(一)
一.iOS的"伪后台"程序 首先,先了解一下iOS 中所谓的「后台进程」到底是怎么回事吧? Let me be as clear as I can be: the iOS mult ...
- Flutter开发之iOS真机调试(六)
一.首先你要有个开发者账号. 二.真机数据线直连Mac 电脑,并保持解锁状态. 三.选择真机设备运行工程. VS Code 终端执行 lxx-Mac-mini:uuuu suning$ flutter ...
- Discuz!X论坛开发(九)二次开发之Discuz X2 文件目录功能详解
原文链接: http://www.discuz.net/forum.php?mod=viewthread&tid=2359270&reltid=1625972&pre_thre ...
- Flutter开发之iOS应用打包发布(23)
Flutter iOS android 编译打包 安卓开发者如何使用Flutter打包IOS应用 https://www.jianshu.com/p/a052cbfd12fa Flutter的菜鸟教程 ...
- IOS后台运行机制详解(二)
(温馨提示:亲,请先看上篇,此文乃下篇) 三.iOS长时间后台运行的实现代码 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhon ...
- android开发之eclipse调试debug模式详解
之前我写了一个相关的帖子,但是今天看了一个还是写的比我详细,于是我拿过来和大家分享. 1.在程序中添加一个断点 如果所示:在Eclipse中添加了一个程序断点 在Eclipse中一共有三种添加断 ...
- Android开发之Activity的生命周期详解
Android生命周期分为两部分: (1)典型情况下的生命周期. (2)异常情况下的生命周期. 典型情况下的生命周期分析 图1 Activity的生命周期图解 图2 Activity生命周期的金字 ...
- Flutter开发之ListView下拉刷新上拉加载更多(35)
在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...
最新文章
- 深度学习框架集成平台C++ Guide指南
- 预告:Javascript全栈开发的系列文章
- tcp校验和计算校验和例子_浅谈TCP协议,总算明白它是干什么的了
- MATLAB 中怎么求图像在水平方向和垂直方向的像素和,用图表示
- C#检测转换是否成功
- 【大数据教程】MapReduce基本架构、统计每个人三次考试成绩的最高分,统计每一个人花费的总流量、按地区,统计每一个人花费的总流量
- Cewolf使用小结
- Java实现将日志信息存到TXT中
- C++ 获取函数耗时
- int转换为cstring_PostgreSQL 隐式类型转换探秘
- lnmp—MemCache的作用
- 神州租车:陆正耀辞任公司董事会主席及非执行董事职务
- Java中常见的URL问题及解决方案
- Hadoop简单安装配置
- Unicode - 16 位统一超级字符集
- PT100/PT1000热电阻值计算
- html 页面北京怎么设置,怎么给html设置背景色
- 是时候重估“返利网”的市场价值了
- gromacs 安装_Gromacs 4.0.3、4.5.5版安装方法
- 2021SC@SDUSC山东大学软件学院软件工程应用与实践--Ebiten代码分析 源码分析(三)
热门文章
- android 播放器评测,山灵M6新版评测 简谈山灵所有安卓播放器音质差异
- 大课深度复盘、解密研发效率之道 | 第42届MPD工作坊成都站日程公布!
- 五子棋人机对弈代码——之博弈树算法
- NEUQACM双周赛(二)
- 类似比心的电竞游戏约玩陪玩APP基础版,需要开发什么功能
- Python爬虫系列之逆向淘股吧app签名sign算法
- 树莓派安装Ubuntu Mate解决无法连接WiFi问题,并部署Ros系统
- COM编程之三 QueryInterface
- Socket编程-应用编程接口(API)--套接字(及其函数介绍)
- cad10版计算机快键在哪,AutoCAD2010快捷键有哪些?快捷键的详细介绍