我希望在我的 iOS 应用程序中,当应用程序在后台运行以及应用程序关闭时启动计时器。计时器必须每 30 分钟检查一次是否有新通知。在计时器函数中,他们每 30 分钟调用另一个函数 showNotification()。
当应用程序未运行/在后台运行时,我如何执行此计时器以及必须在哪个位置调用计时器。
当应用程序不在前台时,不可能 100% 确定地执行某些操作。您可以使用后台提取来定期唤醒,但您无法控制何时发生。
虽然有一些技术解决方法,甚至可能有一些黑客解决方案(在后台播放无声音频),但在我看来,您的问题可以在不使用计时器和后台获取的情况下解决。
只需实施远程通知。当您的 iOS 收到应用程序的通知时,它会唤醒该应用程序并让它处理一段时间。然后,您可以控制向用户显示哪些通知,还可以在后台加载一些数据。
从广义上讲,您需要:
AFAIK 在后台(在生产中)180 秒后无法运行 NSTimer。
编辑:如果启用后台模式,您最多可以获得 10 分钟。您可以了解更多信息,例如。 这里。
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")
}
将此代码添加到 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()
}
对此没有直接的解决方案,我们需要通过播放无声音频来实现一个简单的技巧,这将使我们的应用程序在后台保持活动状态。此处添加说明:Medium Article.