我的iOS应用程序不会更新后台

时间:2017-01-04 09:37:24

标签: ios swift swift3 cllocationmanager

我有一个在Swift中开发的iOS应用程序。我的应用程序目前在Swift 2中,但我使用Xcode 8和Swift 3.该应用程序配置为使用旧版swift语言版本。

直到最近,该应用才能正常运行。

该应用程序要求始终使用该位置的正确权限,并且始终将autorisation设置为正确。

我更新了生产应用的签名身份,停止了应用程序通知位置更新,但仍在开发模式下工作(从xcode启动)。

现在我撤销并续订了生产和开发证书,应用程序在后台不更新位置,而自动化设置为始终。

该应用已正确安装,所以我猜证书可以,但我不明白为什么该位置没有在后台更新。

我在带有IOS 10.2的iPhone 7上运行该应用程序,xcode自动管理签名。

这是我的位置管理器配置:

public class LocationManager : NSObject, ModuleManager, CLLocationManagerDelegate {

    /// The core location manager
    let coreLocationManager: CLLocationManager

    public var datas: JSONable? {
        get {
            return LocationDatas(locations: self.locations)
        }

        set {
            self.locations = newValue == nil ? [Location]() : newValue as? [Location]
        }
    }

    /// The list of locations to send
    private var locations: [Location]?

    /// The last location
    public var lastLocation: Location? {
        return self.locations?.last
    }

    public override init() {

        self.coreLocationManager = CLLocationManager()
        if #available(iOS 9.0, *) {
            self.coreLocationManager.allowsBackgroundLocationUpdates = true
        }
        // The accuracy of the location data.
        self.coreLocationManager.desiredAccuracy = kCLLocationAccuracyBest;
        // The minimum distance (measured in meters) a device must move horizontally before an update event is generated.
        self.coreLocationManager.distanceFilter = 500; // meters
        self.locations = [Location]()

        super.init()
        self.coreLocationManager.delegate = self
        self.locationManager(self.coreLocationManager, didChangeAuthorizationStatus: CLLocationManager.authorizationStatus())

    }

    // MARK: - CLLocationManager Delegate

    public func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        NSLog("location update")
        guard locations.count > 0 else {
            NSLog("Module Location -- no location available")
            return
        }

        // Add all location waiting in the list to send
        self.locations?.appendContentsOf(locations.map { Location(cllocation: $0) })
        SDKManager.manager?.sendHeartbeat()
    }

    public func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        switch CLLocationManager.authorizationStatus() {
            case .NotDetermined:
                if #available(iOS 8.0, *) {
                    self.coreLocationManager.requestAlwaysAuthorization()
                } else {
                    self.coreLocationManager.startUpdatingLocation()
                }

            case .Denied, .Restricted:
                NSLog("Module Location -- access denied to use the location")

            case .AuthorizedAlways:
                NSLog("AuthorizedAlways")
                self.coreLocationManager.startUpdatingLocation()
                //self.coreLocationManager.startMonitoringSignificantLocationChanges()

            default:
                break
        }
    }

    public func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        NSLog("Module Location -- error : \(error)")
    }
}

不在后台调用locationManager函数。

这是我的info.plist:

enter image description here

以下是电话授权:

enter image description here

小位置箭头始终存在但未记录位置更新。

2 个答案:

答案 0 :(得分:0)

我检查了你的代码,似乎没问题,如果你已经完成了这些必要的设置,请进行修改

  1. 在后台模式下启用位置更新
  2. NSLocationAlwaysUsageDescription
  3. 中添加info.plist

    如果你没有做第一点你的应用程序会崩溃,但如果没有做第二点,你的代码将会通过,但你永远不会得到更新。

    <强>更新

    您的LocationManager对象似乎已在ARC中发布。您是否可以尝试通过添加

    LocationManager课程更改为Singleton
    static let sharedInstance = LocationManager()
    

    在您的代码中访问LocationManager,就像这样

    LocationManager.sharedInstance
    

答案 1 :(得分:0)

您无需仅使用App Background Refresh即可在Background中进行位置更新。 (它可用于充电时的其他维护工作,例如数据库清理,上传,下载等)

在初始化 coreLocationManager 的同时,还要设置以下属性

// It will allow app running location updates in background state
coreLocationManager.allowsBackgroundLocationUpdates = true 

// It will not pause location automatically, you can set it true if you require it. 
coreLocationManager.pausesLocationUpdatesAutomatically = false