我想在我的iOS应用程序中启动计时器,当应用程序在后台运行时以及应用程序关闭时。计时器必须每30分钟检查一次新的通知。在计时器功能中,他们每隔30分钟调用另一个函数showNotification()。
如何在应用程序未在后台运行/运行时,如何执行此计时器以及我必须在哪个地方调用计时器。
答案 0 :(得分:5)
AFAIK在后台(生产中)180s后无法运行NSTimer。
编辑:如果启用后台模式,则最多可以获得10分钟。你可以了解更多,例如。 here
答案 1 :(得分:5)
当应用程序不在前台时,无法100%确定地执行某些操作。您可以使用后台提取定期唤醒,但无法控制何时发生。
虽然有一些技术上的解决方法,甚至可能还有一些hacky解决方案(在后台播放静音音频),但听起来我的问题就是可以在不使用定时器和背景提取的情况下解决问题。
只需实施remote notifications即可。当您的iOS收到应用通知时,它会唤醒应用并让它处理一段时间。然后,您可以控制向用户显示的通知,并可能在后台加载一些数据。
从广义上讲,您需要:
答案 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()
}