Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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 我的应用程序进入暂停状态的原因?_Ios_Swift_Background_Core Location_Cllocationmanager - Fatal编程技术网

Ios 我的应用程序进入暂停状态的原因?

Ios 我的应用程序进入暂停状态的原因?,ios,swift,background,core-location,cllocationmanager,Ios,Swift,Background,Core Location,Cllocationmanager,我创建了一个位置跟踪ios应用程序,使用CocoaLumberjack库编写日志文件。因此,启用了后台位置更新并正在为我的测试工作。我在后台几乎运行了8个小时。当应用程序进入live store时。我们的应用程序中出现了很多问题。当应用程序转到后台时,位置跟踪无法正常工作。在一段时间内不会将用户位置发送到服务器。所以我从客户那里得到了日志文件,并查看了日志文件中的时间间隔。我经常每隔一秒钟就获取一次用户位置。所以我认为在日志文件中出现间隙时,应用程序进入暂停状态?为什么应用程序会进入暂停状态,即

我创建了一个位置跟踪ios应用程序,使用CocoaLumberjack库编写日志文件。因此,启用了后台位置更新并正在为我的测试工作。我在后台几乎运行了8个小时。当应用程序进入live store时。我们的应用程序中出现了很多问题。当应用程序转到后台时,位置跟踪无法正常工作。在一段时间内不会将用户位置发送到服务器。所以我从客户那里得到了日志文件,并查看了日志文件中的时间间隔。我经常每隔一秒钟就获取一次用户位置。所以我认为在日志文件中出现间隙时,应用程序进入暂停状态?为什么应用程序会进入暂停状态,即使我经常在后台获取位置?应用程序进入暂停状态是否有原因?搜索的批次找不到任何有效的详细信息

 func startTimer()
{
    if bgTimer == nil
    {
        bgTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.startLocationChanges), userInfo: nil, repeats: true)
    }
}

func stopTimer()
{
    if bgTimer != nil
    {
        bgTimer?.invalidate()
        bgTimer = nil
    }
}

