Ios NSTimer没有';设备锁定时无法工作

Ios NSTimer没有';设备锁定时无法工作,ios,objective-c,Ios,Objective C,我有一个应用程序,我想在后台工作的每一次,只有当用户关闭(终止)它失败(如每日警报)。我的代码是: AppDelegate: - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { backgroundUpdateTask = 0; return YES; } -

我有一个应用程序,我想在后台工作的每一次,只有当用户关闭(终止)它失败(如每日警报)。我的代码是:

AppDelegate:

 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
        backgroundUpdateTask = 0;
        return YES;
    }

    - (void)applicationWillResignActive:(UIApplication *)application{
    }

    - (void)applicationDidEnterBackground:(UIApplication *)application{

backgroundUpdateTask = [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
        if (application.applicationIconBadgeNumber > 0) {
            application.applicationIconBadgeNumber = 0;
        }
    }

    - (void)applicationWillEnterForeground:(UIApplication *)application{
        [self endBackgroundUpdateTask];

        if (application.applicationIconBadgeNumber > 0) {
            application.applicationIconBadgeNumber = 0;
        }
    }

    - (void)applicationDidBecomeActive:(UIApplication *)application{
        lte = [[NSUserDefaults standardUserDefaults] valueForKey:@"LTE"];
        if (lte == nil) {
            [Utility GetNewNotification:lte];
            lte = [[[notifyDic objectForKey: @"Notification"]valueForKey:@"LTE"]valueForKey:@"text"];
            [[NSUserDefaults standardUserDefaults] setValue:lte forKey:@"LTE"];
        }
    }

    - (void)applicationWillTerminate:(UIApplication *)application{
    }

    - (void)endBackgroundUpdateTask{
        [[UIApplication sharedApplication]endBackgroundTask:backgroundUpdateTask];
        backgroundUpdateTask = UIBackgroundTaskInvalid;
    }
和视图控制器:

@implementation ViewController
{
    NSTimer *myTimer;
    int counter;
}

-(void)CheckTimer{
    if(counter == 0){
        counter = 60;
        NSString* lte = [[NSUserDefaults standardUserDefaults] valueForKey:@"LTE"];
        [Utility GetNewNotification:lte];
    }
    else {
        counter --;
        //do your video playing work here
    }
}

- (void)viewDidLoad
{

    [super viewDidLoad];
    /// Counter for get new notification
    counter = 60;
    myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(CheckTimer) userInfo:nil repeats:YES];
}

我希望每60秒触发一次,服务调用一次。但180秒后,应用程序转到后台计时器关闭。如果设备处于锁定状态,计时器也会关闭。

要在后台运行代码,请参阅此链接:-

注意事项:-

  • 应用程序只能在后台执行10分钟-在此时间段后,计时器将停止启动
  • 从iOS 7或更高版本开始,当设备锁定时 将立即挂起前台应用程序。锁定iOS 7或更高版本的应用程序后,计时器将不会启动

  • @Darshan Mothreja的回答是正确的。如果您想在后台运行代码,那么实际执行操作的时间有限。在该时间到期后,在应用程序返回前台之前,您是运气不佳的

    根据您试图完成的任务,您可能希望查看AppDelegate中的生命周期方法

    你可能会想看看这个方法:

    - (void)applicationDidBecomeActive:(UIApplication *)application;
    

    并向其添加更多更新代码。这将允许您在应用程序返回前台时更新内容或获取新数据

    由于iOS 7.1,您可以在后台运行这3分钟,或者如果您愿意,您可以使用
    [[UIApplicationsharedApplication]beginBackgroundTaskWithExpirationHandler:^{}]
    在iOS上运行10分钟。您可能想了解更多关于后台执行如何在iOS上工作的信息(扰流板警报:Apple).听起来你好像想要某种通知?正如holex已经写的,你最好阅读apple文档,了解后台执行的工作原理和后台模式。如果你的应用程序不符合特定的类别列表,你不能。请注意,您最终选择的类别将成为苹果审查团队审查的一部分。所以,如果你的应用程序不需要位置,但你将其标记为背景位置,它可能会被拒绝。一些电池杀手应用程序。使用推送通知不是更好吗?