【问题标题】:Keeping an app alive in background unlimited (for a Cydia app)使应用程序在后台无限运行(对于 Cydia 应用程序)
【发布时间】:2011-12-24 21:18:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: iphone ios objective-c jailbreak cydia


    【解决方案1】:

    更新:

    此解决方案似乎不再足够(~ iOS 7+ 或 7.1+)。我将原始答案留作历史参考,以防它有助于基于这个过时的解决方案产生未来的解决方案:


    这取决于您所说的应用程序是什么意思。如果您谈论的是非图形背景服务,那么您需要的是启动守护程序。 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/)。

    【讨论】:

    • 非常欢迎。我很高兴最近发现了这个未记录的功能:)
    • 嗨 Nate,这真的很棒,但是我应该同时使用 continuous unboundedTaskCompletion 还是只使用其中一个?如果我希望应用程序永不退出,我应该使用哪一个?谢谢!
    • @Bob,这些都是无证,所以我不能肯定。但是,为越狱应用或未提交到 Apple 应用商店的应用添加 both 后台模式并没有什么坏处。我已经使用添加到 Info.plist 文件的 both 模式对此进行了测试,并且能够让我的应用程序只要我想要就保持活动状态(永不退出)。
    • 谢谢@Nate,我明白了:)。
    • @blueether,我不知道,没有。此外,这种技术通常在不久前停止工作(也许是 iOS 7?)。这可能仍然是工作解决方案的一部分,但现在需要更多的东西。几个月前我尝试寻找更好的替代品,但它们都有缺点。
    【解决方案2】:

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

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

    【讨论】:

    • 我需要它时不时地调用网络服务并处理系统回调(唤醒处理来电)
    • 好的,那么您正在寻找一个 MobileSubstrate dylib。您将需要挂钩 Telephony 框架,以及 Web 服务所需的其他方向。网上有大量的 MobileSubstrate 教程。如果你最终需要帮助,我的 S.O.个人资料有联系方式。
    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2011-09-11
    • 2023-03-28
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多