【问题标题】:Why location service background not working if call LocationManager by Button_Action swift如果通过 Button_Action swift 调用 LocationManager,为什么位置服务背景不起作用
【发布时间】:2019-02-13 03:11:25
【问题描述】:

我对位置的后台服务有疑问,如果我们在 viewDidload 中调用位置管理器,我们可以在应用程序终止时管理调用位置,因为我们知道通过推送通知消息运行的位置

我已设置 info.plist done ,导入所有我认为已完成的使用位置和通知中心。

override func viewDidLoad() {
    super.viewDidLoad()
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.startUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     if(!gpsEnable) {
         print("update disable")
         return
     }
     print("update enable")
     for location in locations {
         processLocation(location)
     }
 }  

但是如果通过 Button 调用它在应用程序终止时不起作用

@IBAction func location(_ sender: Any) {
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.startUpdatingLocation()
}

我希望知道工作的原因不能称为与 ViewDidload 工作相同的位置。

我的英语不太好,谢谢。

【问题讨论】:

    标签: swift background-process locationmanager


    【解决方案1】:

    更新

    如果应用程序将终止,我知道进程为什么不调用 viewDidload 时不工作

    如果您曾经做过关于在应用程序终止时保留位置数据日志的项目,那么当您移动直到您更改当前位置并调用 LocationUpdate 或 CLVisit 或 CLLocationChange 的方法以及另一个您知道在您的项目。

    好的。

    首先

    你应该在项目的某个地方的视图控制器中调用它:

    覆盖 func viewDidLoad() {

    super.viewDidLoad()
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.startUpdatingLocation()
    

    }

    如果你不调用这个位置管理器(位置更新),当你杀死应用程序时它将不起作用。

    通常当杀死应用程序时,我们必须移动位置更改位置,然后在您的项目位置开始工作过程位置更新,或者如果您现在想知道,您可以在隐私位置再次打开

    第二

    如果必须在第一个 ViewController 中调用 ViewDidLoad 中的函数时应用将终止,则条件位置更新。

    如果你问我为什么它只对 ViewController 起作用。

    我会回答“我不知道,但我们会在我的应用程序测试中测试进程,直到知道进程在 ViewDidLoad、ViewWillAppear、ViewDidAppear 的第一个 ViewController 中专门运行”。

    看图片:

    RootView ,SecondView

    我们通过查看根视图来测试流程,是的,这是我在视图中调用位置管理器时的第一个视图

    覆盖 func viewDidLoad() {

        super.viewDidLoad()
        
         locationManager.allowsBackgroundLocationUpdates = true
           locationManager.delegate = self
         locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
       locationManager.startUpdatingLocation()
       NotificationStatic.shared.showNotification(title:"viewDidload01",body:"did load",identifierRequest : "view1")
    

    }

    当进程进入时 viewDidload 进程将可以在应用程序终止时在位置更新中运行进程

    但是您在 SecondView 中调用位置管理器,但在 RootView 中不调用位置,它会起作用!!

    如果你曾经在 SecondView 中执行过 SecondView -> 运行 ViewDidload(有位置管理器)然后杀死应用程序然后再次打开位置服务。它的工作是因为你曾经调用位置管理器的使用方法,但它无法获取位置日志因为在 RootView(第一个视图控制器)中没有关于 viewDidload 中位置更新的功能

    结束

    在定位服务后台进程中,它只在app的第一个视图控制器的ViewDidload、ViewWillAppear、ViewDidAppear进程中起作用

    我是描述和新手说英语的新手技能谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2011-08-27
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多