当前位置: 首页 > 知识库问答 >
问题:

在后台永远运行Swift 2.0应用程序,将位置更新到服务器

穆鸿波
2023-03-14

我写了下面的代码,它有一个定时器,每分钟调用一个回调函数。当应用程序转到后台时,我启动了另一个计时器,调用相同的回调方法,但后台计时器仅工作三分钟。

我知道苹果只允许后台任务三分钟。我的应用程序更像一个跟踪应用程序,即使应用程序在后台,也可以每分钟跟踪用户的位置,所以我需要实现这个功能。

我了解到将使用beginBackgroundTaskWithExpirationHandler,但我不知道我的实现是否正确。

注意:我在plist-toApp寄存器中有位置更新所需的背景模式。

非常感谢任何工作代码或链接。

override func viewDidLoad() {
    super.viewDidLoad()

    timeInMinutes = 1 * 60

    self.locationManager.requestAlwaysAuthorization()

    self.locationManager.requestWhenInUseAuthorization()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }

    var timer = NSTimer.scheduledTimerWithTimeInterval( timeInMinutes, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate

    self.latitude = locValue.latitude
    self.longitude = locValue.longitude

    if UIApplication.sharedApplication().applicationState == .Active {

    } else {
        backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ () -> Void in
            self.backgroundTimer.invalidate()
            self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval( 60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
        })
    }
}

func updateLocation() {
    txtlocationLabel.text = String(n)
    self.n = self.n+1

    var timeRemaining = UIApplication.sharedApplication().backgroundTimeRemaining

    print(timeRemaining)

    if timeRemaining > 60.0 {
        self.GeoLogLocation(self.latitude,Longitude: self.longitude) {
            results in
            print("View Controller: \(results)")
            self.CheckResult(String(results))
        }
    } else {
        if timeRemaining == 0 {
            UIApplication.sharedApplication().endBackgroundTask(backgroundTaskIdentifier)
        }

        backgroundTaskIdentifier2 = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ () -> Void in
            self.backgroundTimer.invalidate()
            self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval( 60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
        })
    }
}

共有2个答案

庄欣然
2023-03-14

您可以使用库进行背景位置跟踪,例如:

    var backgroundLocationManager = BackgroundLocationManager()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

     backgroundLocationManager.startBackground() { result in
            if case let .Success(location) = result {
                LocationLogger().writeLocationToFile(location: location)
            }
    }

    return true
}

当应用程序被终止或挂起时,它正在工作。

齐高寒
2023-03-14

在IOS中定期更新位置有点棘手。有一个很好的帖子讨论了这一点,你可以在这里阅读更多

iOS将在几分钟后终止您的应用程序,无论您的计时器是否正在运行。不过,有一种方法可以解决这个问题,我在编写ionic应用程序时也做了类似的事情,这样你就可以在这里查看代码了,这个链接有一个swift类,可以管理iOs中的定期位置更新。

为了在后台获得周期性的位置,并且不耗尽设备的电池电量,您需要使用位置记录的准确性,降低位置管理器的准确性,将其所需的准确性设置为KCllocationAccuracyThreeKms,然后,每60秒您需要将精确度更改为kCLLocationAccuracyBest,这将使代理能够获得新的准确位置更新,然后将准确度恢复到较低。每次收到更新时都需要初始化计时器。

还有一种方法可以在应用程序被用户杀死后在后台唤醒应用程序,在应用程序被杀死之前,使用应用程序代理让应用程序侦听位置的重大更改。当用户的位置发生大跳跃时(可能在200毫秒左右),这将在后台唤醒应用程序。当应用程序唤醒时,停止监视重大更改,并像往常一样重新启动位置服务以继续定期更新。

希望这有帮助。

最新消息

在Swift 2中,您还需要:

self.locationManager.allowsBackgroundLocationUpdates = true
 类似资料:
  • 问题内容: 我写了下面的代码,其中包含一个计时器,每分钟调用一次回调函数。当应用程序进入后台时,我已经启动了另一个计时器,该计时器调用相同的回调方法,但是后台计时器仅工作三分钟。 我了解到Apple仅允许后台任务执行三分钟。我的应用程序更像是一个跟踪应用程序,即使在后台运行该应用程序,它也每分钟都会跟踪用户的位置,因此我需要实现此功能。 我了解到将要使用它,但是我不知道我的实现是否正确。 注意:我

  • 我的背景粘性服务是杀死奥利奥和更高的设备,任何解决方案,以获得位置的背景服务时,活动是在后台

  • 问题内容: 每当用户断开手机通话时,我都希望显示自定义弹出消息。问题是如何检测应用程序何时未运行。任何线索都将有所帮助。 问题答案: 已经有一段时间了,并且已经有了很多发展。 首先,如何在Flutter中创建服务以使应用程序始终在后台运行有一些答案? 此外,使用Flutter插件和地理围栏(在2018年9月),Flutter / Background流程 基本上将使您指向在后台执行中等/执行Dar

  • 问题内容: 多年来,由于这篇文章引起了很多关注,因此我在文章的底部列出了每个平台的最佳解决方案。 原始帖子 : 我希望我的node.js服务器在后台运行,即:当我关闭终端时,我希望服务器继续运行。我已经用谷歌搜索并提出了本教程,但是它没有按预期工作。因此,我没有使用该守护程序脚本,而是以为我只使用了输出重定向(该`2>&1 file`部分),但这也不会退出-我在终端中出现空白行,就像它在等待输出/

  • 问题内容: 我是这里的新用户,但是我已经使用stackoverflow很多次了:)…我是android开发人员,但是现在我正在使用swift在ios应用程序中工作。我对使用xcode完全陌生,也许我的问题在很多方面都很简单…太好了,我真的需要帮助。我正在尝试实现一个背景任务,该任务每十分钟更新一次用户位置。我需要获取经纬度数据,并将此信息发送到API网络服务。我一直在介绍backgroud文档,所

  • 在其他语言中,此任务很简单,只需在Python中使用类似以下内容: 如果没有什么要处理的,我的程序也会想暂停执行。我不希望它用查询使数据库过载。 我正在尝试编写一个应用程序,它将充当后台队列处理器。它将检查数据库,看看队列中是否有任何需要处理的项目,然后该程序将数据写入磁盘上的文件。连接到同一数据库的不同系统的用户会间歇性地将数据添加到数据库中。 我认为永久npm模块不太合适,因为该模块只是检查脚