即使从iOS的背景中杀死或删除应用程序,我仍该如何继续更新我的位置?[英] How Can I Continue updating my location even when app is killed or removed from background in ios?

本文是小编为大家收集整理的关于即使从iOS的背景中杀死或删除应用程序,我仍该如何继续更新我的位置?的处理方法,想解了即使从iOS的背景中杀死或删除应用程序,我仍该如何继续更新我的位置?的问题怎么解决?即使从iOS的背景中杀死或删除应用程序,我仍该如何继续更新我的位置?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我的应用程序也需要连续更新位置,即使应用程序被杀死或从背景中删除.它在前景甚至背景模式下都可以正常工作.但是当应用程序被杀死时不起作用. 我尝试了一些代码.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    self.startLocationService()

    if ((launchOptions?[UIApplicationLaunchOptionsLocationKey]) != nil) {
       self.locationmanager = CLLocationManager()
        self.startLocationService()
    }

    print("Location Updates started")


    return true
}

func startLocationService()
{
    self.locationmanager.requestWhenInUseAuthorization()
    self.locationmanager.desiredAccuracy = kCLLocationAccuracyBest
    self.locationmanager.allowsBackgroundLocationUpdates = true
    self.locationmanager.requestAlwaysAuthorization()
    self.locationmanager.delegate = self


    if UIApplication.sharedApplication().backgroundRefreshStatus == .Available {
        print("Background updates are available for the app.")

    }
    else if UIApplication.sharedApplication().backgroundRefreshStatus == .Denied {
        print("The user explicitly disabled background behavior for this app or for the whole system.")

    }
    else if UIApplication.sharedApplication().backgroundRefreshStatus == .Restricted {
        print("Background updates are unavailable and the user cannot enable them again. For example, this status can occur when parental controls are in effect for the current user.")

    }
    else
    {
        print("nothing")
    }

    self.locationmanager.startUpdatingLocation()
}



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 applicationWillTerminate: when the user quits.
   // locationManager = CLLocationManager()
        }

  func applicationDidBecomeActive(application: UIApplication) {

    self.startLocationService()
}

func applicationWillTerminate(application: UIApplication) {      
             self.locationmanager.startMonitoringSignificantLocationChanges()

}


func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     print("did update locateion called-->..")
    let location:CLLocation = locations[locations.count-1] 

    print(location.coordinate.longitude)
      print(location.coordinate.latitude)

    let newTime : NSDate = NSDate()

    let calendar: NSCalendar = NSCalendar.currentCalendar()
    let flags = NSCalendarUnit.Second
    let components = calendar.components(flags, fromDate: oldTime, toDate: newTime, options: [])


   //Update locations to server 
    self.call_service_insertLocation("location", loc: location)

}


func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    print(error)
}

推荐答案

可能会有可能,但是您必须跳过几个篮球. 杀死时发送位置更新的唯一方法是使用区域监视( https://developer.apple.com/library/ios/documentation/userexperience/conceptual/locationawarenesspg/regionmonitoring/regionMonitoring/regionMonitoring.html ). 设置后,您的应用程序将由操作系统打开,然后您有几秒钟的时间来处理该应用程序的信息.已经有足够的时间将位置更新发送到您的服务器/本地存储. 还有另一个称为Clvisit的API,但是它完全由操作系统控制,而不是可靠的.

其他推荐答案

我希望这对您有帮助. 当您的应用程序被某种原因终止时可以唤醒(内存压力).

但是,当应用程序终止时,背景位置更新有限制.

这是Apple的位置和地图编程指南的注释.

如果您的应用程序是由用户或系统终止的,则在新的位置更新到达时,系统不会自动重新启动您的应用程序.用户必须在恢复位置更新之前明确重新启动您的应用程序.自动重新启动应用程序的唯一方法是使用区域监视或重大变化的位置服务. 但是,当用户禁用背景应用程序刷新全球或专门针对您的应用程序设置时,系统不会针对任何位置事件重新启动应用程序,包括重大更改或区域监视事件. 此外,尽管背景应用程序刷新不在您的应用程序中,即使在前景中也不会收到重大的更改或区域监视事件.

因此,要在后台接收位置更新,您应该打开应用程序的设置(您可以在iPhone中看到Settings/Your App/Background App Refresh中的设置.)

当应用程序终止时,只有重大的更改将进行,并且您在此处提到的位置更改(我的意思是kCLLocationAccuracyBest)可能不会唤醒您的应用程序. 此外,您应该在应用程序委托中重新启动位置管理器 S application:didFinishLaunching:withOptions检索下一个重大位置更改的方法.另外,当在背景模式下检索位置时,请确保尽快返回,或使用背景任务机制使应用程序在后台工作几分钟. (2〜3分钟).

本文地址:https://www.itbaoku.cn/post/924670.html