我需要创建一个应用程序,以后台模式检索iOS无线电信息(rssi,bearer,...);该应用程序将在应用程序商店中提供,因此符合App Store指南。 该应用程序应合理地保留手机的电池。
我目前一起使用BackgroundFetch和GPS,它工作得很好但是当iOS内存不足时,应用程序被操作系统杀死。
我还看了谷歌应用程序(谷歌现在)使用GPS并保持iPhone的电池寿命,但我不知道他们是如何做到的。
由于
答案 0 :(得分:1)
“[startUpdatingLocation]通常需要启用位置跟踪硬件更长的时间,这可能会导致更高的用电量。” “[使用startMonitoringSignificantLocationChanges]应用程序可以在设备从之前的通知移动500米或更长时间后立即收到通知。它不应该比每五分钟更频繁地通知一次。”
您可能已经看到,使用startMonitoringSignificantLocationChanges可以显着延长电池寿命。以下是我在AppDelegate.m中实现它的方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[self.locationManager startMonitoringSignificantLocationChanges];
...
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
...
[self.locationManager stopUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
...
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
...
[self.locationManager stopMonitoringSignificantLocationChanges];
[self.locationManager startUpdatingLocation];
...
}
-(CLLocationManager *)locationManager{
if(!_locationManager){
_locationManager = [[CLLocationManager alloc]init];
_locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
_locationManager.distanceFilter = 5;
}
return _locationManager;
}
这样我确保在应用程序处于活动状态时仅使用耗电“startUpdatingLocation”方法,并且在非活动时使用省电“stopMonitoringSignificantLocationChanges”。
答案 1 :(得分:0)
我对您上面的代码进行了测试。
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
//NSLog(@"Location: %f, %f", newLocation.coordinates.longtitude, newLocation.coordinates.latitude);
longitude = newLocation.coordinate.longitude;
latitude = newLocation.coordinate.latitude;
gpsTimestamp = [newLocation.timestamp timeIntervalSince1970];
NSLog(@"Changed ! ");
if (!timer && ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground)) {
NSLog(@"Starting task");
timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(createBgIndicator) userInfo:nil repeats:YES];
}
}
在这种情况下,定时器仅在我移动时启动并执行5次(10s)。我想让计时器一直运行。