iOS版:保持一个应用程序运行像一个服务iOS版:保持一个应用程序运行像一个服务(iOS: Keep

2019-06-17 09:51发布

在iOS中,我怎么会指示OS,以保持我的应用程序运行,即使是在前景不再?

  • Skype的
  • Viber的
  • 感情移入的
  • Zenly

还有更多的应用程序做到这一点。

Answer 1:

基本上没有在iOS的服务类型的应用程序或功能没有这样的事情。 即使是“背景”的应用程序(UIBackgroundMode)不能完全自由地,不受上可以其它操作系统像服务或守护程序限制等运行。

下面是关于后台执行,并通知和定时器等情况

1)应用程序不能在后台执行,除非:

一)它向OS额外的时间来做到这一点。 这是使用beginBackgroundTaskWithExpirationHandler完成。 它没有指定(故意)苹果这一额外的时间有多长,但是在实践中是10分钟左右。

b)一种应用程序有一个背景模式中,模式是:网络电话,音频,位置,书报摊。 即使有这些类型的应用程序不能无限制地执行之一。 本次讨论的其余部分假定应用程序没有后台模式。 如果您尝试使用这些背景模式之一,以使您的应用程序能够在后台运行的,但你的应用程序不进行合法使用的特定功能,那么您的应用程序将在应用程序商店提交被拒绝(即有UIBackgroundMode它必须是:一个VOIP应用,需要有持续的位置更新,在后台播放音频的能力不断是一个基本特征,或者是书报摊应用程序)。

2)当一个应用程序被暂停它不能做任何事来直接唤醒本身。 它不能事先已经安排一个NSTimer,它不能利用类似performSelector:afterDelay。 等等

只有这样应用程序可以活跃起来是如果用户确实的东西将其激活。 用户可以从通过下面的做到这一点:

a)直接向它的图标启动该应用

b)中启动该应用响应于先前由应用程序调度,而这是有活性的本地通知。

c)中启动该应用响应于由服务器发送的远程通知。

d)还有几个国家:比如,如果应用程序注册到处理通过URL启动URL启动; 或者,如果其注册到有能力处理特定类型的内容。

如果一个应用程序在前台运行时的本地/远程通知火灾然后应用程序直接接收它。

如果应用程序是不是当前在前台当本地/远程通知火灾然后应用程序不会收到它。 有没有被通知触发时执行的代码!

只有当用户选择通知将应用程序变得活跃,它可以执行。

需要注意的是,用户可以禁用通知,无论是对整个设备,或只为特定的应用程序,在这种情况下,用户将不会看到它们。 如果设备被关闭时,通知是因火灾则丢失。

更新IOS 7

1)有一些新的背景模式,如背景取(你仍然不能被操作系统以确定方式激起不过)

2)现在有一个后台推送通知

3)beginBackgroundTaskWithExpirationHandler时间为10分钟减少到大约3。



Answer 2:

现在情况在改变iOS7, 这是测试版了

从苹果的开发者门户 :

保持你的应用程序的内容最新采用iOS中7新的API的多任务新服务可以让您的应用程序更新信息,并在后台下载内容而无需不必要地耗尽电池。 该更新可以在机会的时间内发生,并根据使用的智能调度,所以就在你的用户需要你的应用程序可以更新在后台内容。



Answer 3:

是的,我们能做到这一点,

创建一个私有字段来跟踪我们的地位:

UIBackgroundTaskIdentifier _bgTask;

现在,调用此方法,来运行你的应用程序像服务

if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) 
{
   _bgTask = UIBackgroundTaskInvalid;
   [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doBackground:)
name:UIApplicationDidEnterBackgroundNotification object:nil];
}

现在创建一个selector-

- (void) doBackground:(NSNotification *)aNotification
{
   UIApplication *app = [UIApplication sharedApplication];

   if ([app respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)])
   {
      _bgTask = [app beginBackgroundTaskWithExpirationHandler:^
      {
         dispatch_async(dispatch_get_main_queue(), ^
         {
            if (_bgTask != UIBackgroundTaskInvalid)
            {
               [app endBackgroundTask:_bgTask];
               _bgTask = UIBackgroundTaskInvalid;
            }
         });
      }];
   }
}

当你完成你的任务,请拨打代码 -

UIApplication *app = [UIApplication sharedApplication];
if ([app respondsToSelector:@selector(endBackgroundTask:)]) 
{
   if (_bgTask != UIBackgroundTaskInvalid)
   {
      [app endBackgroundTask:_bgTask];
      _bgTask = UIBackgroundTaskInvalid;
   }
}


文章来源: iOS: Keep an app running like a service