如果通过Button_Action swift调用LocationManager,为什么定位服务背景不起作用

时间:2019-02-13 03:11:25

标签: swift background-process locationmanager

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

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

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相同的工作位置。

我的英语说得不好,谢谢。

1 个答案:

答案 0 :(得分:0)

更新

我知道如果应用程序终止,为什么在viewDidload中不调用时为什么不起作用的过程

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

好。

第一

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

覆盖func viewDidLoad(){

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

}

如果您不致电此位置管理器(位置更新),则在终止应用程序时将无法正常工作。

通常,当终止应用程序时,我们必须移动到位置更改位置,然后在您的项目位置开始工作流程locationUpdate,或者如果您现在想知道可以在“隐私位置”中再次打开

enter image description here

第二

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

如果您问我为什么仅在ViewController上才能正常工作。

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

在图像中查找以下内容: enter image description here

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(具有位置管理器),然后杀死应用程序,然后再次打开位置服务。这是因为您曾经调用过位置管理器的use方法,但无法获得位置日志因为在RootView(第一个视图控制器)中没有关于viewDidload中位置更新的功能

结论

在定位服务后台过程中,它将仅在应用程序的第一个视图控制器中的ViewDidload,ViewWillAppear,ViewDidAppear进程中起作用

我是描述新手的新手,英语新手会说谢谢。