Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delegate must respond to locationManager:didUpdateLocations swift eroor

Hy guys, I'm making an app in swift 3.0 but I ran across a problem pretty soon. I set up necessary functions to ask for permission to use a location but every time I run the app I get the same error...

Viewcontroller.h

import UIKit
import MapKit

class ViewController: UIViewController {

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.requestLocation()
    }

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


}

extension ViewController : CLLocationManagerDelegate {
    private func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        if status == .authorizedWhenInUse {
            locationManager.requestLocation()
        }
    }

    private func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if locations.first != nil {
            print("location:: (location)")
        }
    }

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

Error:

2016-10-31 16:12:11.436192 Assemble[57741:2743477] bundleid: com.AssembleTm.Assemble, enable_level: 0, persist_level: 0, propagate_with_activity: 0
2016-10-31 16:12:11.437006 Assemble[57741:2743477] subsystem: com.apple.siri, category: Intents, enable_level: 1, persist_level: 1, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
2016-10-31 16:12:11.524494 Assemble[57741:2743668] subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-10-31 16:12:11.526709 Assemble[57741:2743668] subsystem: com.apple.UIKit, category: HIDEventIncoming, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-10-31 16:12:11.561488 Assemble[57741:2743658] subsystem: com.apple.BaseBoard, category: MachPort, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
2016-10-31 16:12:11.638717 Assemble[57741:2743477] subsystem: com.apple.UIKit, category: StatusBar, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-10-31 16:12:11.744 Assemble[57741:2743477] *** Assertion failure in -[CLLocationManager requestLocation], /BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreLocationFramework_Sim/CoreLocation-2100.0.12/Framework/CoreLocation/CLLocationManager.m:865
2016-10-31 16:12:11.855 Assemble[57741:2743477] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Delegate must respond to locationManager:didUpdateLocations:'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010a58d34b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010873b21e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010a591442 +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x0000000106799edd -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
    4   CoreLocation                        0x0000000106291523 CLClientGetCapabilities + 13233
    5   Assemble                            0x00000001061e1976 _TFC8Assemble14ViewController11viewDidLoadfT_T_ + 294
    6   Assemble                            0x00000001061e19e2 _TToFC8Assemble14ViewController11viewDidLoadfT_T_ + 34
    7   UIKit                               0x000000010708f06d -[UIViewController loadViewIfRequired] + 1258
    8   UIKit                               0x000000010708f4a0 -[UIViewController view] + 27
    9   UIKit                               0x0000000106f59045 -[UIWindow addRootViewControllerViewIfPossible] + 71
    10  UIKit                               0x0000000106f59796 -[UIWindow _setHidden:forced:] + 293
    11  UIKit                               0x0000000106f6d0a9 -[UIWindow makeKeyAndVisible] + 42
    12  UIKit                               0x0000000106ee6259 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4818
    13  UIKit                               0x0000000106eec3b9 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1731
    14  UIKit                               0x0000000106ee9539 -[UIApplication workspaceDidEndTransaction:] + 188
    15  FrontBoardServices                  0x000000010e1cf76b __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
    16  FrontBoardServices                  0x000000010e1cf5e4 -[FBSSerialQueue _performNext] + 189
    17  FrontBoardServices                  0x000000010e1cf96d -[FBSSerialQueue _performNextFromRunLoopSource] + 45
    18  CoreFoundation                      0x000000010a532311 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    19  CoreFoundation                      0x000000010a51759c __CFRunLoopDoSources0 + 556
    20  CoreFoundation                      0x000000010a516a86 __CFRunLoopRun + 918
    21  CoreFoundation                      0x000000010a516494 CFRunLoopRunSpecific + 420
    22  UIKit                               0x0000000106ee7db6 -[UIApplication _run] + 434
    23  UIKit                               0x0000000106eedf34 UIApplicationMain + 159
    24  Assemble                            0x00000001061e3fcf main + 111
    25  libdyld.dylib                       0x000000010af5b68d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

I'm new to swift 3.0 but I couldn't find anything on how to solve this (I alreaddy looked it up on stackoverflow but the answer they gave didn't help me...)

like image 210
Sam VG Avatar asked Oct 31 '16 15:10

Sam VG


3 Answers

Another possible cause of error is that you only have the method for

locationManager(_:didUpdateLocations:)

and you are missing the method for

locationManager(_:didFailWithError:)

According to the documentation of requestLocation():

When using this method, the associated delegate must implement the locationManager(:didUpdateLocations:) and locationManager(:didFailWithError:) methods. Failure to do so is a programmer error.

like image 50
Marques Avatar answered Sep 28 '22 06:09

Marques


You are using xcode8 and swift3 but your delegate methods are copied from swift 2.Change your delegate methods as below.

extension ViewController : CLLocationManagerDelegate {

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
         print("error:: \(error.localizedDescription)")
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status == .authorizedWhenInUse {
            locationManager.requestLocation()
        }
    }

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

        if locations.first != nil {
            print("location:: (location)")
        }

    }

}
like image 21
Anish Parajuli 웃 Avatar answered Sep 28 '22 07:09

Anish Parajuli 웃


import UIKit
import CoreLocation

class ViewController: UIViewController {
    
    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        
        super.viewDidLoad()

        locationManager.delegate = self        
        locationManager.requestWhenInUseAuthorization()
        locationManager.requestLocation()
    }
}

extension ViewController : CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first {
            print("Location data received.")
            print(location)
        }
    }
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Failed to get users location.")
    }
}

The delegate needs to be assigned before calling the requestLocation() function because after the requestLocation() is completed it will trigger didUpdateLocations, but to call didUpdateLocations it should know which object didUpdateLocations is being called. To clarify that to the compiler
locationManager.delegate = self is used to before the locationManager.requestLocation() call is made.

In the extension of CLLocationManagerDelegate protocol implement didUpdateLocations and didFailWithError.

like image 37
Teja Goud Kandula Avatar answered Sep 28 '22 06:09

Teja Goud Kandula