Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新到iOS 9.3.1及更高版本后,基于位置的iphone应用程序在后台不工作_Ios_Iphone_Swift - Fatal编程技术网

更新到iOS 9.3.1及更高版本后,基于位置的iphone应用程序在后台不工作

更新到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

我创建了一个应用程序,它可以跟踪用户的位置,即使该应用程序位于后台或屏幕被锁定。我已经在iOS 9.2的iPhone5S设备上测试过了,一切正常。更新到iOS 9.3.1后,我注意到该应用程序将在后台运行约10分钟,然后应用程序将自动停止。昨天我将手机升级到iOS 9.3.2,希望能解决这个问题。然而,这个问题仍然存在

我在AppDelegate类中有以下代码

@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,都需要添加这两行。