捕获所有州应用程序的位置
我不知道如何捕捉应用程序未运行时的位置并保存数据库。 已经遵循了几个教程,但没有工作。 请在得分重复之前,请您阅读完整的问题,因为这是不可能的。
我尝试了以下教程:
- 当应用程序被终止/终止时,获取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
粘贴一个断点,您将看到该断点被击中,这意味着应用程序处于终止状态,但此位置更改已经触发操作系统启动应用程序。
希望能让你明白