我的位置服务有问题.我无法设置一个功能,通过NSTimer在后台更新我的位置坐标.这是来自appDelegate的代码:
var locationManager = CLLocationManager()

func applicationDidEnterBackground(application: UIApplication) {

    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest

    self.theTimer = NSTimer(fireDate: NSDate(),interval: 40,target: self,selector: "handleTimer",userInfo: nil,repeats: true)
    NSRunLoop.currentRunLoop().addTimer(self.theTimer,forMode: NSDefaultRunLoopMode)

}

    func locationManager(manager: CLLocationManager!,didUpdateLocations locations: [AnyObject]!) {
    var locValue:CLLocationCoordinate2D = manager.location.coordinate
    println("dinBack = \(locValue.latitude) \(locValue.longitude)")
    self.locationManager.stopUpdatingLocation()
}

func handleTimer(){

    println("started")
    self.locationManager.startUpdatingLocation()

}

PS. – 当然,我已经导入了重置.
– 当我回到应用程序时,控制台会打印出应该在后台打印的内容.

解决方法

当您的应用程序在后台时,您无法使NSTimer像这样工作. NSTimer不是“实时机制”.从 official documentation:

Timers work in conjunction with run loops. To use a timer effectively,you should be aware of how run loops operate—see 07001 and 07002. Note in particular that run loops maintain strong references to their timers,so you don’t have to maintain your own strong reference to a timer after you have added it to a run loop.

A timer is not a real-time mechanism; it fires only when one of the run loop modes to which the timer has been added is running and able to check if the timer’s firing time has passed. Because of the varIoUs input sources a typical run loop manages,the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds. If a timer’s firing time occurs during a long callout or while the run loop is in a mode that is not monitoring the timer,the timer does not fire until the next time the run loop checks the timer. Therefore,the actual time at which the timer fires potentially can be a significant period of time after the scheduled firing time.

强调我的.

重要的是,当您的应用程序在后台时,您的计时器将被安排的任何运行循环都没有正在运行.

一旦您的应用程序返回到前台,此运行循环将重新启动,发现您的计时器已过期,并将该消息发送到选择器.

对于iOS 7和转发,如果要在后台执行操作,可以告诉操作系统您要执行“后台提取”.

要进行此设置,我们必须首先告诉操作系统我们想要获取数据的频率,因此在didFinishLaunching …中,添加以下方法:

func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
    return true
}

我们可以在这里传递任何时间间隔(例如,如果我们只想每天检查一次).但是,我们传入的值仅定义了应在检查之间传递的最小时间量.没有办法告诉操作系统检查之间的最长时间.

现在,我们必须实现在操作系统为我们提供后台工作机会时实际调用的方法:

func application(application: UIApplication,performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    // do background work
}

我们可以在这种方法中做任何我们想做的事.然而,有两个渔获量.

>当我们的应用程序在后台时调用此方法.操作系统限制我们(我相信)三十秒.三十秒后,我们的时间到了.
>我们必须调用completionHandler()(或操作系统会认为我们使用了所有时间).

传入的completionHandler采用枚举UIBackgroundFetchResult.我们应该传递.Failed,.NewData或.NoData,具体取决于我们的实际结果(这种方法通常用于检查服务器的新数据).

所以,我们的方法可能如下所示:

func application(application: UIApplication,performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    // do stuff
    if let _ = error {
        completionHandler(.Failed)
    } else if results.count > 0 {
        completionHandler(.NewData)
    } else {
        completionHandler(.NoData)
    }
}

请记住,我们绝对无法控制操作系统实际让我们在后台运行此代码的频率.操作系统使用多个指标来优化用户体验.

我想如果你的应用程序报告.对于完成处理程序,操作系统可能会很快给你第二次机会,但是如果你滥用.Failed,操作系统可能会将你的应用程序列入黑名单使用后台提取(并且Apple可能会拒绝你的应用程序).

如果您的应用没有报告.NewData,操作系统会让您的应用减少后台工作的频率.我不是这样说的,因为我建议你总是报告.NewData.你一定要准确报道.操作系统在调度工作方面非常聪明.如果您在没有新数据的情况下传递.NewData,操作系统会让您的应用程序更频繁地工作,这会更快地耗尽用户的电池(并可能导致他们完全卸载您的应用程序).

但是,当您的应用开展后台工作时,还会涉及其他指标.当用户积极使用他们的设备时,操作系统不太可能让任何应用程序进行后台工作,并且当用户不使用他们的设备时,它更有可能让应用程序进行后台工作.此外,操作系统更有可能在WiFi上进行后台工作,同时将其插入某种充电器.

操作系统还会查看用户定期使用应用程序的频率,或者定期使用应用程序的时间.如果用户每天下午6点使用您的应用程序,而且从未在任何其他时间使用您的应用程序,那么您的应用程序很可能总是有机会在下午5:30至下午6点(在用户使用该应用程序之前)进行后台工作.从来没有在一天的任何其他部分.如果用户很少使用您的应用,那么在后台工作的机会可能是几天,几周或几个月.

iOS Swift – 使用NSTimer for app background重新加载位置功能不起作用的更多相关文章

  1. HTML5自定义视频播放器源码

    这篇文章主要介绍了HTML5自定义视频播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. HTML5自定义mp3播放器源码

    这篇文章主要介绍了HTML5自定义mp3播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  3. html5自定义video标签的海报与播放按钮功能

    这篇文章主要介绍了html5自定义video标签的海报与播放按钮功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  4. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  5. h5页面背景图很长要有滚动条滑动效果的实现

    这篇文章主要介绍了h5页面背景图很长要有滚动条滑动效果的实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. html5借用repeating-linear-gradient实现一把刻度尺(ruler)

    这篇文章主要介绍了html5借用repeating-linear-gradient实现一把刻度尺,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. 如何在Canvas中添加事件的方法示例

    这篇文章主要介绍了如何在Canvas中添加事件的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. HTML5自定义元素播放焦点图动画的实现

    这篇文章主要介绍了HTML5自定义元素播放焦点图动画的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. 有关HTML5页面在iPhoneX适配问题

    这篇文章主要介绍了有关HTML5页面在iPhoneX适配问题,需要的朋友可以参考下

  10. html5简介及新增功能介绍

    这篇文章主要介绍了html5简介及新增功能介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部