【问题标题】:How to keep a block of code alive in background?如何让一段代码在后台保持活跃?
【发布时间】:2012-04-04 13:27:39
【问题描述】:

我已经搜索过这个主题,但我主要面临 Apple 的限制。我需要每分钟控制一次我的服务器,如果有变化,请触发本地通知。我需要的是,如何让计时器(NSTimer)在后台(或激活设备锁定时)保持活动状态。请有任何想法。谢谢

【问题讨论】:

标签: ios nstimer background-process


【解决方案1】:

您可以在服务器部分执行您的逻辑,如果有更改发送推送通知。

【讨论】:

    【解决方案2】:

    您需要重新考虑应用的设计。你不能保证当操作系统出去寻找内存来释放你的应用程序永远不会被杀死。在那种情况下会发生什么?推送通知是您最好的选择。首先,您不需要每 60 秒轮询一次服务器;当您感兴趣的内容在服务器上发生更改时,您只需发出通知。其次,即使您的应用程序没有运行,也会收到通知。

    另一个问题是您必须通过 info.plist 告诉 Apple 您的应用支持哪些后台模式。这确实适用于在后台运行音乐或 VoIP 的应用程序。轮询 Web 服务器不是这些受支持的模式之一。通过推送通知,您还可以获得一些委托方法,当应用程序进入前台时,您可以使用这些委托方法来处理通过通知传入的信息。

    【讨论】:

    • 但据我记得“Psuh 通知永远不会被前端接收”。我要保证。
    • 例如,如果您处于飞行模式,则在您再次建立数据连接之前不会收到通知。但是,如果您没有数据连接,那么您的每分钟轮询一次的想法无论如何都行不通。
    • 是的,你是对的,但是当我第一次创建数据连接时,我会看到发生了什么变化
    • 没关系。您第一次创建数据连接是在应用程序最初启动时。随心所欲地检查。如果应用程序启动,它再次使您在后台投票的理论变得无关紧要。
    【解决方案3】:

    我的应用程序通过以下代码在后台持续运行.....

    -(void)applicationDidEnterBackground:(UIApplication *)application
    
    { 
      UIApplication *app = [UIApplication sharedApplication];
    
      UIBackgroundTaskIdentifier bgTask = 0;
    
      backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self   selector:@selector(backgroundTask) userInfo:nil repeats:YES];
    
      bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
      }];
    
    }
    

    现在在 backgroundTask 方法中做任何你想做的事情。

    【讨论】:

    • @Vish_Ob-j 它看起来可以重新运行,但就我阅读文件而言,Apple 不会让这种风格的代码出现在 App Store 中(我的意思是你的应用程序可能会被拒绝)此代码是否已被 App 批准商店?
    • @ilis - 我还没有将我的应用提交到 appStore。但这似乎是保持代码块在后台运行的唯一可能方法......
    • 但苹果没有这么说。我还记得这段代码的原始代码 sn-p,它可能用于位置或基于 Vo-IP 的应用程序(等等)。推送通知对于移动设备的编码和内存管理都更好。..
    • 是的,你是对的 ilis。就内存管理而言,推送通知实际上更好。但这取决于您的要求。如果您正在后台监听事件,那么您肯定应该使用推送通知。否则您也可以尝试本地通知..
    • 我将我的应用程序发送到 App Store 并激活了推送通知。它已经需要批准。 Here是它的应用商店链接。(它的界面不是很好,应用程序本身与截图不同:)
    猜你喜欢
    • 2018-01-21
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2023-01-13
    • 2012-05-10
    相关资源
    最近更新 更多