• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 17:29:20 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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



Best Answer-推荐答案


您似乎已将您的 locationManager 设置为惰性 var,我假设它在此调用时被初始化: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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap