iOS后台应用:运行应用的最佳方式

时间:2014-03-10 10:42:49

标签: ios iphone background gps mode

我需要创建一个应用程序,以后台模式检索iOS无线电信息(rssi,bearer,...);该应用程序将在应用程序商店中提供,因此符合App Store指南。 该应用程序应合理地保留手机的电池。

我目前一起使用BackgroundFetch和GPS,它工作得很好但是当iOS内存不足时,应用程序被操作系统杀死。

我还看了谷歌应用程序(谷歌现在)使用GPS并保持iPhone的电池寿命,但我不知道他们是如何做到的。

由于

2 个答案:

答案 0 :(得分:1)

  1. 确保您的Plist中启用了“后台获取”和“位置更新”。
  2. 当您的应用在后台时,用户使用startMonitoringSignificantLocationChanges而不是startUpdatingLocation。以下是文档中的一些信息。
  3. “[startUpdatingLocation]通常需要启用位置跟踪硬件更长的时间,这可能会导致更高的用电量。” “[使用startMonitoringSignificantLocationChanges]应用程序可以在设备从之前的通知移动500米或更长时间后立即收到通知。它不应该比每五分钟更频繁地通知一次。”

    我会在这里阅读文档,以便您更好地理解(https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html#//apple_ref/occ/instm/CLLocationManager/startMonitoringSignificantLocationChanges

    您可能已经看到,使用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)。我想让计时器一直运行。