捕获所有州应用程序的位置

我不知道如何捕捉应用程序未运行时的位置并保存数据库。 已经遵循了几个教程,但没有工作。 请在得分重复之前,请您阅读完整的问题,因为这是不可能的。

我尝试了以下教程:

  • 当应用程序被终止/终止时,获取iOS 7和8的位置更新
  • 背景模式教程:入门
  • 在后台连续运行应用程序
  • 不完全是我所需要的,但我仍然尝试

假设我没有捕获位置的实现。 我需要每天中午,捕捉用户的位置,并保存数据库,然后发送到Web服务。 无论应用程序在后台处于活动状态还是不在运行状态(中间的两个button和拖动),都必须执行此捕获位置。

我尝试了一些在互联网上find的教程,甚至是社区里的一些build议,但还是没有奏效。

  • 我已经添加了背景模式 – 位置。
  • 我允许获取位置requestAlwaysAuthorization

语言可以在Objective-C或Swift中,最重要的是,我学习如何在所有状态的应用程序中捕获这个位置。

好的,我打算尽可能简单。启用背景模式,并勾选像这样的背景获取 在这里输入图像说明

遵循这个方法的每一步

当应用程序终止

AppDelegate.h

  #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong,nonatomic) CLLocationManager *locationManager; @end 

AppDelegate.m

 #define userDef [NSUserDefaults standardUserDefaults] #define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) #import "AppDelegate.h" #import <CoreLocation/CoreLocation.h> #import "AFNetworking.h" #import <GoogleMaps/GoogleMaps.h> @implementation AppDelegate{ BOOL fromTerminated; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { fromTerminated = NO; if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) { fromTerminated = YES; self.locationManager = [[CLLocationManager alloc]init]; self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; self.locationManager.activityType = CLActivityTypeOtherNavigation; [self.locationManager startUpdatingLocation]; } return YES; } - (void)applicationDidBecomeActive:(UIApplication *)application { if(self.locationManager){ [self.locationManager stopMonitoringSignificantLocationChanges]; self.locationManager = nil; self.locationManager.delegate = nil; } self.locationManager = [[CLLocationManager alloc]init]; self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; self.locationManager.activityType = CLActivityTypeOtherNavigation; if(IS_OS_8_OR_LATER) { [self.locationManager requestAlwaysAuthorization]; } [self.locationManager startMonitoringSignificantLocationChanges]; } -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ NSLog(@"locationManager didUpdateLocations: %@",locations); if(fromTerminated){ CLLocation * newLocation = [locations lastObject]; CLLocationCoordinate2D theLocation = newLocation.coordinate; CLLocationAccuracy theAccuracy = newLocation.horizontalAccuracy; [userDef setObject:[NSString stringWithFormat:@"%f",theLocation.longitude] forKey:@"LONGITUDE"]; [userDef setObject:[NSString stringWithFormat:@"%f",theLocation.latitude] forKey:@"LATITUDE"]; self.myLocation = theLocation; self.myLocationAccuracy = theAccuracy; [self updateLocation]; } } -(void)updateLocation{ // call your webservice for updating } @end 

此代码将执行以下操作 – >后台提取将触发位置更改,并启动应用程序, didFInishLaunchingWithOptions将使用选项字典中的UIApplicationLaunchOptionsLocationKey进行调用。 如果它发现这意味着应用程序已经终止并醒来后台获取。 现在你有30秒左右的时间做你的东西。 因此,您创build一个位置pipe理器对象并开始更新,这将触发您的didUpdateLocations委托方法,然后您可以调用您的方法触发您的服务器或数据库中更改的位置。

在普通的VC中,创build另一个位置pipe理器对象,就像在didFinishiLaunchingWithOptions方法中创build的一样,并实现委托方法didUpdateLocation直到应用程序处于前台或后台didUpdateLocation 。 应用程序委托方法hack将在其终止时触发应用程序。

干杯:)

[编辑]

当应用程序在前台或后台

 #import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewController ()<CLLocationManagerDelegate> @property (nonatomic,strong) CLLocationManager *locationManager; @end @implementation ViewController{ } -(void)viewDidAppear:(BOOL)animated{ if(self.locationManager == nil){ _locationManager = [CLLocationManager new]; } _locationManager.delegate = self; _locationManager.distanceFilter = kCLDistanceFilterNone; _locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 && [CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) { [_locationManager requestAlwaysAuthorization]; } else { [_locationManager startUpdatingLocation]; } } - (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { _locationManager = nil; CLLocation *location = [locations lastObject]; theUser.latitude = [NSString stringWithFormat:@"%f",location.coordinate.latitude]; theUser.longitude = [NSString stringWithFormat:@"%f",location.coordinate.longitude]; } } - (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { switch (status) { case kCLAuthorizationStatusNotDetermined: { } break; case kCLAuthorizationStatusDenied: { } break; case kCLAuthorizationStatusAuthorizedWhenInUse: case kCLAuthorizationStatusAuthorizedAlways: { [_locationManager startUpdatingLocation]; //Will update location immediately } break; default: break; } } @end 

[编辑]

要检查应用程序是否在终止状态后启动,请执行此更改并点击运行button并从故事板中更改设备的位置 在这里输入图像说明

做这个更改,并运行项目(在设备的debugging模式下执行此操作),并通过此更改位置,然后在applicationDidFinishLaunchingWithOptions粘贴一个断点,您将看到该断点被击中,这意味着应用程序处于终止状态,但此位置更改已经触发操作系统启动应用程序。 在这里输入图像说明

希望能让你明白