更新到iOS 9.3.1及更高版本后,基于位置的iphone应用程序在后台不工作
我创建了一个应用程序,它可以跟踪用户的位置,即使该应用程序位于后台或屏幕被锁定。我已经在iOS 9.2的iPhone5S设备上测试过了,一切正常。更新到iOS 9.3.1后,我注意到该应用程序将在后台运行约10分钟,然后应用程序将自动停止。昨天我将手机升级到iOS 9.3.2,希望能解决这个问题。然而,这个问题仍然存在 我在AppDelegate类中有以下代码更新到iOS 9.3.1及更高版本后,基于位置的iphone应用程序在后台不工作,ios,iphone,swift,Ios,Iphone,Swift,我创建了一个应用程序,它可以跟踪用户的位置,即使该应用程序位于后台或屏幕被锁定。我已经在iOS 9.2的iPhone5S设备上测试过了,一切正常。更新到iOS 9.3.1后,我注意到该应用程序将在后台运行约10分钟,然后应用程序将自动停止。昨天我将手机升级到iOS 9.3.2,希望能解决这个问题。然而,这个问题仍然存在 我在AppDelegate类中有以下代码 @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDele
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
private static var backgroundService : BackgroundService? = nil
var startServices : Bool = false
public static var bgTask = UIBackgroundTaskIdentifier()
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
print("didFinishLaunchingWithOptions")
AppDelegate.bgTask = beginBackgroundUpdateTask()
startBackgroundService()
return true
}
internal func startBackgroundService(){
if AppDelegate.backgroundService == nil{
AppDelegate.backgroundService = BackgroundService.getBackgroundService()
}
AppDelegate.backgroundService!.startService(self)
}
internal func stopBackgroundService(){
AppDelegate.backgroundService!.stopService()
}
func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier {
return UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})
}
func applicationDidEnterBackground(application: UIApplication) {
self.startBackgroundService()
print("applicationDidEnterBackground")
}
}
已为iphone上的应用程序启用后台应用程序刷新和位置服务。后台模式已启用,其他所需权限已添加到Info.plist中
这个问题并不是因为我在另一部使用iOS 9.2的手机上测试了代码而导致的,它工作得非常好。在将第二部手机更新为iOS 9.3.2后,出现了相同的问题。9.3中是否有导致此问题的任何更改?我查阅了变更日志和文档,但没有找到任何有用的东西。还有其他人遇到过类似的问题吗?是否需要进行任何更改以确保应用程序与iOS 9.3兼容?自iOS 9以来,您可以避免使用
backgroundTaskWithExpirationHandler
,如果您想从LocationManager
持续访问数据,您可以使用AllowBackgroundLocationUpdate
,如果在后台停止LocationManager
,您将无法从后台重新启动它
if #available(iOS 9.0, *) {
manager.allowsBackgroundLocationUpdates = true
} else {
// Fallback on earlier versions
}
终于解决了这个问题。按照建议添加
locationManager.allowsBackgroundLocationUpdates=true
后,问题仍然存在。虽然它在后台运行了更长的时间,但在某个时间点之后,应用程序停止获取位置数据
在网上搜索了一段时间后,我发现了这个设置
locationManager.pausesLocationUpdatesAutomatically = false
添加这一行解决了这个问题,并且位置获取在后台工作,不会突然停止。它的默认值为true
正如@Ahmed和@Chajmz所述,iOS 9及更高版本中需要更新AllowsBackgroundLocation
在iOS 9及更高版本中,无论部署目标如何,还必须将location manager对象的allowsBackgroundLocationUpdates属性设置为YES,以便接收后台位置更新。默认情况下,此属性为“否”,在应用程序主动要求后台位置更新之前,它应保持此状态
根据关于
允许location manager暂停更新可以提高目标设备的电池寿命,而不会牺牲位置数据。当此属性设置为true时,位置管理器会在位置数据不太可能更改时暂停更新(并关闭相应硬件的电源)。例如,如果用户在使用导航应用程序时停下来吃饭,位置管理器可能会暂停更新一段时间
此属性的默认值为true
我怀疑苹果已经加强了后台处理。使用
backgroundTaskWithExpirationHandler
不是在后台获取位置更新的正确方法。@Paulw11-您能建议什么是在后台获取位置更新的正确方法吗?我不熟悉iOS开发,backgroundTaskWithExpirationHandler是我在后台工作的唯一方法。您是否使用后台模式进行位置更新?@Ahmed-是-已启用位置更新的后台模式。是否在后台模式下对其进行多次测试?只要您愿意,可以重新启动已在中启动重要的位置更新foreground@Nilesh-无论您在哪里初始化locationManager,都需要添加这两行。