gpt4 book ai didi

ios - 如何从后台调用locationManager didUpdateToLocation?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:43 24 4
gpt4 key购买 nike

您好,即使应用程序在后台运行,我也想获取用户的位置,然后我想将该信息上传到数据库,当用户再次运行该应用程序时,它会向他显示他访问过的所有地点。所以我读了这篇文章 https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial并做了作者所说的一切在功能中我添加了后台模式位置更新,我还在 info.plist 应用程序不在后台运行设置为 NO 但我的应用程序仍然不在后台运行可能是什么问题?

import UIKit
import CoreLocation
import MapKit



class ViewController: UIViewController, CLLocationManagerDelegate {
var i = 0


@IBOutlet var map: MKMapView!
var backendless = Backendless.sharedInstance()
lazy var locationManager: CLLocationManager = {
let locationManager = CLLocationManager()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.distanceFilter = kCLDistanceFilterNone
return locationManager
}()

override func viewDidLoad() {
super.viewDidLoad()
locationManager.startUpdatingLocation()
getLocations()
self.map.showsUserLocation = true

// Do any additional setup after loading the view, typically from a nib.
}

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

//MARK: -LocationManagerDelegate
//func locationMana
func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
let loc = MKPointAnnotation()
loc.coordinate = newLocation.coordinate

savelocation(loc.coordinate.longitude, latitude: loc.coordinate.latitude)
//loc.coordinate.latitude
//map.showAnnotations(loc, animated: true)

}
func savelocation(longitude: Double, latitude: Double){
print("I work \(i)")
i++
let loc1 = locations()
loc1.latitude = String(latitude)
loc1.longitude = String(longitude)
// print(loc1.latitude)
// print(loc1.longitude)
let datastore = backendless.data.of(locations.ofClass())
var error: Fault?
let result = datastore.save(loc1, fault: &error) as? locations
if error == nil{
print("data was saved")
}else{
print("data was not saved")
}
}
func callAlert(message:String!){
let alertController=UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let OKButton=UIAlertAction(title: "OK", style: .Default, handler: nil)
alertController.addAction(OKButton)
self.presentViewController(alertController, animated: true, completion: nil)
}
func getLocations(){
var arr = [MKPointAnnotation]()
//var temp: MKPointAnnotation!
let dataStore = Backendless.sharedInstance().data.of(locations.ofClass())
var error: Fault?
let result = dataStore.findFault(&error)
if error == nil{
let locs = result.getCurrentPage()
// print(cities)
let locs1 = locs as! [locations]
if locs1.count - 1 >= 0{
for index in 0...locs1.count - 1{
let temp = MKPointAnnotation()
temp.coordinate.latitude = Double(locs1[index].latitude!)!
temp.coordinate.longitude = Double(locs1[index].longitude!)!
arr.append(temp)
}
self.map.addAnnotations(arr)
}
}else{
self.callAlert("There is an error retrieving data")
}

}


}

我还尝试更改 appdelegate applicationDidEnterBackground 方法,但我不知道如何手动调用该方法。有什么帮助吗?谢谢。 :) 附:我知道这是非法的,应用程序应该自己调用它,但我看不出有什么不同的做法

最佳答案

您似乎已将您的 locationManager 设置为惰性变量,我假设它在调用时已初始化:locationManager.startUpdatingLocation()。您应该实现此方法来开始更新:

func locationManager(manager: CLLocationManager, 
didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status:
case .AuthorizedAlways:
manager.startUpdatingLocation()
default:
break
}

注意:这至少会让您知道您已正确授权您的应用使用用户的位置。您仍然需要一些东西来使用您的 lazy var locationManager 属性来实例化它。我建议改用常规属性,并在 viewDidLoad 中设置您的 locationManager

关于ios - 如何从后台调用locationManager didUpdateToLocation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39435696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com