【问题标题】:How to call locationManager didUpdateToLocation from the background?如何从后台调用 locationManager didUpdateToLocation?
【发布时间】:2017-01-19 00:40:57
【问题描述】:

您好,即使应用程序在后台,我也想获取用户的位置,然后我想将该信息上传到数据库,当用户再次运行应用程序时,它会向他显示他访问过的所有地方。所以我阅读了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 方法,但我不知道如何手动调用该方法。有什么帮助吗?谢谢。 :)我知道这是非法的,应用程序应该自己调用它,但我看不出有什么不同的方法

【问题讨论】:

  • 我有一个类似的应用程序运行良好。您的代码看起来不错 - 您的 info.plist 中是否有“隐私 - 位置始终使用说明”(NSLocationAlwaysUsageDescription)?
  • 是的,我有这个

标签: ios swift cllocationmanager


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多