【问题标题】:Background task stops after 3 minutes后台任务在 3 分钟后停止
【发布时间】:2017-02-28 18:50:53
【问题描述】:

我想运行一个后台任务。用于检查网络连接,甚至是后台应用程序

-(void) beginBackgroundUploadTask
{
    isBackGroundRunning = YES;
    if(self.backgroundTask != UIBackgroundTaskInvalid)
    {
        [self endBackgroundUploadTask];
    }

    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{

        NSLog(@"Background Time Remaining :%f",[[UIApplication sharedApplication] backgroundTimeRemaining]);

    }];
}

-(void) endBackgroundUploadTask
{
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask ];
    self. backgroundTask = UIBackgroundTaskInvalid;
}

-(void) initializeUpdateTimer
{
    a= 0;
    [self.updateTimer invalidate];
    self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:5
                                                            target:self
                                                          selector:@selector(checkNetWorkStatus)
                                                          userInfo:nil repeats:YES];
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground){

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

                [[NSRunLoop currentRunLoop] addTimer:self.updateTimer forMode:NSDefaultRunLoopMode]; //NSDefaultRunLoopMode
                [[NSRunLoop currentRunLoop] run];
            });

        }
    }];
}

当应用程序进入后台时,我是 initializeUpdateTimer 函数。 任务在 3 分钟后自动停止。 是否可以将时间延长30分钟。

【问题讨论】:

  • 您不能在后台启动计时器。
  • @matt : 有没有办法从后台检查网络状态至少 30 分钟。
  • 为什么需要这样做?如果您的应用程序在后台,则它没有运行,并且网络状态对您来说无关紧要。如果您尝试进行后台上传/下载或尝试在后台调用以执行网络任务,那么有很多方法可以做到这一点。但你的代码不是。
  • 根据我的要求,如果电话互联网连接在 30 分钟后丢失,我需要以本地推送通知的形式通知用户。
  • 你不能,除非你的应用已经因为其他原因在后台运行。而且,正如我已经说过的,这似乎是一个非常没有意义的要求。

标签: ios objective-c iphone background


【解决方案1】:

一旦您的应用暂停,就无法检查互联网是否可用,通常 iOS 会在 3 分钟内暂停应用,但这取决于操作系统。但是有一个hacky方式

  1. 如果您需要知道,您的应用是否处于唤醒状态,请尝试使用静默推送通知,
  2. 如果您收到静默推送,请将本地通知设置为 30 或更多,如果您收到另一个静默推送通知,请从其计划中删除本地通知,
  3. 如果静默推送从未到达,让本地通知完成其工作。

这是我实现您要求的方式,但我从未推荐过。

【讨论】:

    猜你喜欢
    • 2014-01-05
    • 2015-11-26
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多