iOS 8 中的定位服务进入“非活动”状态

Posted

技术标签:

【中文标题】iOS 8 中的定位服务进入“非活动”状态【英文标题】:Location service going to “Inactive” state in iOS 8 【发布时间】:2015-03-18 05:14:14 【问题描述】:

我正在创建一个跟踪用户的应用程序。当用户登录应用程序时,我已经开始了重要的位置更新。然后我把我的应用程序放在后台。然后开始用我的车旅行。 500m-1km 后,我的位置发生了显着变化。在获取更新时,我已经停止了重要的位置更新并启动了标准 GPS。它会在 2-3 分钟后更新 m 个位置,然后我看到这个 “位置图标现在应该处于“非活动”状态”,我的应用没有获得任何位置更新。

如果应用处于前台,则应用再次开始获取位置更新。

我正在使用共享位置实例。我有 iPhone 5 和 ios 8.1.3。我正在使用 Swift。

添加一些代码..我已经这样做了

    gpsManager = CLLocationManager()
            gpsManager.delegate = self
            gpsManager.desiredAccuracy = kaccuracy
            gpsManager.distanceFilter = kdistanceFilter 
            gpsManager.pausesLocationUpdatesAutomatically = false
            gpsManager.headingFilter = kheadingFilter
            gpsManager.activityType = kactivityType

            isTracking = false
            isMonitoringSignificantChanges = false


           //on login 
         var sharedGPSManager=GeoLocation.sharedInstance
        sharedGPSManager.delegate=self
        let status=sharedGPSManager.authorizationStatus()
        if(status == 0)
        

            NSLog("Allowed to track")
        
        else
        
            NSLog("Not allowed")
        
       sharedGPSManager.startSignificantLocationTracking()


     func gpsManager(manager:GeoLocation, didUpdateLocations locations:AnyObject)
    
       var sharedGPSManager=GeoLocation.sharedInstance

        sharedGPSManager.stopSignificantLocationTracking()

     task=UIApplication.sharedApplication().beginBackgroundTaskWithName("wifiUpload", expirationHandler:  () -> Void in
        


        sharedGPSManager.delegate = self
        let status = sharedGPSManager.authorizationStatus()
        if(status == 0)
        
            NSLog("Allowed to track")
        
       else
        
            NSLog("Not allowed")
        

        sharedGPSManager.startTracking()

         //process location data

       endBackgroundTask(task)

// 开始位置跟踪 func startTracking()

    if(isMonitoringSignificantChanges)
        gpsManager.stopMonitoringSignificantLocationChanges()
    

    gpsManager.stopUpdatingLocation()

    if CLLocationManager.headingAvailable()
    
        gpsManager.startUpdatingHeading()
    

    gpsManager.startUpdatingLocation()
    isTracking=true
    isMonitoringSignificantChanges=false

【问题讨论】:

如果您希望位置管理器永远收听,请打开应用功能以在后台接收位置 不要分心,不要闲聊(阅读help→tour):乞求,谢谢,你的名字永远不应该成为一个好问题的一部分。 您能否分享一些您在后台收到第一个位置后所做的代码。我猜你自己关闭了定位服务 当我收到第一次位置更新时,我会停止重要的位置服务并启动标准位置服务,如代码所示 【参考方案1】:

最后我在 Apple 开发者论坛上得到了答案。保持重要的位置总是对我有用....

【讨论】:

【参考方案2】:

需要在后台模式下添加Location Update能力

Project Target > Capabilities > Turn Background mode ON > 勾选所有适用于您的应用的选项

【讨论】:

我已经在后台模式下启用了位置更新。我还在 plist 中添加了 NSLocationAlwaysUsageDescription。还是不行【参考方案3】:

您必须在 info.plist 中将必需的后台模式启用为“应用程序注册位置更新”,然后您的应用程序将在后台为您提供位置更新。

您必须使用self.locationManager.startUpdatingLocation() 而不是重要的位置更新。

【讨论】:

我想从重要位置切换到标准位置服务。我在后台调用了 startUpdatingLocation。仍然面临问题 您的代码看起来是正确的,但您为什么要使用 MonitoringSignificantLocationChanges 我需要实现自动启动功能。否则,如果 GPS 始终开启,电池将耗尽。如果 GPS 在前台启动,则工作正常 如果您在后台模式下使用定位,您必须使用实时定位服务,否则苹果会拒绝您的申请。所以我建议你使用 self.locationManager.startUpdatingLocation() 方法。 如果您需要更多帮助,我们可以聊天。

以上是关于iOS 8 中的定位服务进入“非活动”状态的主要内容,如果未能解决你的问题,请参考以下文章

非活动客户端连接的socket.io服务器端超时?

在 iOS 中运行后台服务

GCM 使用 content_available 向 iOS 推送通知(无法从非活动状态调用)

iOS 7+ 应用程序处于非活动状态时是不是可以通过网络发送数据?

iOS开发之程序各种状态监听

IOS应用程序生命周期