Ios位置服务背景问题

时间:2017-07-22 06:19:00

标签: ios core-location

在我的iOS应用程序中,我在后台启用了位置服务,并且始终启用。我还设置了每500米的区域监控,因此如果iOS在后台杀死我的应用程序,那么它将使用区域监控唤醒。 但我发现更新位置有一个主要问题。我禁用了iOS的位置服务并重新启用它,我的应用程序仍在后台,但它的位置图标显示禁用和其他应用程序甚至不在后台显示启用。请参阅附件截图。 如果有人知道这一点,那么请指导我。

enter image description here

3 个答案:

答案 0 :(得分:1)

我认为你有错误的概念,箭头未填充意味着应用程序正在使用地理围栏,如果你滚动到该列表的底部,你可以阅读图例,你可以在这个截图中看到

enter image description here

希望这有助于你

答案 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版本,它可能会有所不同。显然,他们不希望我们的开发人员知道如何做。他们想强迫我们采取其他方式。

让您的应用程序进入终止状态的唯一方法是,如果您的用户手动杀死应用程序或等待很长时间,即等待任何或所有其他后台任务完成+然后应用程序暂停等待使其终止,然后退出该区域以启动应用并能够开始跟踪地点