Answers:
尽管很难找到答案,但是解决方案非常简单。
经过多次尝试和错误,我发现,当您首次尝试访问应用中的任何位置服务时,会弹出位置访问对话框,但如果该CLLocationManager
对象之前已释放,则该对话框会自行消失(无需任何用户交互)用户响应对话框。
我正在CLLocationManager
用我的viewDidLoad
方法创建一个实例。由于这是该方法的本地实例,因此该方法在执行完成后由ARC释放。实例释放后,对话框就消失了。解决方案非常简单。将CLLocationManager
实例从方法级变量更改为类级实例变量。现在,CLLocationManager
仅在卸载类后才释放实例。
我也遇到过类似的情况。调试后我发现
let locationManager = CLLocationManager()
在方法范围内被调用,但应全局调用。
为什么?
简而言之,该方法返回后已释放locationManager。但是在用户给予或拒绝许可之前,不应释放它
我知道这是一个很晚的答复。但这可能会帮助某人。我也遇到了同样的问题,花了一个小时来确定问题。起初我的代码是这样的。
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
CLLocation *location = locationManager.location;
//my stuff with the location
[locationManager release];
现在,位置警报迅速消失了。当我取消注释最后一行时,它可以正常工作。
// [locationManager release];
确保在文件中添加了隐私行(始终和whenInUse).plist
,并将CoreLocation
Framework 添加到项目中
更改后,位置权限对话框将正确显示:
locationManager.requestAlwaysAuthorization()
与:
locationManager.requestWhenInUseAuthorization()
PS。:我尝试了所有建议,但都失败了(请求授权到viewDidLoad
,var
而不是let
locationManager,请不要startUpdatingLocation()
在请求后启动。。我认为这是一个错误,希望他们尽快解决。
SWIFT 4 @Zoli解决方案如下所示:
class WhateverViewController: UIViewController {
let locationManager = CLLocationManager() // here is the point of the @Zoli answer
// some code
override func viewDidLoad() {
super.viewDidLoad()
// some other code
locationManager.requestWhenInUseAuthorization()
// some other code
}
}
您最多将locationManager变量定义为全局对象。
@interface ViewController : UIViewController
{
CLLocationManager *locationManager;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
}
我遇到了你的同样情况。
#进口 @interface ViewController() @结束 @implementation ViewController @synthesize locManager; //之后 -(void)viewDidLoad { [super viewDidLoad]; //加载视图后,通常从笔尖进行其他任何设置。 // MyLocationService * locManager = [[BSNLocationService alloc] init:nil]; //之前。地方。委托不起作用,因为使用此方法后实例变得无效。 self-> locManager = [[MyLocationService alloc] init:nil]; //之后 locManager.startService; }