2014-06-05 2 views
25

나는 이것을 잠시 동안 작동 시키려고 노력해 왔으며, 여기에 와서 Swift에서 CLLocationManagerDelegate 메소드를 어떻게 사용 하는가? 내 viewDidLoad 방법에 다음을 넣어했습니다Swift에서 CLLocationManagerDelegate 메소드 구현하기

var locationManager = CLLocationManager() 

: 나는 내 클래스의 상단에이를 넣었습니다

locationManager.delegate = self 
locationManager.distanceFilter = kCLDistanceFilterNone 
locationManager.desiredAccuracy = kCLLocationAccuracyBest 
locationManager.startUpdatingLocation() 

그리고 아무 소용이 이러한 위임 방법을 사용하여 시도했다 :

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) { 
    locationReceived = true 
} 

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
    locationReceived = false 
} 

는 또한 기능의 앞에 @optional 사용하여 시도했지만, 엑스 코드는 컴파일러 오류가 발생합니다. 어떤 아이디어?

+0

코드에 맞는 것처럼 보입니다. 앱에서 위치를 사용할 수 있는지 묻는 대화 상자가 나타 납니까? – voidref

+0

@voidref 이제 대화에 대해 언급하지 않겠습니다. 그건 좀 이상합니다 ... 난 그냥 설정을 확인하고 응용 프로그램은 위치 액세스에 대한 권한이 부여됩니다. –

답변

57

당신은 iOS8의 +는이 두 문자열 중 하나가 필요합니다


이 위치를 사용하도록 설정해야합니다, 그들은 이제 필수, 아직받지 못한 경우 PLIST에 NSLocationAlwaysUsageDescription 또는 NSLocationWhenInUseUsageDescription 키를 추가해야합니다. 당신이 사용하는 것은 당신이 어떻게 위치를 묻는 지에 달려있다. 응용 프로그램이 열려 있지 및 사용되는 경우에도 장치의 위치를 ​​사용하려면 애플 리케이션을위한

  • 사용 NSLocationAlwaysUsageDescription.

  • 앱이 열려 있고 사용 중일 때만 기기의 위치를 ​​사용하려는 앱에는 NSLocationWhenInUseUsageDescription을 사용하십시오.

참고 : 구축 및 실행 장치를 응용 프로그램을 삭제하고 새로 설치하자 전에하면, 문자열을 추가 할 때. 앱이 iOS8로 업그레이드하기 전에 위치를 사용하도록 승인 된 경우 사용자의 허락을 다시 요청하지 않으며 사용자가 해당 문자열을 설정 한 것을 볼 수 없습니다. 삭제 및 새로 설치를 수행하면이 문제가 해결됩니다. 문자열 중 하나가 팝업가에의 라인을 따라/처음 사용할 때 설치하라는 메시지가 설정

: 여기

"당신이 응용 프로그램을 사용하지 않는 경우에도 사용자의 위치에 액세스 할"ThisApp을 "허용"는 스크린 샷입니다 pl101 파일 중 하나입니다.

enter image description here

+0

[이 뜻입니까?] (http://imgur.com/5CA1tKK)? 대화 상자가 나타나지 않았습니다. –

+1

아니요, 분명히 iOS8은 다른 두 문자열 중 하나를 설정해야합니다 (내 편집 참조). 당신이 사용하는 것은 당신이 내가 이해하는 것으로부터 위치를 요청할 의도를 기반으로하지만, 더 구체적인 정보를 찾을 수 없습니다. 전체 공개의 이익을 위해 나는 아직도 나와 같이 문자열을 추가 한 후에도 내 작업을 얻지 못한다. (내 문제는 다른 곳에있는 것처럼 보인다. 순간적으로 신속히 실행되지 않는다.) 지금부터 문자열을 언급하고 싶었다. 필수. – DelightedD0D

+0

또한 문자열을 추가 할 때 빌드하고 실행하기 전에 장치에서 응용 프로그램을 삭제하고 새로 설치하도록하십시오. 앱이 iOS8로 업그레이드하기 전에 위치를 사용하도록 승인 된 경우 사용자의 허락을 다시 요구하지 않으며 해당 문자열을 설정하지 않는 것으로 보입니다. 삭제 및 클린 인스톨을하면 나에게 그것을 해결하고 마침내 다시 작업하게됩니다! – DelightedD0D

3

나는 동일한 문제가있었습니다. didUpdateLocations - 작동하지 않았습니다. 앱을 실행하십시오. 설정 페이지 -> 개인 정보 -> 위치로 이동하여 위치 서비스를 사용 중지합니다. didFailWithError는 부재중인 위치 서비스에 대한 오류를 포착합니다. 그 다음에 켭니다. 그 순간 이후로 UUpdateLocations가 위치를 파악합니다.

+0

이 한 번 작동하는 것 같다,하지만 난 엑스 코드에서 응용 프로그램을 다시 시작 할 때 나는 어떤 위치 업데이트를받지 못하고 돌아갑니다. – FiddleMeRagged

+1

예, 알고 있습니다. 하지만 Xcode 6 문제입니다. 베타 2 기다려주십시오 :) – salty

