2016-05-12 73 views
3

我经历了如此多的链接,即使在此之后,我还没有找到获取经纬度的适当解决方案。当应用程序处于后台时向服务器发送经纬度

Periodic iOS background location updates

iOS long-running background timer with "location" background mode

我从一些链接和论坛尝试,但它正在为仅3分钟,然后应用程序完全不更新用户的位置。

- (void)applicationDidEnterBackground:(UIApplication *)application { 
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 


//create new uiBackgroundTask 
__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
}]; 

//and create new timer with async call: 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

    [locationManager startUpdatingLocation]; 

    NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(startTrackingBg) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 
}); 

} 
-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
// store data 
CLLocation *newLocation = [locations lastObject]; 


//tell the centralManager that you want to deferred this updatedLocation 
if (_isBackgroundMode && !_deferringUpdates) 
{ 
    _deferringUpdates = YES; 
    [locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:10]; 
} 
} 

回答

9

好的。

经过三天挣扎后,即使在3分钟后,应用程序仍在后台,它仍然可以为我发送经纬度。

我检查了我的应用程序,在后台连续发送超过一个小时的经纬度。

它可以帮助至少一个。

首先请在您的pList中添加以下两个键。

1.NSLocationAlwaysUsageDescription 
2.NSLocationWhenInUseUsageDescription 

它是字符串,你可以给任何值。

然后请打开背景获取并检查项目部分功能下的位置更新。

然后导入Corelocation框架并添加下面的代码。

locationManager是一个全局变量。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
// Override point for customization after application launch. 
//create CLLocationManager variable 
locationManager = [[CLLocationManager alloc] init]; 
//set delegate 
locationManager.delegate = self; 

app = [UIApplication sharedApplication]; 
// This is the most important property to set for the manager. It ultimately determines how the manager will 
// attempt to acquire location and thus, the amount of power that will be consumed. 

if ([locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { 
    [locationManager setAllowsBackgroundLocationUpdates:YES]; 
} 
locationManager.desiredAccuracy = 45; 
locationManager.distanceFilter = 100; 
// Once configured, the location manager must be "started". 
[locationManager startUpdatingLocation]; 
} 

- (void)applicationWillResignActive:(UIApplication *)application { 
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 

[locationManager stopUpdatingLocation]; 
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[locationManager setDistanceFilter:kCLDistanceFilterNone]; 
locationManager.pausesLocationUpdatesAutomatically = NO; 
locationManager.activityType = CLActivityTypeAutomotiveNavigation; 
[locationManager startUpdatingLocation]; 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application { 
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 


[locationManager stopUpdatingLocation]; 

__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    bgTask = UIBackgroundTaskInvalid; 
}]; 

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10.0 
               target:self 
              selector:@selector(startTrackingBg) 
              userInfo:nil 
              repeats:YES]; 


} 

-(void)startTrackingBg { 

[locationManager startUpdatingLocation]; 
NSLog(@"App is running in background"); 
} 
//starts automatically with locationManager 
    -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 
latitude=newLocation.coordinate.latitude; 
longitude=newLocation.coordinate.longitude; 
NSLog(@"Location: %f, %f",newLocation.coordinate.longitude, newLocation.coordinate.latitude); 
} 
+0

@Santo ...请检查该bro..and试图帮助我.. http://stackoverflow.com/questions/37338466/sending-current-location-to-server-in-background- as-well-as-in-running-app- –

+0

@SurajSukale首先让我知道,你在建立时是否获得了当前位置? – Santo

+0

没有兄弟...其实我在这个应用程序开发非常新(第一次工作在这个特定的域位置)....你能帮我解决这个 –

相关问题