保持一个应用程序在无限的背景下活着(对于Cydia应用程序)

我不介意使用私人API或类似苹果不喜欢的东西,但宁愿快速的解决scheme,不喜欢在后台沉默或调整。

显然,这是不适用于应用程序商店,所以请不要讲课:)

那么你如何在没有任何限制的背景下运行,如“backgrounder”? 除了那些指向不同方向的人之外,我没有设法find答案,但也许从那时起,有人已经设法挖掘它。

根据你的“应用程序”将要做什么,你可以挂钩MobileSubstrate。 这将加载SpringBoard和本质上运行“在后台”。

如果你想写一个实际的应用程序,那么你也可以写一个“dynamic库”,它将被MobileBasstrate加载到SpringBoard中。 你可以使用NSNotificationCenter在这个dylib和你的应用程序之间来回交谈; 创build和发布通知。

更新:

这个解决scheme不再显得足够了(〜iOS 7+或7.1+)。 我将留下最初的答案作为历史参考,以及如果它有助于根据这个过时的方法产生未来的解决scheme:


这取决于你的意思应用程序 。 如果你正在谈论一个非graphics背景服务 ,那么你想要的是一个启动守护进程。 请参阅这里了解如何创build启动守护程序 。

如果您有一个正常的UI应用程序,但是当用户按下主页button时,您希望它在无限的时间内保持清醒状态, 那么您可以在应用程序的Info.plist文件中使用一些未公开的背景模式

 <key>UIBackgroundModes</key> <array> <string>continuous</string> <string>unboundedTaskCompletion</string> </array> 

然后,当iOS准备将您的应用程序置于后台时(例如,用户按下home键),您可以在应用程序委托中执行此操作:

 @property (nonatomic, assign) UIBackgroundTaskIdentifier bgTask; - (void)applicationDidEnterBackground:(UIApplication *)application { // Delay execution of my block for 15 minutes. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 15 * 60 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{ NSLog(@"I'm still alive!"); }); self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ // should never get here under normal circumstances [application endBackgroundTask: self.bgTask]; self.bgTask = UIBackgroundTaskInvalid; NSLog(@"I'm going away now ...."); }]; } 

通常情况下,iOS只会让您的UI应用程序在后台工作长达10分钟。 在没有logging的背景模式下,您可以保持超过10分钟的限制。

注意:这不需要与MobileSubstrate挂钩。 如果您使用的是第二种方法(无证背景模式),则需要在/Applications/安装您的应用/Applications/ ,而不是在普通的沙箱区域( /var/mobile/Applications/ )中。