Я использую значительный мониторинг изменений местоположения. Когда я запускаю код в симуляторе и проверяю опцию Freeway, я получаю периодические обновления местоположения. Я беру эти обновления и сохраняю их в NSUserDefaults, а затем обновляю таблицу каждые 10 секунд, поэтому я вижу, есть ли у меня обновления. Если я запустил приложение на реальном устройстве, я получаю нулевые обновления. Я держал телефон в кармане и путешествовал более чем на 80 км, был в двух городах. Нулевые обновления. Не уверен, что я что-то испортил. Я прикрепляю код. Код - скопировать пачку, не стесняйтесь протестировать. Просто убедитесь, что TableViewController используется в раскадровке и задайте идентификатор ячейки ID. Что мне не хватает? Я проверяю на Iphone 5.Значительное изменение местоположения не срабатывает на устройстве
info.plist:
редактирования: Нашли это в яблоневых документы. Должен ли мой locationManager
быть создан по-разному?
Когда приложение возобновлено из-за обновлением местоположения, запуск вариантов СЛОВАРЯ передаются ваш применения: willFinishLaunchingWithOptions: или применения: didFinishLaunchingWithOptions: метод содержит ключ UIApplicationLaunchOptionsLocationKey. Наличие этого ключа сигнализирует, что новые данные о местоположении ждут доставки в ваше приложение. Чтобы получить эти данные, вы должны создать новый объект CLLocationManager и перезапустить службы определения местоположения, которые были у вас до завершения вашего приложения . При перезапуске этих служб диспетчер местоположений передает все ожидающие обновления местоположения своему делегату.
edit2:
Исходя из этого, место должно быть обновлено по крайней мере, каждые 15 минут. Ошибка в моем коде подтверждена.
Если точность GPS-уровень не является критичной для вашего приложения, и вам не нужно непрерывного слежения, вы можете использовать значащее изменение расположения службу. Крайне важно, чтобы вы правильно использовали услугу значительного изменения , потому что она пробуждает систему и ваше приложение как минимум каждые 15 минут, даже если никаких изменений местоположения не произошло, и он работает непрерывно, пока вы не остановите его.
edit3: добавлен этот код в AppDelegate didFinishLaunchingWithOptions:
, чтобы узнать, пробуждается ли приложение. Он не пробуждается - я не вижу 200 200 записей в виде таблицы. Что-то рыбное происходит.
if let options = launchOptions {
print("options")
if (launchOptions![UIApplicationLaunchOptionsLocationKey] != nil){
locationManager.startUpdatingLocation()
self.lat.append(Double(200))
self.lon.append(Double(200))
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}
КОД: // AppDelegate:
import UIKit
import CoreLocation
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {
var lat:[CLLocationDegrees]!
var lon:[CLLocationDegrees]!
var times:[String]!
var distances: [String]!
var window: UIWindow?
var locationManager: CLLocationManager!
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
locationManager=CLLocationManager()
locationManager.delegate=self
locationManager.requestAlwaysAuthorization()
let isFirstLaunch = NSUserDefaults.standardUserDefaults().objectForKey("lat")
if isFirstLaunch == nil{
lat = [CLLocationDegrees]()
lon = [CLLocationDegrees]()
times = [String]()
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}else{
lat = NSUserDefaults.standardUserDefaults().arrayForKey("lat") as! [CLLocationDegrees]
lon = NSUserDefaults.standardUserDefaults().arrayForKey("lon") as! [CLLocationDegrees]
times = NSUserDefaults.standardUserDefaults().objectForKey("time") as! [String]
// distances = NSUserDefaults.standardUserDefaults().objectForKey("distance") as! [String]
}
return true
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("location updated")
self.lat.append(locations[0].coordinate.latitude)
self.lon.append(locations[0].coordinate.longitude)
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
print("Location: \(locations[0].coordinate.latitude) \(locations[0].coordinate.longitude)")
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
print("did change AS")
switch status {
case .AuthorizedWhenInUse:
locationManager.startMonitoringSignificantLocationChanges()
case .AuthorizedAlways:
print("to always")
locationManager.startMonitoringSignificantLocationChanges()
if lat.count==0{
self.lat.append((locationManager.location?.coordinate.latitude)!)
self.lon.append((locationManager.location?.coordinate.longitude)!)
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}
// locationManager.startUpdatingLocation()
break
default:
locationManager.stopMonitoringSignificantLocationChanges()
break
}
}
}
// View Controller
import UIKit
class TableViewController: UITableViewController {
let appDel = UIApplication.sharedApplication().delegate as! AppDelegate
override func viewDidLoad() {
super.viewDidLoad()
NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "updateTableView", userInfo: nil, repeats: true)
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return appDel.lon.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("ID", forIndexPath: indexPath)
cell.textLabel?.text = "\(appDel.lat[indexPath.row]) \(appDel.lon[indexPath.row]) \(appDel.times[indexPath.row])"
cell.textLabel?.font = UIFont.systemFontOfSize(9)
return cell
}
func updateTableView(){
self.tableView.reloadData()
}
}
Вы действительно видите запрос на авторизацию? Если нет, у вас есть NSLocationAlwaysUsageDescription в вашем plist? –
Да, запрос выдается.И да, строка NSLocationAlwaysUsageDescription установлена в info.plist. – brumbrum
Вы убиваете приложение, дважды нажав кнопку «домой» и прокручивая приложение? Если вы убьете приложение таким образом, он не будет запускать службы значительного изменения фона. – Rob