Swift + didUpdateUserLocation没有被调用
我无法调用MKMapView
委托方法didUpdateUserLocation
。
我到目前为止做了什么:
-
在项目中添加框架
MapKit.framwork
-
通过
import MapKit
行import MapKit
视图控制器中的框架 -
添encryption钥在plist文件中
<key>NSLocationAlwaysUsageDescription</key> <true/>
-
代码在视图控制器
增加了委托didUpdateUserLocation
方法来检查位置是否更新,但从来没有调用。
// MARK: - MapView delegate methods func mapView(mapView: MKMapView!, regionDidChangeAnimated animated: Bool) { // Calling... } func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) { // Not getting called } // MARK: - View lifeCycle methods override func viewDidLoad() { super.viewDidLoad() var locationManager = CLLocationManager() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() self.mapView.delegate = self self.mapView.showsUserLocation = true self.mapView.pitchEnabled = true self.mapView.showsBuildings = true }
我已经使用模拟器和更改模拟器自定义位置来检查是否被调用? 方法regionDidChangeAnimated
被称为完美!
同样的事情适用于iOS7。 Swift地图位置更新还有什么额外的努力?
编辑: Plist键
还没有提示权限提醒。
- 你必须保持对
CLLocationManager
的引用。 - 您必须等待
locationManager(_:didChangeAuthorizationStatus:)
调用的委托方法,之后.startUpdatingLocation()
和showsUserLocation = true
。 - 根据文件 :
NSLocationWhenInUseUsageDescription
值types是String。
尝试:
class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { @IBOutlet weak var mapView: MKMapView! var locationManager = CLLocationManager() // MARK: - View lifeCycle methods override func viewDidLoad() { super.viewDidLoad() self.locationManager.delegate = self self.locationManager.desiredAccuracy = kCLLocationAccuracyBest self.locationManager.requestWhenInUseAuthorization() self.mapView.delegate = self self.mapView.pitchEnabled = true self.mapView.showsBuildings = true } // MARK: - LocationManager delegate methods func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { switch status { case .Authorized, .AuthorizedWhenInUse: manager.startUpdatingLocation() self.mapView.showsUserLocation = true default: break } } // MARK: - MapView delegate methods func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) { println(userLocation) // Not getting called } }
除了我想在这里总结的其他答案:
你已经把NSLocationAlwaysUsageDescription
的关键字NSLocationAlwaysUsageDescription
你的info.plist
。 当系统提示用户请求位置服务权限时,该键的value
必须是包含问题文本的string 。
根据密钥,您必须通过调用请求许可
locationManager.requestWhenInUseAuthorization()
你可能已经回答了这个问题,所以你的答案可能已经保存在用户的喜好中。 最好的方法是从模拟器中彻底卸载应用程序并重新安装,以便再次询问。
对于在iOS 8上运行的应用程序,您需要在plist文件中添加两个键:
NSLocationAlwaysUsageDescription(你已经有这个)
NSLocationWhenInUseUsageDescription
此外,你将需要包装检查如果应用程序在iOS8下运行,如果是这样添加下两行。 如果是iOS 7或以下,则需要跳过这两行。 如果您忘记这样做,应用程序将崩溃在较低的版本。
// You have this check locationManager.requestWhenInUseAuthorization() // Add this one locationManager.requestAlwaysAuthorization()
问题是你在使用授权时要求的
locationManager.requestWhenInUseAuthorization()
并在pList中添加始终授权的<key>NSLocationAlwaysUsageDescription</key>
。 您需要使用NSLocationWhenInUseUsageDescription
键
修复!
在ios8之后,MKMapView并没有自动加载LocationCoordinate,如果我们想用MKMapView来加载更精确的位置,使用“-mapView:didUpdateUserLocation”:
前提: 1.设置mapView委托。 2.setShowsUserLocation:YES 3.mapView必须在一个容器(addSubview:mapView)!!!!!
例:
self.mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)]; _mapView.delegate = self; [_mapView setShowsUserLocation:YES]; [[UIApplication sharedApplication].keyWindow addSubview:_mapView];
我将MapView添加到Window,因为UtilSingleton中的代码可以添加到您的控制器视图中。
尝试所有以上答案后,如果“didUpdateUserLocation”委托没有被调用,然后select模拟器点击debugging从菜单栏select位置,然后select苹果。 我试过所有的答案,但位置被设置为自定义,所以我把它改为苹果和调用委托方法。 之后,我再次将其设置为自定义,现在显示位置。