gpt4 book ai didi

ios - 在所有州应用程序中捕获位置

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:24 26 4
gpt4 key购买 nike

我想知道如何在应用程序未运行时捕获位置并保存数据库。已经遵循了几个教程,但没有一个有效。请在评分为重复之前,我要求您阅读完整的问题,因为它不可能。

我尝试了以下教程:

假设我没有捕获位置的实现。我每天中午都需要捕获用户的位置并保存数据库,然后发送到 Web 服务。无论应用程序是否在后台处于事件状态或未运行(中间按钮上的两个环并拖动),都必须创建此捕获位置。

我尝试了一些在 Internet 上找到的教程,甚至尝试了一些社区在这里推荐的教程,但仍然没有奏效。

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

语言可以是 objective-c 或 swift,最重要的是,我学会了如何在应用程序处于所有状态时捕获此位置。

最佳答案

好吧,我会让这个尽可能简单..启用背景模式并像这样勾选背景获取enter image description here

每一步都遵循这个方法

当应用终止时

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

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

在您的普通 VC 中创建另一个位置管理器对象,就像您在 didFinishiLaunchingWithOptions 方法中创建的一样,并实现委托(delegate)方法 didUpdateLocation 这将运行直到应用程序处于前台或背景。应用程序委托(delegate)方法 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

[编辑]

要检查应用程序是否在终止状态后启动,请执行此更改并点击运行按钮并更改 Storyboard中设备的位置 enter image description here

做这个改变,然后运行项目(在设备的 Debug模式下做这个)并由此更改位置,然后在 applicationDidFinishLaunchingWithOptions 中设置一个断点,您将看到断点被击中,这意味着应用程序处于终止状态,但此位置更改已触发操作系统启动应用程序。 enter image description here

希望能让你明白

关于ios - 在所有州应用程序中捕获位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32393198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com