- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
测试设备:iPhone 5(iOS 7)
我有一个使用RegionMonitoring
和updateLocation
的应用程序。如果输入区域,则按预期方式调用didEnterRegion
。然后我叫startUpdatingLocation
。但是didUpdateToLocation
方法仅被调用10-20次,而它应该更新位置直到计时器触发。
相关代码:
CLLocationManager *_locationManager;
NSTimer *_timer;
-(void)initLocationManager
{
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager setActivityType:CLActivityTypeOther];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[_locationManager setPausesLocationUpdatesAutomatically:NO];
[_locationManager setDistanceFilter:kCLDistanceFilterNone];
}
//Did Enter Region, called as expected:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
[_locationManager startUpdatingLocation];
_timer = [NSTimer scheduledTimerWithTimeInterval:300.0f target:self selector:@selector(scheduleMethod:) userInfo:nil repeats:NO];
}
//Timer Fire Method:
- (void) scheduleMethod:(NSTimer*)timer
{
[Utils writeToLog:@"Timer-Stop"];
[_locationManager stopUpdatingLocation];
}
//This Method only called 10-20 Times (in the first 10-20 Seconds) and not the complete 5 Minutes:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
[Utils writeToLog:@"LocationUpdate!"];
}
locationManagerDidPauseLocationUpdates
方法中重新启动更新,但似乎从未调用过此方法:
-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager
{
[WRUtils writeToLog:@"LocationUpdate paused, restarted"];
[_locationManager startUpdatingLocation];
}
didFailWithError
方法中的错误,但这两种方法均未调用。
[_locationManager setActivityType:CLActivityTypeOther];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[_locationManager setPausesLocationUpdatesAutomatically:NO];
最佳答案
Apple在iOS 7中引入了一项新策略。如果在应用程序处于后台时调用“startUpdatingLocation”,iOS 7将不再在后台提供位置更新。在这种情况下,只有将应用程序置于前台时,您才能获得更新。
使用地理围栏功能时,每次收到RegionEntered/Exited通知来处理此通知时,您的应用程序都将仅获得几秒钟的时间。在这几秒钟内,您可能还会获得位置更新。在这几秒钟之后,iOS 7再次挂起您的App。
您可以使用后台任务获得不止几秒钟的时间,但是在iOS 7中,Apple还将应用程序可以在后台运行的时间从10分钟(iOS 6和更早版本)减少到了iOS 7下的3分钟。这3分钟是该应用程序在后台整个时间内的总时间。这意味着您不能要求iOS 7十次获得1分钟的背景时间,您总共只能得到3分钟,因此,在第三次要求一分钟之后,您的应用程序将不再获得任何背景时间。完全没有。
在后台获取位置更新的唯一机会是在应用程序处于前台时调用“startUpdatingLocation”。尤其当您仅需要响应Region(Enter/Exit消息)进行位置更新时,这很可悲,因为您需要让位置更新始终保持运行。但是,在以下情况下,可以通过将精度值设置为kCLLocationAccuracyThreeKilometers来至少减少电池使用量:
您不需要位置更新,仅在确实需要地理坐标时才将精度设置为kCLLocationAccuracyBest。对于kCLLocationAccuracyThreeKilometers值,iOS无法为GPS供电,因此在这种情况下,电池使用量会适中。
同样,在IOS 7下,精度的值kCLLocationAccuracyBestForNavigation似乎也会引起问题。如果设备未连接到外部电源,则该值不会获得任何位置更新。
总而言之,新的iOS 7位置更新政策使开发某些类型的Apps变得更加困难。与其仅在需要时注册位置更新,不如在应用程序的生命周期内强制您注册这些位置更新。尽管苹果公司对这项新政策的意图可能恰好相反,但这当然会更快地消耗电池电量。
更新:
经过更多测试后,我找到了解决该问题的方法。
苹果公司的文档提到,当使用“有意义的位置更改API”时,即使在后台启动“startUpdatingLocation”,应用程序也可以在后台接收位置更新。
我的第一个测试效果不佳。我刚刚在调用startUpdatingLocation之前就在区域监视委托(delegate)方法中注册了我的App,以进行重要的位置更新(因此,仅在需要时才启用此位置服务),但是仍然无法如文档所建议的那样在后台提供位置更新。
但是,如果您在应用启动后立即开始监听重大的位置更改(并且永远不要关闭此功能),则可以在应用处于后台时调用start“startUpdatingLocation”,并在后台接收位置更新。一直具有“重要位置更改”功能的电池使用量似乎很低,因此这可能是大多数应用程序的解决方案。
您必须检查设备上是否具有“重要位置更改”功能,但似乎所有当前设备都支持此功能。甚至第5代iPod Touch都支持它(iPod Touch不能使用手机信号塔进行位置更新,根据Apple的文档,这是此功能的基本方法,因此我想我们可以假定当前所有运行iOS的设备7可以使用“重要位置更新” API。虽然检查此功能是否确实可用可能是一个好主意,但在某些情况下,该功能不可用。
使用“重大位置更改” API可能有一个缺点:只要设备移动“显着”,该应用程序便可以在后台重复启动(如果该应用程序被iOS终止在后台以将其内存重用于其他应用程序),则无需重复进行此操作。 “(根据文档:当手机发射塔发生变化时,但每5分钟不超过一次)。因此,仅在退出或进入某个区域时才需要激活的应用程序将启动并通知位置更改一直以来,不仅在那些地区,而且我认为这应该比始终激活标准位置更新要好得多。
我的iPhone 5s在显着的位置更改处于事件状态的情况下,夜间只消耗1%的电量,而在标准位置更新处于事件状态且精确度设置为3km的情况下,则消耗了12%的电量。
希望这对所有正在努力应对新iOS 7行为的开发人员有所帮助。
关于ios - StartUpdateLocations在后台运行,didUpdatingToLocation仅调用10-20次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20187700/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!