没有调用Swift + didUpdateUserLocation

时间:2014-12-03 10:07:14

标签: ios swift mapkit xcode6.0.1 mkuserlocation

我无法拨打MKMapView委托方法didUpdateUserLocation

到目前为止我做了什么:

  1. 在项目中添加框架MapKit.framwork

  2. 通过import MapKit

  3. 在视图控制器中导入框架
  4. 在plist文件中添加密钥

    <key>NSLocationAlwaysUsageDescription</key> <true/>

  5. 视图控制器中的代码

  6. 添加了委托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键

    enter image description here

    也未提示权限提示。

6 个答案:

答案 0 :(得分:4)

  1. 您必须保留对CLLocationManager
  2. 的引用
  3. 您必须在locationManager(_:didChangeAuthorizationStatus:).startUpdatingLocation()之前等待showsUserLocation = true委托方法。
  4. 根据the documentNSLocationWhenInUseUsageDescription值类型为String。
  5. 尝试:

    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
        }
    
    }
    

答案 1 :(得分:2)

除了我想在此总结的其他答案:

您已将密钥NSLocationAlwaysUsageDescription放入info.plist。当系统提示用户请求位置服务权限时,该密钥的value必须是字符串,其中包含问题的文本。

根据密钥,您必须致电

申请许可
locationManager.requestWhenInUseAuthorization()

您可能已经回答了问题,因此您的答案可能已保存在用户首选项中。最好的方法是从模拟器中完全卸载应用程序并重新安装,以便再次询问。

答案 2 :(得分:1)

对于在iOS 8上运行的应用程序,您需要在plist文件中添加两个键:

  

NSLocationAlwaysUsageDescription(你已经有了这个)

     

NSLocationWhenInUseUsageDescription

此外,您还需要检查应用程序是否在iOS8下运行,如果是,请添加以下两行。如果是iOS 7或以下,则需要跳过这两行。如果您忘记这样做,应用程序将在较低版本上崩溃。

// You have this check
locationManager.requestWhenInUseAuthorization()
// Add this one
locationManager.requestAlwaysAuthorization()

答案 3 :(得分:0)

问题在于您要求何时使用授权

locationManager.requestWhenInUseAuthorization()

并在pList中添加<key>NSLocationAlwaysUsageDescription</key>,用于始终授权。您需要使用NSLocationWhenInUseUsageDescription密钥

答案 4 :(得分:0)

修好了!

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中的代码一般可以添加到控制器视图中。

答案 5 :(得分:0)

尝试上述所有答案后,如果“didUpdateUserLocation”委托未被调用,则选择模拟器,单击Debug from菜单栏选择Location,然后选择Apple。我尝试了上面的所有答案,但位置设置为自定义,所以我将其更改为Apple和委托方法调用。之后,我再次将其设置为自定义,现在显示位置。