5

먼저 사용자의 현재 위치를 얻으려면

1) NSLocationWhenInUseUsageDescription에게 PLIST 파일에

2) NSLocationAlwaysUsageDescription

import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate 

var seenError : Bool = false 
var locationFixAchieved : Bool = false 
var locationStatus : NSString = "Not Started" 

var locationManager: CLLocationManager! 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

    func initLocationManager() { 
    seenError = false 
    locationFixAchieved = false 
    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.locationServicesEnabled 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestAlwaysAuthorization() 
} 

    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
    locationManager.stopUpdatingLocation() 
    if (error) { 
     if (seenError == false) { 
      seenError = true 
      print(error) 
     } 
    } 
} 

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) { 
    if (locationFixAchieved == false) { 
     locationFixAchieved = true 
     var locationArray = locations as NSArray 
     var locationObj = locationArray.lastObject as CLLocation 
     var coord = locationObj.coordinate 

     println(coord.latitude) 
     println(coord.longitude) 
    } 
} 

func locationManager(manager: CLLocationManager!, 
    didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
     var shouldIAllow = false 

     switch status { 
     case CLAuthorizationStatus.Restricted: 
      locationStatus = "Restricted Access to location" 
     case CLAuthorizationStatus.Denied: 
      locationStatus = "User denied access to location" 
     case CLAuthorizationStatus.NotDetermined: 
      locationStatus = "Status not determined" 
     default: 
      locationStatus = "Allowed to location Access" 
      shouldIAllow = true 
     } 
     NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil) 
     if (shouldIAllow == true) { 
      NSLog("Location to Allowed") 
      // Start location services 
      locationManager.startUpdatingLocation() 
     } else { 
      NSLog("Denied access: \(locationStatus)") 
     } 
} 
4

을이 두 줄을 추가 : -

1 단계 :let locationManager = CLLocationManager() // make object of CLLocationManager class.

2 단계 :In viewDidLoad instantiate the CLLocationManager class like,

// 배경에서 사용하기 위해

self.locationManager.requestAlwaysAuthorization() 

// For use in foreground 

self.locationManager.requestWhenInUseAuthorization() 

if (CLLocationManager.locationServicesEnabled()) 
{ 
locationManager.delegate = self 
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 
locationManager.startUpdatingLocation() 
} 

3 단계 : 지금 CLLocationManager

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

    var locValue:CLLocationCoordinate2D = manager.location.coordinate 

    println("locations = \(locValue.latitude) \(locValue.longitude)") 

    } 

4 단계의 대리자 메서드를 구현 : 를 추가하는 것을 잊지 마세요. InfoView에서 iOS 8처럼을 추가해야합니다. 그러면 사용자의 위치 사용 권한이 요청됩니다.

0

이것은 낡은 스레드의 비트이지만 아직 위의 어느 것도 Swift 2.2 xCode 7.3.1에서 작동하지 않았습니다.

func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) { 
    print("Got location") 
    locationManager.stopUpdatingLocation() 
} 

을 그리고 이것은 호출되지있어 결코 :

문제는 내가 사용하던됩니다. 내가 다음과 같이 바꿨을 때 :

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    print("Got location") 
    locationManager.stopUpdatingLocation() 
} 

다 잘되었다. [AnyObject]를 사용할 때 델리게이트가 호출되지 않은 것 같습니다.

관련 문제