2014-06-05 17 views
25

Tôi đã cố gắng để có được điều này để làm việc cho một lúc bây giờ, và tôi đã đến đây để hỏi-làm thế nào để tôi đi về với bằng cách sử dụng các phương pháp CLLocationManagerDelegate trong Swift? Tôi đã đặt này ở phía trên cùng của lớp học của tôi:Thực hiện CLLocationManagerDelegate methods trong Swift

var locationManager = CLLocationManager() 

Tôi đã đặt đoạn mã sau vào viewDidLoad phương pháp của tôi:

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

Và tôi đã cố gắng sử dụng những phương pháp đại biểu với vô ích:

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

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

Tôi cũng đã thử sử dụng @optional ở phía trước các hàm, nhưng Xcode sau đó sẽ ném lỗi trình biên dịch. Bất kỳ ý tưởng?

+0

Dường như nó hoạt động với mã của tôi, bạn có nhận được hộp thoại hỏi liệu ứng dụng của bạn có thể sử dụng vị trí của bạn không? – voidref

+0

@voidref Bây giờ bạn đề cập đến nó, tôi không nhận được hộp thoại. Đó là một chút kỳ lạ ... Tôi chỉ cần kiểm tra cài đặt và ứng dụng cũng được cấp quyền truy cập vị trí. –

Trả lời

57

Bạn cần phải thêm NSLocationAlwaysUsageDescription hoặc NSLocationWhenInUseUsageDescription chìa khóa để plist của bạn nếu bạn chưa sẵn sàng, bây giờ họ là bắt buộc,


iOS8 + yêu cầu một trong hai chuỗi này để được thiết lập để sử dụng các địa điểm. Mà một trong những bạn sử dụng phụ thuộc vào cách bạn có ý định yêu cầu vị trí.

  • Sử dụng NSLocationAlwaysUsageDescription cho các ứng dụng muốn sử dụng vị trí của thiết bị ngay cả khi ứng dụng không mở và đang được sử dụng.

  • Sử dụng NSLocationWhenInUseUsageDescription cho các ứng dụng chỉ muốn sử dụng vị trí của thiết bị khi ứng dụng đang mở và đang sử dụng.

Lưu ý: Khi bạn thêm các dây, trước khi bạn xây dựng và chạy, xóa ứng dụng khỏi thiết bị của bạn và để cho nó làm một tươi cài đặt. Dường như nếu ứng dụng được ủy quyền sử dụng vị trí trước khi bạn nâng cấp lên iOS8, ứng dụng sẽ không yêu cầu lại quyền của bạn và không thấy rằng bạn đã đặt các chuỗi đó. Thực hiện xóa và cài đặt sạch sẽ giải quyết vấn đề này.

Thiết một trong các chuỗi nhắc nhở một cửa sổ pop up trên cài đặt/sử dụng đầu tiên dọc theo dòng: "Cho phép 'ThisApp' để truy cập vị trí của bạn ngay cả khi bạn không sử dụng các ứng dụng"

Dưới đây là một Ảnh chụp màn hình của tệp plist.

enter image description here

+0

[Ý bạn là như thế này] (http://imgur.com/5CA1tKK)? Điều đó đã không làm cho hộp thoại xuất hiện. –

+1

Không, rõ ràng iOS8 yêu cầu phải đặt một trong hai chuỗi khác (xem bản chỉnh sửa của tôi). Mà một trong những bạn sử dụng được cho là dựa trên cách bạn có ý định yêu cầu vị trí từ những gì tôi hiểu nhưng tôi couldnt tìm thấy bất kỳ thông tin cụ thể hơn. Trong sự quan tâm của việc tiết lộ đầy đủ, tôi vẫn không nhận được công việc của tôi ngay cả sau khi thêm các chuỗi như được hiển thị (vấn đề của tôi có vẻ là ở nơi khác Tôi đang cố gắng để có được tôi chạy mà không cần nhanh chóng tại thời điểm này), tôi chỉ muốn đề cập đến các chuỗi kể từ bây giờ cần thiết. – DelightedD0D

+0

cũng có, khi bạn thêm các chuỗi, trước khi bạn xây dựng và chạy, hãy xóa ứng dụng khỏi thiết bị của bạn và để ứng dụng đó thực hiện cài đặt mới. Dường như nếu ứng dụng được ủy quyền sử dụng vị trí trước khi bạn nâng cấp lên iOS8, ứng dụng sẽ không yêu cầu quyền của bạn nữa và không thấy rằng bạn đã đặt các chuỗi đó. Làm một cài đặt xóa và sạch sẽ giải quyết nó cho tôi, cuối cùng làm việc một lần nữa! – DelightedD0D

3

Tôi gặp vấn đề tương tự. didUpdateLocations - không hoạt động. Chạy ứng dụng của bạn. Chuyển đến trang Cài đặt -> Bảo mật -> Vị trí và tắt Dịch vụ vị trí. didFailWithError sẽ gặp lỗi về Dịch vụ vị trí vắng mặt. Sau đó bật nó lên. Kể từ thời điểm đó didUpdateLocations sẽ bắt địa điểm.

+0

Điều này dường như hoạt động một lần, nhưng khi tôi khởi chạy lại ứng dụng từ Xcode thì tôi quay trở lại để không nhận được bất kỳ cập nhật vị trí nào. – FiddleMeRagged

+1

Vâng, tôi biết. Nhưng tôi đoán đó là vấn đề với XCode 6. Cho phép chờ beta 2 :) – salty

5

Đầu tiên thêm hai dòng này trong file plist

1) NSLocationWhenInUseUsageDescription

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

Để có được tài vị trí bây giờ: -

Bước 1:let locationManager = CLLocationManager() // make object of CLLocationManager class.

Bước 2:In viewDidLoad instantiate the CLLocationManager class like,

// Để sử dụng trong nền

self.locationManager.requestAlwaysAuthorization() 

// For use in foreground 

self.locationManager.requestWhenInUseAuthorization() 

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

Bước 3: Bây giờ thực hiện các phương pháp đại biểu của CLLocationManager

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

    var locValue:CLLocationCoordinate2D = manager.location.coordinate 

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

    } 

Bước 4: Đừng quên thêm NSLocationAlwaysUsageDescription trong Info.plist như trong iOS 8, bắt buộc phải thêm điều này. Điều này sẽ yêu cầu quyền sử dụng vị trí của người dùng.

0

Đây là một chút của một chuỗi cũ, nhưng không có điều nào ở trên hoạt động đối với tôi trên Swift 2.2 xCode 7.3.1.

Vấn đề là tôi đã sử dụng:

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

Và điều này không bao giờ được gọi tới. Khi tôi đổi thành:

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

Tất cả đều được tính toán. Có vẻ như đại biểu không được gọi khi sử dụng [AnyObject]

Các vấn đề liên quan