我有一个在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:
以下是电话授权:
小位置箭头始终存在但未记录位置更新。
答案 0 :(得分:0)
我检查了你的代码,似乎没问题,如果你已经完成了这些必要的设置,请进行修改
NSLocationAlwaysUsageDescription
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