@objc func startLocationChanges() {
    locationManager.delegate = self
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.pausesLocationUpdatesAutomatically = false
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager,  didUpdateLocations locations: [CLLocation]) {
    //let lastLocation = locations.last!

    // Do something with the location.
    /*print(lastLocation)
    let logInfo = "BGLocationManager didUpdateLocations : " + "\(lastLocation)"
    AppDelegate.appDelegate().writeLoggerStatement(strInfo: logInfo)*/

    locationManager.stopUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {

    if let error = error as? CLError, error.code == .denied {
        // Location updates are not authorized.
        manager.stopMonitoringSignificantLocationChanges()
        return
    }

    // Notify the user of any errors.
}



func applicationDidEnterBackground(_ application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationDidEnterBackground: when the user quits.
    self.writeLoggerStatement(strInfo: "applicationDidEnterBackground")
    appstate = "Background"

    if CoreDataUtils.isUserLoggedIn(entityName: "UserInfo") == true {
        let user = CoreDataUtils.fetchCurrentUser(entityName: "UserInfo")
        if user!.isGPSActive == "1"
        {
            if backgroundTaskIdentifier != nil
            {
                application.endBackgroundTask(backgroundTaskIdentifier!)
                backgroundTaskIdentifier = UIBackgroundTaskInvalid
            }

            backgroundTaskIdentifier = application.beginBackgroundTask(expirationHandler: {
                //UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!)
            })

            BGLocationManager.shared.startTimer()

            let logInfo = String(format:"applicationDidEnterBackground backgroundTimeRemaining : %f",(Double)(application.backgroundTimeRemaining / 60))
            self.writeLoggerStatement(strInfo: logInfo)
        }
    }
}
一些意见:

BeginBackground任务只为您赢得30秒,而不是8小时。在13之前的iOS版本中,这是3分钟,而不是30秒,但这一点仍然存在。总之,这是为了让你完成一些短的、有限长度的任务,而不是让应用无限期地运行。更糟糕的是,如果您不在endBackgroundTask的完成处理程序中调用endBackgroundTask,则当分配的时间过期时,应用程序将被意外终止

后台位置更新有两种基本模式

如果应用程序是导航应用程序,则可以在后台运行该应用程序。但是,在后台运行标准的定位服务将在几个小时内耗尽用户的电池。因此,只有在你的应用绝对需要的情况下,苹果才会授权,例如,你的应用是一个实际的导航应用,而不仅仅是一个出于其他原因想要跟踪位置的应用

另一种模式是。使用此服务,您的应用程序将被挂起,但操作系统将唤醒它以提供位置更新,然后让它再次挂起。看见这并不像标准的定位服务那样精确,但由于该应用程序没有持续运行,而且不需要启动GPS硬件,因此耗电量要少得多

在测试这些类型的后台交互时,您不希望附加到Xcode调试器。通过调试器运行它实际上会改变应用程序的生命周期,从而防止其暂停

由于人们通常不会无限期地让应用程序在后台运行,这意味着您需要删除与计时器相关的代码

一些意见:

BeginBackground任务只为您赢得30秒,而不是8小时。在13之前的iOS版本中,这是3分钟,而不是30秒,但这一点仍然存在。总之,这是为了让你完成一些短的、有限长度的任务,而不是让应用无限期地运行。更糟糕的是,如果您不在endBackgroundTask的完成处理程序中调用endBackgroundTask,则当分配的时间过期时,应用程序将被意外终止

后台位置更新有两种基本模式

如果应用程序是导航应用程序,则可以在后台运行该应用程序。但是,在后台运行标准的定位服务将在几个小时内耗尽用户的电池。因此,只有在你的应用绝对需要的情况下,苹果才会授权,例如,你的应用是一个实际的导航应用,而不仅仅是一个出于其他原因想要跟踪位置的应用

另一种模式是。使用此服务,您的应用程序将被挂起,但操作系统将唤醒它以提供位置更新,然后让它再次挂起。看见这并不像标准的定位服务那样精确,但由于该应用程序没有持续运行,而且不需要启动GPS硬件,因此耗电量要少得多

在测试这些类型的后台交互时,您不希望附加到Xcode调试器。通过调试器运行它实际上会改变应用程序的生命周期,从而防止其暂停

由于人们通常不会无限期地让应用程序在后台运行,这意味着您需要删除与计时器相关的代码


除非您共享代码,否则我们无法帮助您。例如,向我们展示您如何请求后台位置更新。@请检查应用程序是否崩溃。如果您的应用注册了后台位置更新,则不会发生这种情况。而且我个人觉得应用程序不应该每1秒获取一次位置更新。尝试优化它。@Bhumeshwerkatre应用程序没有崩溃。我添加了crashlytics。那里没有撞车。如果您想不断获得更新,为什么要说locationManager.StopUpdateLocation?除非您正在主动更新位置,否则无法在后台运行。2.进入后台后不能启动计时器。你不需要一个。只要打开更新,当你进入后台,它们就会继续。使用计时器进行定位完全是错误的
错。如果你没有像我描述的那样在后台运行,它将立即被暂停。它甚至可能被终止。这并不重要,因为后台模式是由系统运行的,而不是由应用程序运行的;他们将继续工作得很好。这就是重点。除非你共享代码,否则我们无法帮助你。例如,向我们展示您如何请求后台位置更新。@请检查应用程序是否崩溃。如果您的应用注册了后台位置更新,则不会发生这种情况。而且我个人觉得应用程序不应该每1秒获取一次位置更新。尝试优化它。@Bhumeshwerkatre应用程序没有崩溃。我添加了crashlytics。那里没有撞车。如果您想不断获得更新,为什么要说locationManager.StopUpdateLocation?除非您正在主动更新位置,否则无法在后台运行。2.进入后台后不能启动计时器。你不需要一个。只要打开更新,当你进入后台,它们就会继续。使用计时器进行定位是完全错误的。如果你不按照我描述的方式在后台运行,它将立即被挂起。它甚至可能被终止。这并不重要,因为后台模式是由系统运行的,而不是由应用程序运行的;他们将继续工作得很好。这就是关键所在。在iOS 13中,这3分钟的时间不是减少到30秒了吗?确实如此。谢谢。在iOS 13中,这3分钟的时间不是减少到30秒了吗?确实是这样。谢谢