【问题标题】:location in the background does not work后台定位不起作用
【发布时间】:2016-08-02 12:05:08
【问题描述】:

我正在开发一个代码,它应该每 10 分钟获取一次我的位置,并在 CoreData 中进行拯救。当我使用 conectavo app to xcode 进入后台时,看不到服务正在运行的日志,但是当我出去走在街上时,他根本没有保存或保存的次数太少。

这是我应该执行此功能的代码的一部分。请参阅保存在 codeData 中:

var saveLocationInterval = 60.0

func applicationDidEnterBackground(application: UIApplication) {
        UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler(nil)
        self.timer = NSTimer.scheduledTimerWithTimeInterval(saveLocationInterval, target: self, selector: #selector(AppDelegate.saveLocation), userInfo: nil, repeats: true)
        NSRunLoop.currentRunLoop().addTimer(self.timer, forMode: NSRunLoopCommonModes)

        locationController.startUpdatingLocation()
    }

 func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        saveLocation()
    }

func saveLocation(){
        print("======")
        let logUser = NSEntityDescription.insertNewObjectForEntityForName("LOG_GPS", inManagedObjectContext: self.managedObjectContext) as! LOG_GPS

        if locationController.location == nil{
            logUser.latitude = ""
            logUser.longitude = ""
        } else {
            logUser.latitude = "\(locationController.location!.coordinate.latitude)"
            logUser.longitude = "\(locationController.location!.coordinate.longitude)"
        }

        logUser.velocidade = userSpeed > 0 ? Int(userSpeed) : 0
        logUser.address = "\(userSpeed)"

        if _usuario.chave != nil {
            logUser.chave_usuario = "\(_usuario.chave!)"
        }
        if _empresa.chave != nil {
            logUser.chave_licenca = "\(_empresa.chave!)"
        }

        print("localizaçao salva no bd \(logUser.latitude)")
        let date = NSDate()
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "dd/MM/yy HH:mm:ss"
        let dateString = dateFormatter.stringFromDate(date)
        logUser.data = dateString
        do {
            try self.managedObjectContext.save()
        } catch {
        }
    }

我无法解决的代码中的另一个主要错误是用户的速度。在方法中,我试图将你的速度保存在一个变量中,然后保存 CoreData 但是这是我总是返回一个负值:

func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
        var speed: CLLocationSpeed = CLLocationSpeed()
        speed = newLocation.speed
        print(speed * 3.6)
        userSpeed = speed * 3.6
    }

this is my background mode

【问题讨论】:

  • 你设置 UIBackgroundModes 了吗?
  • 我发布一个屏幕截图
  • 我想我解决了你的问题;在我的答案下方评论告诉我它是否有效!
  • 天哪,我才意识到我几个月前就回答了同样的问题......我很抱歉没有早点记得!无论如何,这肯定会解决您的问题:stackoverflow.com/questions/36524644/… 我会将其添加到我的答案中。
  • 所以我的最终答案(肯定会为您解决)已添加到下面的答案中(possible solution 2)。请让我知道它的效果如何!! (再次抱歉没有早点记住这个技巧。)

标签: ios swift core-data locationmanager


【解决方案1】:

可能的解决方案 1

您需要在您的 Info.plist 中输入一个密钥,该密钥描述了您的应用需要后台位置的原因。

转到您的Info.plist,找到Bundle Version 键,然后单击将鼠标悬停在该键上时出现的+。然后添加键NSLocationAlwaysUsageDescription,将其设置为字符串,并将值设置为您希望描述的任何内容,例如“我们需要您在后台的位置,因此我们与朋友分享您的位置。”

现在您的应用应该可以运行了。如果没有……

可能的解决方案 2(如果您知道自己在做什么,则更有可能的解决方案)

在 iOS 9 中,Apple 使物理设备上的应用程序需要一行特殊的代码来在后台运行定位服务。这一变化并没有被广泛报道(如果有的话?)但我不久前设法弄清楚了这一点。要让定位服务在物理设备上再次在后台运行,您需要执行以下操作:

在您的主要位置跟踪视图控制器的ViewDidLoad 中放置...

if #available(iOS 9.0, *) {
     locationManager.allowsBackgroundLocationUpdates = true
} else {
    // You don't need anything else on earlier versions.
}

这将(足够神秘)可能是您解决问题所需的全部内容。

【讨论】:

  • 谢谢,我这样做了,现在我会做一些测试。如果可行,我就住在这里。不过还是谢谢你。
  • @breno 太好了。让我知道它是否有效,如果它解决了您的问题,请务必点击复选标记。
  • 交给我吧。谢谢=D
  • 我做了测试,发现即使这样错误仍然存​​在。有一次ipad只是简单地把信息记录在数据库里。
  • 好的,那么你的代码可能是错误的。尝试执行this background modes tutorial 的定位部分,然后在您的项目中使用该代码。这应该可以解决问题。
猜你喜欢
  • 1970-01-01
  • 2013-09-27
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
相关资源
最近更新 更多