我不介意使用私有 API 或 Apple 不喜欢的任何类型的东西,但更喜欢一种快速的解决方案,它不会像在后台播放静音或混音一样。
显然这不适用于应用商店,所以请不要讲课:)
那么如何在没有像“backgrounder”这样的限制的情况下在后台运行呢?除了一些将人们指向不同方向的答案之外,我没有设法找到答案,但也许从那时起有人设法将其挖掘出来。
我不介意使用私有 API 或 Apple 不喜欢的任何类型的东西,但更喜欢一种快速的解决方案,它不会像在后台播放静音或混音一样。
显然这不适用于应用商店,所以请不要讲课:)
那么如何在没有像“backgrounder”这样的限制的情况下在后台运行呢?除了一些将人们指向不同方向的答案之外,我没有设法找到答案,但也许从那时起有人设法将其挖掘出来。
此解决方案似乎不再足够(~ iOS 7+ 或 7.1+)。我将原始答案留作历史参考,以防它有助于基于这个过时的解决方案产生未来的解决方案:
这取决于你的意思app。如果您谈论的是非图形后台服务,那么您需要的是 Launch Daemon。 请参阅此处了解如何创建启动守护程序。
如果您有一个普通的 UI 应用程序,但是当用户按下主页按钮时,您希望它在后台无限期保持清醒,那么您可以在应用程序的 Info.plist 文件中使用一些未记录的背景模式:
<key>UIBackgroundModes</key>
<array>
<string>continuous</string>
<string>unboundedTaskCompletion</string>
</array>
然后,当 iOS 准备好将您的应用程序放入后台时(例如,用户按下主页按钮),您可以在您的应用程序委托中执行此操作:
@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 最多只给你 10 分钟让你的 UI 应用程序在后台工作。使用未记录的后台模式,您将能够在超过 10 分钟的限制后保持活力。
注意:这不需要与 MobileSubstrate 挂钩。如果您使用的是第二种方法(未记录的背景模式),则确实需要将您的应用程序安装在 中/Applications/
,而不是在普通沙箱区域 ( /var/mobile/Applications/
) 中。
根据您的“应用程序”要做什么,您可以挂钩 MobileSubstrate。这将加载 SpringBoard 并基本上“在后台”运行。
如果您想编写一个实际的应用程序,那么您还可以编写一个“动态库”,它将由 MobileSUbstrate 与 SpringBoard 一起加载。NSNotificationCenter
你可以使用;在这个 dylib 和你的应用程序之间来回交谈。创建和发布通知。