我试图在我的iOS应用程序中单击一次按钮来获取用户位置。我使用下面的代码来启动位置管理器。
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
locationManager.distanceFilter = 1000;
if ([CLLocationManager locationServicesEnabled]) {
[locationManager startUpdatingLocation];
}
else{
UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"The location services seems to be disabled from the settings." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
alert= nil;
}
当打开位置服务并且用户单击按钮时,它正常工作并且位置正确获取。
但是当位置服务关闭且用户尝试单击按钮时,根据我的代码,他的警报应如上所示。但在它到达其他循环之前,iOS会显示如下所示的系统级弹出窗口。
在此系统级别警报视图之上,将显示我自己的警报视图。这非常令人沮丧。问题是,如果用户取消系统级弹出而不是进入设置并尝试单击按钮,则第二次也会发生相同的事情(两个警报方案)。但是,如果用户继续执行相同步骤,则不会立即显示系统级警报。这意味着上面显示的系统级别弹出窗口仅会出现2次,之后不会发生任何事情。如何处理这种情况。请帮忙。
答案 0 :(得分:1)
通常有人会写:
if ([CLLocationManager locationServicesEnabled])
{
[locationManager startUpdatingLocation];
}
让iOS和用户对其进行排序。仅调用[CLLocationManager locationServicesEnabled]
将触发系统对话框(第一次)。以下代码未经过测试,但应按照您希望的方式运行:
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized)
{
if ([CLLocationManager locationServicesEnabled])
{
[locationManager startUpdatingLocation];
}
}
else
{
UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"The location services seems to be disabled from the settings." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
alert= nil;
}
修改强>
我上一段代码的结果是用户甚至不会被提示为您的应用启用位置更新。您可以执行以下操作:
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"userWasAskedForLocationOnce"])
{
if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized)
{
UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error"
message:@"The location services seems to be disabled from the settings."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
alert= nil;
}
}
else
{
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES]
forKey:@"userWasAskedForLocationOnce"];
if ([CLLocationManager locationServicesEnabled]) //this will trigger the system prompt
{
[locationManager startUpdatingLocation];
}
}
在这种情况下,用户将首次获得系统提示以启用位置更新。如果他们启用它们,他们以后就不会得到任何提示。如果没有,他们会在后续启动时收到您的自定义警告 - 直到他们在设置应用中启用位置更新。
注意1:为了测试此代码,您可能希望不时地从设备中删除您的应用程序(在您删除应用程序之前,用户默认设置是持久的)
注意2:虽然此代码应该达到所需的行为,但它可能会让用户烦恼。您的UI应该被安排,以便用户知道服务被禁用的位置 - 如果这部分代码在启动时自动执行,则警报有点过分。如果在某个用户的操作(点击按钮)后执行,则可以显示警告。
答案 1 :(得分:-1)
我不确定这一点。但是,每当用户接受或拒绝访问其当前位置的请求时,都会调用协议回调 locationManager:didChangeAuthorizationStatus:。有关详细信息,请参阅this。