5

我不介意使用私有 API 或 Apple 不喜欢的任何类型的东西,但更喜欢一种快速的解决方案,它不会像在后台播放静音或混音一样。

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

那么如何在没有像“backgrounder”这样的限制的情况下在后台运行呢?除了一些将人们指向不同方向的答案之外,我没有设法找到答案,但也许从那时起有人设法将其挖掘出来。

4

2 回答 2

8

更新:

此解决方案似乎不再足够(~ 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/) 中。

于 2013-04-03T21:03:48.627 回答
2

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

如果您想编写一个实际的应用程序,那么您还可以编写一个“动态库”,它将由 MobileSUbstrate 与 SpringBoard 一起加载。NSNotificationCenter你可以使用;在这个 dylib 和你的应用程序之间来回交谈。创建和发布通知。

于 2011-12-24T21:25:18.093 回答