无法在 iOS 的后台获取 GPS(已启用后台模式插件)
Cannot get GPS in background of iOS (background mode plugin enabled)
大家好,你们能把我从项目的悬崖上救出来吗?
背景:
我有一个基于地图模板的 Ionic 项目。它所做的是跟踪用户的步行路线并将其绘制到google地图上。
问题出现在 iOS 台设备 上,背景为 运行。我无法正确获取 GPS 数据。
仅供参考:已安装并设置 BackgroundMode 插件。
Scenario 1: Use cordova-plugin-geolocation plugin
It does not work. No GPS data collected when turning off screen.
Scenario 2: Use plain JS with navigator.geolocation.getCurrentPosition
It works. GPS data collected but not correct. Data is somehow duplicated (!!) from previous ones. Thing get back to normal when I open
the app again.
任何想法都会有所帮助。
使用的插件:
cordova-plugin-background-mode 0.6.5
cordova-plugin-customurlscheme 4.1.5
科尔多瓦插件设备 1.1.1
cordova-plugin-geolocation 2.1.0
cordova-plugin-splashscreen 3.2.1
cordova-plugin-statusbar 2.1.2
cordova-plugin-whitelist 1.2.1
离子插件键盘 2.0.1
已编辑:
目标平台?
iOS 7+,以及 Android 4.1+,根据 Ionic 的要求。
测试设备iOS版本?
iOS 9.2 (13C75) 在 iPhone 5
你在前台测试过你的App吗?
是的,我愿意。为了澄清,这里有更详细的测试:
我有两个测试功能:一个数组用于GPS采集,一个计数器用于后台模式检查。两者都运行在区间设置下
(在 iOS 上)
前景:
计数器工作,数量增加。
GPS 工作,数据添加到数组。
背景:
计数器工作,数量增加。
GPS 不工作,数据要么没有收集(使用 ngCordova 地理定位插件),要么与 JS 奇怪地重复 navigator.geolocation
您是否为 ios 应用启用了后台定位模式?在进行构建之前,请检查您的 .plist 文件以确保您的应用已启用 "background modes" 并且 "location services" 在 "background modes" 下 checked/listed。
还要确保您的 .plist 文件包含 NSLocationAlwaysUsageDescription
,否则设备将不会请求 Always
位置使用权限,并且位置将仅基于 NSLocationWhenInUseDescription
可用。
更新:
您还需要一个步骤来确保应用程序正确地请求 'always' 运行 后台权限。
如何:
- 在您的 xcode 项目中搜索 CDVLocation.m 文件,然后找到包含 NSLocationAlwaysUsageDescription
的代码块
- 重新排序 if else 条件,将 NSLocationAlwaysUsageDescription
条件移动到第一行
(可选)
如果您通过 ionic cli 运行 ionic prepare ios
进行构建,则在 xcode 中打开您的项目并确认上述设置,因为它们通常会被 cordova 插件覆盖,除非您特别指定为 after_install
和其他事件设置脚本。
大家好,你们能把我从项目的悬崖上救出来吗?
背景:
我有一个基于地图模板的 Ionic 项目。它所做的是跟踪用户的步行路线并将其绘制到google地图上。
问题出现在 iOS 台设备 上,背景为 运行。我无法正确获取 GPS 数据。 仅供参考:已安装并设置 BackgroundMode 插件。
Scenario 1: Use cordova-plugin-geolocation plugin
It does not work. No GPS data collected when turning off screen.
Scenario 2: Use plain JS with navigator.geolocation.getCurrentPosition
It works. GPS data collected but not correct. Data is somehow duplicated (!!) from previous ones. Thing get back to normal when I open the app again.
任何想法都会有所帮助。
使用的插件:
cordova-plugin-background-mode 0.6.5
cordova-plugin-customurlscheme 4.1.5
科尔多瓦插件设备 1.1.1
cordova-plugin-geolocation 2.1.0
cordova-plugin-splashscreen 3.2.1
cordova-plugin-statusbar 2.1.2
cordova-plugin-whitelist 1.2.1
离子插件键盘 2.0.1
已编辑:
目标平台?
iOS 7+,以及 Android 4.1+,根据 Ionic 的要求。
测试设备iOS版本?
iOS 9.2 (13C75) 在 iPhone 5
你在前台测试过你的App吗?
是的,我愿意。为了澄清,这里有更详细的测试:
我有两个测试功能:一个数组用于GPS采集,一个计数器用于后台模式检查。两者都运行在区间设置下
(在 iOS 上)
前景:
计数器工作,数量增加。
GPS 工作,数据添加到数组。
背景:
计数器工作,数量增加。
GPS 不工作,数据要么没有收集(使用 ngCordova 地理定位插件),要么与 JS 奇怪地重复 navigator.geolocation
您是否为 ios 应用启用了后台定位模式?在进行构建之前,请检查您的 .plist 文件以确保您的应用已启用 "background modes" 并且 "location services" 在 "background modes" 下 checked/listed。
还要确保您的 .plist 文件包含 NSLocationAlwaysUsageDescription
,否则设备将不会请求 Always
位置使用权限,并且位置将仅基于 NSLocationWhenInUseDescription
可用。
更新:
您还需要一个步骤来确保应用程序正确地请求 'always' 运行 后台权限。
如何:
- 在您的 xcode 项目中搜索 CDVLocation.m 文件,然后找到包含 NSLocationAlwaysUsageDescription
的代码块
- 重新排序 if else 条件,将 NSLocationAlwaysUsageDescription
条件移动到第一行
(可选)
如果您通过 ionic cli 运行 ionic prepare ios
进行构建,则在 xcode 中打开您的项目并确认上述设置,因为它们通常会被 cordova 插件覆盖,除非您特别指定为 after_install
和其他事件设置脚本。