在iOS中,我怎么会指示OS,以保持我的应用程序运行,即使是在前景不再?
- Skype的
- Viber的
- 感情移入的
- Zenly
还有更多的应用程序做到这一点。
在iOS中,我怎么会指示OS,以保持我的应用程序运行,即使是在前景不再?
还有更多的应用程序做到这一点。
基本上没有在iOS的服务类型的应用程序或功能没有这样的事情。 即使是“背景”的应用程序(UIBackgroundMode)不能完全自由地,不受上可以其它操作系统像服务或守护程序限制等运行。
下面是关于后台执行,并通知和定时器等情况
1)应用程序不能在后台执行,除非:
一)它向OS额外的时间来做到这一点。 这是使用beginBackgroundTaskWithExpirationHandler完成。 它没有指定(故意)苹果这一额外的时间有多长,但是在实践中是10分钟左右。
b)一种应用程序有一个背景模式中,模式是:网络电话,音频,位置,书报摊。 即使有这些类型的应用程序不能无限制地执行之一。 本次讨论的其余部分假定应用程序没有后台模式。 如果您尝试使用这些背景模式之一,以使您的应用程序能够在后台运行的,但你的应用程序不进行合法使用的特定功能,那么您的应用程序将在应用程序商店提交被拒绝(即有UIBackgroundMode它必须是:一个VOIP应用,需要有持续的位置更新,在后台播放音频的能力不断是一个基本特征,或者是书报摊应用程序)。
2)当一个应用程序被暂停它不能做任何事来直接唤醒本身。 它不能事先已经安排一个NSTimer,它不能利用类似performSelector:afterDelay。 等等
只有这样应用程序可以活跃起来是如果用户确实的东西将其激活。 用户可以从通过下面的做到这一点:
a)直接向它的图标启动该应用
b)中启动该应用响应于先前由应用程序调度,而这是有活性的本地通知。
c)中启动该应用响应于由服务器发送的远程通知。
d)还有几个国家:比如,如果应用程序注册到处理通过URL启动URL启动; 或者,如果其注册到有能力处理特定类型的内容。
如果一个应用程序在前台运行时的本地/远程通知火灾然后应用程序直接接收它。
如果应用程序是不是当前在前台当本地/远程通知火灾然后应用程序不会收到它。 有没有被通知触发时执行的代码!
只有当用户选择通知将应用程序变得活跃,它可以执行。
需要注意的是,用户可以禁用通知,无论是对整个设备,或只为特定的应用程序,在这种情况下,用户将不会看到它们。 如果设备被关闭时,通知是因火灾则丢失。
1)有一些新的背景模式,如背景取(你仍然不能被操作系统以确定方式激起不过)
2)现在有一个后台推送通知
3)beginBackgroundTaskWithExpirationHandler时间为10分钟减少到大约3。
现在情况在改变iOS7, 这是测试版了 。
从苹果的开发者门户 :
保持你的应用程序的内容最新采用iOS中7新的API的多任务新服务可以让您的应用程序更新信息,并在后台下载内容而无需不必要地耗尽电池。 该更新可以在机会的时间内发生,并根据使用的智能调度,所以就在你的用户需要你的应用程序可以更新在后台内容。
是的,我们能做到这一点,
创建一个私有字段来跟踪我们的地位:
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;
}
}