2015-05-07 28 views
19

मेरे पास एक व्यू कंट्रोलर है जो CLLocationManagerDelegate लागू करता है। मैं एक CLLocationManager चर बनाने:स्विफ्ट स्थान प्रबंधक ने किया थाChangeAuthorizationStatus हमेशा कॉल किया गया

// Set location manager properties 
locationManager.delegate = self 
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters 
locationManager.distanceFilter = 50 

समस्या आता समारोह कहा जाता हो जाता है कि यहां तक ​​कि इससे पहले कि मैं प्राधिकरण स्थिति की जांच:

let locationManager = CLLocationManager() 

फिर viewDidLoad में, मैं गुण सेट करें।

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    if (status == .AuthorizedWhenInUse) { 
     // User has granted autorization to location, get location 
     locationManager.startUpdatingLocation() 
    } 
} 

किसी को भी मुझे सूचित कर सकते हैं क्या यह घटित करने के लिए कारण हो सकता है?

उत्तर

39

- locationManager:didChangeAuthorizationStatus: को CLLocationManager प्रारंभ होने के तुरंत बाद बुलाया जाता है।

आप प्रतिनिधि विधि के अंदर प्राधिकरण का अनुरोध कर सकते हैं अगर आप चाहते हैं:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    switch status { 
    case .NotDetermined: 
     locationManager.requestAlwaysAuthorization() 
     break 
    case .AuthorizedWhenInUse: 
     locationManager.startUpdatingLocation() 
     break 
    case .AuthorizedAlways: 
     locationManager.startUpdatingLocation() 
     break 
    case .Restricted: 
     // restricted by e.g. parental controls. User can't enable Location Services 
     break 
    case .Denied: 
     // user denied your app access to Location Services, but can grant access from Settings.app 
     break 
    default: 
     break 
    } 
} 

जानते हैं कि आप एक 'समय पर' मामले में किसी प्रकार की जरूरत है अगर आप इस काम करना चाहते हो।

यदि आप किसी भी तरह से प्रतिनिधि असाइनमेंट में देरी करेंगे, उदा। इसे अतुल्यकालिक रूप से सेट करके, आप प्रारंभिक कॉल को - locationManager:didChangeAuthorizationStatus: पर याद कर सकते हैं।

+1

आपको बहुत बहुत धन्यवाद। मुझे एहसास नहीं हुआ कि इसे प्रारंभ करने के बाद बुलाया जाता है। –

+0

उत्तर के लिए धन्यवाद। इस जानकारी के साथ सेब दस्तावेज को अद्यतन करने की जरूरत है। –

+0

ऐसा लगता है कि आप सही हैं कि 'CHLocationManagerStatus' को 'CLLocationManager' प्रारंभ करने के तुरंत बाद बुलाया गया है, लेकिन यह कहां दस्तावेज है? – bobics

5

स्विफ्ट 3

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
     switch status { 
     case .notDetermined: 
      manager.requestAlwaysAuthorization() 
      break 
     case .authorizedWhenInUse: 
      manager.startUpdatingLocation() 
      break 
     case .authorizedAlways: 
      manager.startUpdatingLocation() 
      break 
     case .restricted: 
      // restricted by e.g. parental controls. User can't enable Location Services 
      break 
     case .denied: 
      // user denied your app access to Location Services, but can grant access from Settings.app 
      break 
     } 
    } 
+0

यह क्यों कहता है "अमान्य 'स्थान प्रबंधक' _ का पुनर्वितरण (_: didChangeAuthorization :) '"जब मैं उपरोक्त स्थान प्रबंधक (_: didChangeAuthorization :) विधि को स्विफ्ट 4 में लागू करने का प्रयास करता हूं। – madu

संबंधित मुद्दे