我不介意使用私有API或Apple不喜欢的任何类型,但更喜欢快速的解决方案,不像在后台播放沉默或调侃。
显然这不适用于应用商店,所以请不要讲课:)
那么你如何在没有任何限制的情况下在后台运行,例如“backgrounder”?我没有找到答案,除了一些人指向不同的方向,但也许从那以后有人设法挖掘它。
答案 0 :(得分:8)
此解决方案似乎不再足够(~iOS 7+或7.1+)。我将离开原始答案以供历史参考,如果它有助于根据这个过时的方法生成未来的解决方案:
这取决于 app 的含义。如果您正在谈论非图形背景服务,那么您需要的是启动守护程序。 See here for how to create a launch daemon
如果您有一个普通的UI应用程序,但是当用户按下主页按钮时,您希望它在后台保持清醒无限时间,then you can use some undocumented Background Modes in your app's Info.plist file:
<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/
)。< / p>
答案 1 :(得分:1)
根据您的“app”要做的事情,您可以挂钩MobileSubstrate。这将加载SpringBoard并基本上“在后台”运行。
如果你想编写一个实际的应用程序,那么你也可以编写一个“动态库”,它将由MobileSUbstrate加载SpringBoard。您可以使用NSNotificationCenter
在此dylib和您的应用之间来回通话;创建和发布通知。