iOS定时器在后台

7eumitmz  于 2023-02-06  发布在  iOS
关注(0)|答案(4)|浏览(468)

我想在我的iOS应用程序中启动一个计时器,当应用程序在后台运行时,当应用程序关闭。计时器必须检查每30分钟有一个新的通知。在计时器函数中,他们调用每30分钟另一个函数showNotification()。
我如何做这个计时器,当应用程序不运行/在后台运行时,我必须在哪个地方调用计时器。

5tmbdcev

5tmbdcev1#

当应用程序不在前台的时候是不可能做一些事情的,有100%的确定性,你可以使用后台获取来周期性地被唤醒,但是你不能控制它什么时候发生。
虽然有一些技术上的变通方法,甚至可能有一些蹩脚的解决方案(在后台播放静音音频),但在我看来,您的问题可以在不使用计时器和后台获取的情况下得到解决。
只需实现remote notifications。当iOS收到应用的通知时,它会唤醒应用并让它处理一段时间。然后,您可以控制向用户显示哪些通知,还可以在后台加载一些数据。
概括地说,您需要:

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

xlpyo6sf2#

AFAIK没有办法在后台(在生产中)运行180s后的NSTimer。
编辑:如果你启用背景模式,你可以得到最多10分钟。你可以了解更多,例如。here

vaqhlq81

vaqhlq813#

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")
}
vddsk6oq

vddsk6oq4#

将此代码添加到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()
}

相关问题