iOS计时器在后台

时间:2016-01-18 08:42:23

标签: ios swift timer background notifications

我想在我的iOS应用程序中启动计时器,当应用程序在后台运行时以及应用程序关闭时。计时器必须每30分钟检查一次新的通知。在计时器功能中,他们每隔30分钟调用另一个函数showNotification()。

如何在应用程序未在后台运行/运行时,如何执行此计时器以及我必须在哪个地方调用计时器。

4 个答案:

答案 0 :(得分:5)

AFAIK在后台(生产中)180s后无法运行NSTimer。

编辑:如果启用后台模式,则最多可以获得10分钟。你可以了解更多,例如。 here

答案 1 :(得分:5)

当应用程序不在前台时,无法100%确定地执行某些操作。您可以使用后台提取定期唤醒,但无法控制何时发生。

虽然有一些技术上的解决方法,甚至可能还有一些hacky解决方案(在后台播放静音音频),但听起来我的问题就是可以在不使用定时器和背景提取的情况下解决问题。

只需实施remote notifications即可。当您的iOS收到应用通知时,它会唤醒应用并让它处理一段时间。然后,您可以控制向用户显示的通知,并可能在后台加载一些数据。

从广义上讲,您需要:

  • 在您的应用启动时注册远程通知(通常在应用程序中:didFinishLaunching :)
  • 当您收到通知令牌时,将其发送到将向您发送通知的Web服务器(此令牌可能会更改,因此请务必在启动应用时将其发送到您的Web服务器)
  • 当新内容可用时,您的Web服务器可以使用令牌将有效负载发送到您的应用程序(您选择的语言可能已经有一个库。例如,如果您使用Ruby,则有Houston

答案 2 :(得分:3)

Write this both methos in your Appdelegate.m file

//For Objective c
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
          [self TimerMethod];
    }
    -(void)TimerMethod
    {
        //Every 30 minute call the functions
        _timer=[NSTimer scheduledTimerWithTimeInterval:1800.0f target:self selector:@selector(updateMethod:) userInfo:nil repeats:YES];
    }

    - (void)updateMethod:(NSTimer *)theTimer
    {
        NSLog(@"Timer set now");
    }

//For Swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool 
{
     self.TimerMethod()
}

func TimerMethod()
{
      var timer = NSTimer.scheduledTimerWithTimeInterval(1800, target: self, selector: "updateMethod", userInfo: nil, repeats: true)
}

func updateMethod()
{
    print("set timer now")
}

答案 3 :(得分:0)

将此代码添加到appdeleage.swift中

var backgroundUpdateTask: UIBackgroundTaskIdentifier = 0

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

func applicationWillResignActive(application: UIApplication) {
    self.backgroundUpdateTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
        self.endBackgroundUpdateTask()
    })
}

func endBackgroundUpdateTask() {
    UIApplication.sharedApplication().endBackgroundTask(self.backgroundUpdateTask)
    self.backgroundUpdateTask = UIBackgroundTaskInvalid
}

func applicationWillEnterForeground(application: UIApplication) {
    self.endBackgroundUpdateTask()
}