Tag: core location

检测用户是否正在车内移动

注意 :这个问题最初是在苹果在iOS SDK中引入运动检测硬件和相关的API之前发布的。 但是,这个问题的答案仍然是相关的。 我正在创build一个iPhone iOS应用程序,涉及跟踪用户的跑步和/或行走。 logging用户跑步和走路的结果保持诚实是非常重要的。 我需要一种方法来抓住使用汽车时可能会作弊的用户(或者意外地离开了跟踪器)。 为了检查用户是在开车还是在车上骑车,我首先想到了这两个检查,但是这两个检查都不能确定用户是否在车中(到某一点)。 用以下方法检查用户的当前速度。 如果用户的行驶速度超过20海里/小时,那么我可以假设用户在汽车里: – (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *recentLocation = [locations lastObject]; recentLocation.speed; //If speed is over 20 MPH, assume the user is not on their feet. 但是,我不确定这是否是一个很好的检查,因为人们logging的速度比以前更快 。 这是一个很好的检查,还是应该使用别的东西? 确定用户使用Core Motion Framework提供的Accelerometer和Motion API进行加速的速度。 如果用户加速超过一定的速度,那么我可以假设用户正在车辆中旅行。 这些假设是正确的吗? 我想我真正的问题是这样的: 有没有更好的方法来检测用户是否在车辆中移动 – 如果是这样的话? 。 如果不是,那么这些检查是否适合这种情况呢,还是会让一些实际上很快的用户感到烦恼呢? CoreMotion是适当的API来做到这一点? 编辑:新的iPhone 5S […]

使用MapKit和CoreLocation时的Xcode警告

我试图使用实现MKMapView的实例,使用CoreLocation跟踪用户的位置,然后放大到他们在哪里。 我只想跟踪用户的位置,当我在前台。 由于我的应用程序是针对iOS8,我有一个关键的NSLocationWhenInUseUsageDescription plist入口。 当我第一次运行应用程序时,应用程序会正确地询问是否可以访问我的位置。 当我点击“允许”后,我收到来自Xcode的以下警告: Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first. …这有点令人困惑,因为我实际上正在调用requestWhenInUseAuthorization ,在我的代码中可以看到: @property (strong, nonatomic) IBOutlet MKMapView *mapView; @property(nonatomic, retain) CLLocationManager *locationManager; @end @implementation MapView – (void)viewDidLoad { [super viewDidLoad]; [self locationManager]; [self updateLocation]; } – (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; […]

iOS 7上的区域监视故障 – 同时显示多个通知

我一直在iOS上开发区域监控大约2个月。 最近我们发现一个小故障,一个半径范围内(大约4.7KM或4700米)的所有地区同时触发。 该设备的当前位置甚至没有接近任何地区。 我不知道是什么引发了这个事件。 我已经通过StackOverFlow,苹果开发者论坛等进行了search,我还没有发现任何类似的问题,我所面临的。 在我正在开发的应用程序中,我们正在监控市内的8个区域(吉隆坡)。 有一次,我的同事发现有4个地区的通知同时在他的电话上触发。 下面是显示他的位置,所有监控区域,触发4区域通知的潜在半径的地图。 绿色标记是设备接收通知时的位置。 蓝圈是设备的潜在半径(大约4700米),覆盖了向设备发送通知的4个区域。 红圈是每个区域的半径。 地图上还有另外两个地区永远不会发送通知(从不遮盖蓝色圆圈) 触发通知的屏幕截图 : 这是我的位置pipe理器代码 : CLLocationManager *locationManager = [LocationTracker sharedLocationManager]; locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; locationManager.distanceFilter = kCLDistanceFilterNone; 这是我的代码didEnterRegion : – -(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{ NSString* message = [NSString stringWithFormat:@"Message"]; UIApplicationState state = [[UIApplication sharedApplication] applicationState]; if (state == UIApplicationStateBackground || state == […]

iPhone GPS在后台暂停后不会恢复

我的应用程序需要跟踪用户在后台的位置变化,只要用户移动,就可以正常工作。 当用户停止并且CLLocationManager在10-20分钟左右之后暂停时。 这是通知: -(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{} 这对我也很好。 太好了,我省了一些电池等等 问题是,当用户开始再次移动时, CLLocationManager永远不会被唤醒, 直到我将应用程序放到前台 (获取活动状态) 之前 ,下面的委托方法才会被触发 : //Never called back after CLLocationManager pauses: -(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{} -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{} 为什么在设备重新开始移动之后, locationManagerDidResumeLocationUpdates从来不会被调用? GPS不应该自动恢复(自动暂停)? 有没有用户的交互恢复GPS的方法? 应用程序在Info.plist文件中声明如下: 我的CLLocationManager设置是: locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [locationManager setActivityType:CLActivityTypeFitness]; //I WANT pauses to save some battery, etc… That is why following line […]

iOS Geofence CLCircularRegion监控。 locationManager:didExitRegion似乎没有按预期工作

我目前正试图让我的应用程序使用CoreLocation来监视特定的区域,但是我发现它似乎并不像预期的那样工作,在我看来,它不能为每个位置(即10米)设置一个小的半径集。 我也放了一个小testing应用程序,在地图上绘制圆半径 ,以便我可以直观地看到发生了什么。 我用于监视位置的代码如下所示: self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; // Set-up a region CLLocationDegrees latitude = 52.64915; CLLocationDegrees longitude = -1.1506367; CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude); CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:centerCoordinate radius:10 // Metres identifier:@"testLocation"]; [self.locationManager startMonitoringForRegion:region]; 我还没有把这里的代码放在DidEnter地区等,因为我知道,当我离开监控区域超过100米的时候,这个代码是有效的。 这里是一个应用程序的屏幕截图,当我远离地图上的紫色位置超过10米时,出口区域事件不会触发,但是如果我将位置切换到伦敦,它会触发,而且当我设置我的位置时回到当前蓝色位置的地方也会发生火灾。 有谁知道是否有最小区域半径的限制,或者我可能做错了什么。 谢谢Aaron

从后台任务iOS 7中启动位置pipe理器

看起来,在iOS 7中,应用程序无法从后台任务中启动位置pipe理器(通过调用startUpdatingLocation)。 在iOS 6中,我使用了这里描述的方法: https : //stackoverflow.com/a/6465280每n分钟运行一次后台位置更新。 这个想法是用定时器运行后台任务,并在计时器触发时启动位置pipe理器。 之后,closures位置pipe理器并开始另一个后台任务。 更新到iOS 7后,此方法不再适用。 启动位置pipe理器后,应用程序不会收到任何locationManager:didUpdateLocations。 有任何想法吗?