iOS 后台计时器

问题描述 投票:0回答:5

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

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

ios swift timer background notifications
5个回答
5
投票

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

虽然有一些技术解决方法,甚至可能有一些黑客解决方案(在后台播放无声音频),但在我看来,您的问题可以在不使用计时器和后台获取的情况下解决。

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

从广义上讲,您需要:

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

5
投票

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

编辑:如果启用后台模式,您最多可以获得 10 分钟。您可以了解更多信息,例如。 这里


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

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()
}

0
投票

对此没有直接的解决方案,我们需要通过播放无声音频来实现一个简单的技巧,这将使我们的应用程序在后台保持活动状态。此处添加说明:Medium Article.

© www.soinside.com 2019 - 2024. All rights reserved.