ios - 无法在后台使用应用程序保持 GPS 事件,或在前台或后台使用应用程序读取位置

标签 ios swift swift3 cllocationmanager

与此问题相关的应用旨在以高精度跟踪用户位置,包括 GPS 坐标和加速度计读数,持续 30 分钟,即使用户按下了 sleep 按钮也是如此。

为此,plist 文件和应用程序功能设置已更改,以反射(reflect)始终打开导航访问的原因,并启用后台进程以提供基于位置的服务。

该应用程序在运行时会询问用户 GPS 权限,如果他们被授予,则此 View Controller (包含以下代码的 View Controller )的激活会导致 GPS/导航图标显示在iPhone。

问题是,到目前为止,下面看到的四个“print”命令都没有产生任何打印消息,因此“newLocation”和“myLocation”变量都没有产生任何数据。如果此代码与第一句中概述的目的相去甚远,那么问题就是“如何修复它?”。如果这是实现目标的糟糕方法,那么更好的答案将解释应该如何完成。

import UIKit
import CoreMotion
import MapKit
import CoreLocation

class ActiveSession: UIViewController, CLLocationManagerDelegate {
        lazy var locationManager: CLLocationManager! = {
        let manager = CLLocationManager()
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.delegate = self
        return manager
    }()

    func locationManager(_manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
        let myLocation:CLLocationCoordinate2D=CLLocationCoordinate2DMake(oldLocation.coordinate.latitude, oldLocation.coordinate.longitude)
        print(myLocation)

        if UIApplication.shared.applicationState == .active {
            print("at least it's active at all")
        } else {
            print(newLocation)
            print("it's active when the app isn't")
        }
    }

     func getPermission () {
        locationManager = CLLocationManager()

        switch CLLocationManager.authorizationStatus() {
        case .denied, .restricted:
            return
        case .notDetermined:
            locationManager!.requestAlwaysAuthorization()
            break
        case .authorizedAlways, .authorizedWhenInUse:
            break
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.getPermission()
        locationManager = CLLocationManager()
        locationManager!.desiredAccuracy = kCLLocationAccuracyBest
        locationManager?.startUpdatingLocation()
    }
}

最佳答案

您在三个地方创建新的 CLLocationManager 实例——惰性 locationManager 初始化器、getPermissionviewDidLoad——以及后两个其中,您既没有设置所需的准确性也没有设置代表。删除 locationManager = CLLocationManager() 行,您应该会得到更好的结果。

关于ios - 无法在后台使用应用程序保持 GPS 事件,或在前台或后台使用应用程序读取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096622/

相关文章:

iphone - 找不到名为 'MainStoryboard_iPad' 的 Storyboard

ios - 如何让导航按钮位于导航栏的左上角

ios - Swift - 在类中定义属性

ios - 如何动态更改 UILabel 的宽度?

swift - 如何使用 Swift 在 XCode UI Automation 中选择随机 tableview 单元格

ios - 如何在 UIAlertController 中设置 UITextField 的高度?

ios - Xcode 在打开 Storyboard 时崩溃

objective-c - 查找枚举的未使用情况 (Objective-C/Swift)

ios - DateFormatter 不返回 "HH:mm:ss"的日期

ios - swift 3 : UITabBarController change tab on unwind