iOS 9 [locationManager.requestWhenInUseAuthorization()]警报视图在出现后很快消失

问题描述:

我配置了一个非常基本的应用程序。它使用一个导航控制器,以及我已经配置为我的地图视图控制器的视图控制器。iOS 9 [locationManager.requestWhenInUseAuthorization()]警报视图在出现后很快消失

当应用程序启动时,它启动到根视图控制器,并从那里,我有一个按钮,配置为继续到地图视图控制器并显示地图。发生这种情况时,警报视图将显示,但在我可以选择允许/不允许之前,它会消失并加载地图。

为什么警报视图会自行消失?

我已经相应地配置了info.plist文件,添加了必要的框架并添加了相应的代表。

以下是我已经配置代码:

import UIKit 
import MapKit 
import CoreLocation 


class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { 

@IBOutlet weak var map: MKMapView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 

} 


func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    let userLocation = locations[0] 

    let latitude = userLocation.coordinate.latitude 
    let longitude = userLocation.coordinate.longitude 
    let latDelta: CLLocationDegrees = 0.01 
    let lonDelta: CLLocationDegrees = 0.01 
    let coordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude) 
    let span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta) 
    let region: MKCoordinateRegion = MKCoordinateRegionMake(coordinate, span) 
    map.setRegion(region, animated: true) 
} 

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
    print(error) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

任何帮助将不胜感激!提前致谢!

在viewDidLoad之外声明您的locationManager ivar。它在viewDidLoad完成后被释放,因为没有强引用它。您应该也只能在用户授予访问权限后才开始扫描。

var locationManager:CLLocationManager! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    let authorizationStatus = CLLocationManager.authorizationStatus() 
    if (authorizationStatus == CLAuthorizationStatus.NotDetermined) { 
     locationManager.requestWhenInUseAuthorization() 
    } else if (authorizationStatus == CLAuthorizationStatus.AuthorizedWhenInUse) { 
     locationManager.startUpdatingLocation() 
    } 
} 

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    if (status == CLAuthorizationStatus.AuthorizedWhenInUse) { 
    locationManager.startUpdatingLocation() 
    } 

}

+0

谢谢!这就是诀窍! –

+0

使用“var locationManager:CLLocationManager?”会更好吗? (带问号)或“var locationManager:CLLocationManager!” (带有感叹号)呢? –

+0

如果你想要一个locationManager被初始化。是的,你可能会这样做。 – Keller

因为你这样做是错误的。 CLLocationManagerDelegate协议有一个名为didChangeAuthorizationStatus的方法。您应该检查用户是否允许该应用使用位置。检查完毕后,您应该调用startUpdatingLocation。请务必在主队列上使用dispatch_async执行此代码所需的所有UI更新。