相当于Android服务的iOS?

所以iOS 7支持更广泛的背景模式,是否有可能在iOS上终于有一个相当于Android的服务?

我所追求的基本上是在后台运行应用程序A,并有一个或多个应用程序B和C与该应用程序交谈(不显示应用程序A的GUI)。

请注意,使用连接和推送通知可能不是一个选项,虽然这是推荐的方式。 有任何想法吗?

编辑:不按预期工作。 请参阅此答案以获得最佳解决scheme: 推送通知


编辑:下一个解决scheme只有当用户在应用程序,以保持它同步有用。

没有办法在后台执行任务永久,但你可以使用有限长度的任务来做到这一点,当你做一个有限的长度,这将始终运行,而应用程序是活动的,但是当你点击主页button, ios只给你10分钟来执行你的任务并使其无效,但是它给了你一个机会来做一个“无效处理程序块”,你可以在完成之前做最后的动作。

因此,如果您使用该处理程序块在其他时间调用有限长度的任务,则可以通过运行一个任务10分钟来模拟一个服务,并在其结束时调用另一个10分钟的服务,因此。

我在创build接口“服务”的项目中使用它。 我让你在这里的代码:


  • Service.h

// // Service.h // Staff5Personal // // Created by Mansour Boutarbouch Mhaimeur on 30/09/13. // Copyright (c) 2013 Smart & Artificial Technologies. All rights reserved. // #import <Foundation/Foundation.h> @interface Service : NSObject @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; @property (nonatomic) NSInteger frequency; @property (nonatomic, strong) NSTimer *updateTimer; - (id) initWithFrequency: (NSInteger) seconds; - (void) startService; - (void) doInBackground; - (void) stopService; @end 

  • Service.m

 // // Service.m // Staff5Personal // // Created by Mansour Boutarbouch Mhaimeur on 30/09/13. // Copyright (c) 2013 Smart & Artificial Technologies. All rights reserved. // #import "Service.h" @implementation Service @synthesize frequency; -(id)initWithFrequency: (NSInteger) seconds{ if(self = [super init]){ self.frequency = seconds; return self; } return nil; } - (void)startService{ [self startBackgroundTask]; } - (void)doInBackground{ //Español //Sobreescribir este metodo para hacer lo que quieras //English //Override this method to do whatever you want } - (void)stopService{ [self.updateTimer invalidate]; self.updateTimer = nil; [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; } - (void) startBackgroundTask{ self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:frequency target:self selector:@selector(doInBackground) userInfo:nil repeats:YES]; self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [self endBackgroundTask]; }]; } - (void) endBackgroundTask{ [self.updateTimer invalidate]; self.updateTimer = nil; [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; [self startBackgroundTask]; } @end 

有了这个class级,我执行我的服务,但我不testing它很长一段时间。 我做的最好的testing在模拟器中持续了16个小时,一切正常!

编辑:这是在模拟器上testing,但在手机应用程序已终止之后不起作用。

我让你举个例子:


 // SomeService.h @interface SomeService : Service @end // SomeService.m #import "SomeService.h" @implementation SomeService // The method to override - (void)doInBackground{ NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining); NSLog(@"Service running at %.1f seconds", [self getCurrentNetworkTime]); } // Your methods - (long) getCurrentNetworkTime{ return ([[NSDate date] timeIntervalSince1970]); } @end 

而在您的应用程序委托或您需要提高服务的地方,您可以写下一行:

 Service myService = [[SomeService alloc] initWithFrequency: 60]; //execute doInBackground each 60 seconds [myService startService]; 

如果你需要阻止它:

 [myService stopService]; 

可能已经解释了超过必要,但我想保持清楚的任何人! 我希望它的帮助和对我的英语感到抱歉。

不,没有相当于一个Android服务。 MansApps代码不起作用,至less在iOS7上不行。 调用[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; 在过期处理程序将只返回时,应用程序回到前台,即, [self startBackgroundTask];的调用[self startBackgroundTask]; 当应用程序停留在后台时不会执行。

我find了最好的和标准的解决scheme:

推送通知

(Matthijs Hollemans的原始文章,由Ali Hafizji更新)。

在iOS中,应用程序不能在后台做很多事情。 应用程序只允许进行有限的一系列活动,以便节省电池寿命。 但是如果发生了一些有趣的事情,并且希望让用户知道这一点,即使他们目前还没有使用你的应用程序呢? 例如,也许用户收到了新的推特,他们最喜欢的团队赢了比赛,或者他们的晚餐已经准备好了。 由于该应用程序当前未运行,因此无法检查这些事件。 幸运的是,苹果已经提供了一个解决scheme。 而不是你的应用程序不断检查事件或在后台工作,你可以编写一个服务器端组件来做到这一点。 当发生关注事件时,服务器端组件可以向应用程序发送推送通知推送通知可以做三件事情:

  • 显示一条简短的文字信息
  • 播放简短的声音
  • 在应用程序图标上的徽章中设置一个数字

教程链接: http : //maniacdev.com/2011/05/tutorial-ios-push-notification-services-for-beginners

基本上这是不可能的,如果你的应用程序没有实现下面列出的任何function。 他们很难调查你的应用程序,然后上传到商店,你需要certificate使用该权限

这就是苹果所说的:

实施长期任务

对于需要更多执行时间来执行的任务,您必须请求特定的权限才能在后台运行它们,而不会被暂停。 在iOS中,只有特定的应用程序types才能在后台运行:

  • 在后台播放可听内容的应用,例如音乐播放器应用
  • 在后台录制audio内容的应用程序
  • 随时向用户通知其位置的应用,例如导航应用
  • 支持网际协议语音(VoIP)的应用
  • 需要定期下载和处理新内容的应用程序
  • 从外部附件获得定期更新的应用程序

实现这些服务的应用程序必须声明它们支持的服务,并使用系统框架来实现这些服务的相关方面。 声明这些服务可以让系统知道你使用了哪些服务,但是在某些情况下,系统框架确实会阻止你的应用程序被挂起。