斯威夫特位置管理器

Posted

技术标签:

【中文标题】斯威夫特位置管理器【英文标题】:Swift location manager 【发布时间】:2015-08-05 02:55:16 【问题描述】:

我在 Swift 中的位置有问题。

在模拟器上工作正常,但在设备上不工作

我使用模拟器 iPhone 6 ios 8.3 和设备 iPhone 6 iOS 8.3

我的代码:

import UIKit
import CoreLocation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,
CLLocationManagerDelegate 

  var window: UIWindow?
  var locationManager: CLLocationManager! = nil
  var isExecutingInBackground = false

  func locationManager(manager: CLLocationManager!,
    didUpdateToLocation newLocation: CLLocation!,
    fromLocation oldLocation: CLLocation!)
      if isExecutingInBackground
        println(newLocation);
        locationManager.stopUpdatingLocation()
       else 
        /* We are in the foreground. Do any processing that you wish */
      
  

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
 
    locationManager = CLLocationManager()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.delegate = self
    locationManager.startUpdatingLocation()
    return true
  



  func applicationDidEnterBackground(application: UIApplication) 
    isExecutingInBackground = true
    var timer = NSTimer.scheduledTimerWithTimeInterval(30, target: self, selector: Selector("update"), userInfo: nil, repeats: true)


    /* Reduce the accuracy to ease the strain on
    iOS while we are in the background */
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
  

    func update() 
        println("test");
        locationManager.startUpdatingLocation()
    

  func applicationWillEnterForeground(application: UIApplication) 
    isExecutingInBackground = false

    /* Now that our app is in the foreground again, let's increase the location
    detection accuracy */
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
  

我想每 30 秒获取一次位置

那为什么不在设备上工作呢?

【问题讨论】:

在确认您拥有位置权限之前,您不应调用 startUpdatingLocation。 didUpdateToLocation 也已弃用。最后,您的设备是否启用了定位服务?当您在后台时,NSTimer 不会执行,但无论如何它不会做任何事情 是的,定位服务已启用当我单击菜单按钮时,我得到了位置,但 30 秒后我无法获得位置 您不一定会每 30 秒获得一次位置更新。当您的位置变化超过报告阈值时,您会收到位置更新。你在移动你的设备吗? 是的,如果我搬家还是不行…… 我做了一个对我有用的简单例子,从这里看:***.com/a/35973586/3410437 【参考方案1】:

底线,对于后台更新,您要么使用“重大更改”服务,要么必须请求后台位置服务(Apple 将其限制为对位置更新有迫切需求的应用程序,即实际导航应用程序)。

请参阅 iOS 应用程序编程指南中的 Tracking the User’s Location 部分:

跟踪用户的位置

有几种方法可以在后台跟踪用户的位置,其中大多数实际上并不需要您的应用在后台连续运行:

重大变化的定位服务(推荐) 仅限前台的定位服务 后台定位服务

对于不需要高精度位置数据的应用,强烈建议使用重大变化的位置服务。使用此服务,仅当用户的位置发生重大变化时才会生成位置更新;因此,它非常适合社交应用程序或为用户提供非关键、位置相关信息的应用程序。如果应用程序在发生更新时被挂起,系统会在后台将其唤醒以处理更新。如果应用程序启动此服务然后终止,系统会在新位置可用时自动重新启动应用程序。此服务在 iOS 4 及更高版本中可用,并且仅在包含蜂窝无线电的设备上可用。

仅前台和后台位置服务都使用标准位置核心位置服务来检索位置数据。唯一的区别是,如果应用程序暂停,仅前台位置服务将停止提供更新,如果应用程序不支持其他后台服务或任务,则很可能会发生这种情况。仅前台位置服务适用于仅在前台需要位置数据的应用。

您可以从 Xcode 项目的 Capabilities 选项卡的 Background mode 部分启用位置支持。 (您也可以通过在应用程序的Info.plist 文件中包含带有位置值的UIBackgroundModes 键来启用此支持。)启用此模式不会阻止系统挂起应用程序,但它会告诉系统它应该唤醒每当有新的位置数据要交付时,就启动应用程序。因此,此键有效地让应用程序在后台运行,以便在位置更新发生时对其进行处理。

重要提示:我们鼓励您谨慎使用标准服务或改用重要的位置更改服务。定位服务需要主动使用 iOS 设备的板载无线电硬件。连续运行此硬件会消耗大量电力。如果您的应用不需要向用户提供精确且连续的位置信息,最好尽量减少使用位置服务。

有关如何在您的应用中使用各种不同位置服务的信息,请参阅位置和地图编程指南。

【讨论】:

以上是关于斯威夫特位置管理器的主要内容,如果未能解决你的问题,请参考以下文章

如何查找任务管理器里的进程位置?

任务管理器进程位置

位置管理器,即使设置了 kCLLocationAccuracyBest 也不准确

即使我调用 stopUpdatingLocation 仍然显示位置管理器图标

java中如果适用了布局管理器,还能再设置按钮等组件的大小和位置了吗?

位置管理器提供的最新价值是啥