在我的iOS应用程序中,我在后台启用了位置服务,并且始终启用。我还设置了每500米的区域监控,因此如果iOS在后台杀死我的应用程序,那么它将使用区域监控唤醒。 但我发现更新位置有一个主要问题。我禁用了iOS的位置服务并重新启用它,我的应用程序仍在后台,但它的位置图标显示禁用和其他应用程序甚至不在后台显示启用。请参阅附件截图。 如果有人知道这一点,那么请指导我。
答案 0 :(得分:1)
答案 1 :(得分:0)
In app delegate.m,
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions
{
[self setUpLocationManager];
return YES;
}
#pragma mark - CLLocationManager Delegate
-(void)setUpLocationManager
{
LocationManager=[[CLLocationManager alloc]init];
LocationManager.delegate=self;
LocationManager.desiredAccuracy=kCLLocationAccuracyBest;
[LocationManager requestWhenInUseAuthorization];
[LocationManager startUpdatingLocation];
}
-(void)locationManager:(CLLocationManager )manager didUpdateLocations:(NSArray<CLLocation > *)locations
{
CLGeocoder *GioCoder=[[CLGeocoder alloc]init];
[GioCoder reverseGeocodeLocation:LocationManager.location completionHandler:^(NSArray<CLPlacemark > Nullable placemarks, NSError * Nullable error)
{
if (error !=nil)
{
}
else
{
CLPlacemark *place=[placemarks lastObject];
NSLog(@"%@",place);
NSString *Path=[[NSBundle mainBundle]pathForResource:@"countries" ofType:@"json"];
NSError *Error;
NSData *JsonData=[[NSData alloc]initWithContentsOfFile:Path options:NSDataReadingMappedAlways error:&Error];
NSMutableArray *DataArray=[[NSMutableArray alloc]init];
if (Error==nil)
{
NSError *err;
DataArray=[NSJSONSerialization JSONObjectWithData:JsonData options:NSJSONReadingMutableContainers error:&err];
}
for (int i=0; i<DataArray.count;i++)
{
if ([[[DataArray objectAtIndex:i]valueForKey:@"code"] isEqualToString:place.ISOcountryCode])
{
// Insert your code here
[LocationManager stopUpdatingLocation];
break;
}
}
}
}];
}
-(void)locationManager:(CLLocationManager )manager didFailWithError:(NSError )error
{
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusRestricted)
{
NSLog(@"Location not enabled in your device");
}
else
{
}
}
答案 2 :(得分:0)
正如赖纳在答案中所说,你的理解是错误的。如果您有空紫色箭头,则表示您的地理围栏已正确设置。
如果其他应用停留已填充紫色。这可能是由于多种原因:
pausesLocationUpdatesAutomatically
已设置为false
并且始终在跟踪。pausesLocationUpdatesAutomatically
已设置为true
但尚未在某个位置停留足够长时间以触发暂停,从而在技术上将已填充紫色变为灰色或空紫色(表示应用程序正在使用重要位置更改或regionMonitoring或访问监控继续跟踪)AFAIK如果您的区域设置为500米,那么使用SignificantLocation Changes会更好。因为您可以使用cellTower信息。对于regionMonitoring应用程序,每隔几分钟打开和关闭它的位置跟踪,以确保它已退出应用程序。
非常重要的注意事项
关于此的Apple文档非常令人困惑。我花了整整一个星期才想出来!
区域监控或重要位置跟踪或访问仅当您的应用已终止时,监控才会在后台启动应用。如果您的应用再次启动,则直接从DidFinishLaunching
startLocationUpdates
启动。
如果您的应用已暂停或出于某种原因仍在后台,您只能获得didExitRegion
回调。而AFIAK从回调中你无法startUpdateLocations
。这是来自WWDC的非常模糊的文本。
最后,您必须开始您的位置更新 前景。如果您没有在前台开始更新,那么 不会得到这种特殊的行为。那么如果你确实开始了,会发生什么 在后台更新?好吧,首先,您的应用可能会 需要AlwaysAuthorization,因为您的应用程序将不会被考虑使用 那时。此外,核心位置不会采取任何行动 确保您的应用继续运行。所以如果你有后台运行时 由于某种原因,你决定开始一个位置会议,你 可能会获得一些更新,但可能也会在您收到您希望收到的所有信息之前被暂停。
<子> WWDC 2016: Session 716 子>
我不知道Apple为什么会这样说......根据电池/电池覆盖率/使用模式/ iOS版本,它可能会有所不同。显然,他们不希望我们的开发人员知道如何做。他们想强迫我们采取其他方式。
让您的应用程序进入终止状态的唯一方法是,如果您的用户手动杀死应用程序或等待很长时间,即等待任何或所有其他后台任务完成+然后应用程序暂停等待使其终止,然后退出该区域以启动应用并能够开始跟踪地点