保持应用程序在后台无限制存活(对于Cydia应用程序)

Zak*_*man 4 iphone objective-c cydia jailbreak ios

我不介意使用私有API或Apple不喜欢的任何类型,但更喜欢快速的解决方案,不像在后台播放沉默或调配.

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

那么你如何在没有任何限制的情况下在后台运行,比如"背景"?除了一些将人们指向不同方向的答案之外,我没有找到答案,但也许从那以后有人设法将其挖掘出来.

Nat*_*ate 8

更新:

此解决方案似乎不再足够(~iOS 7+或7.1+).我将离开原始答案以供历史参考,如果它有助于根据这个过时的方法生成未来的解决方案:


这取决于你的app是什么意思.如果您正在谈论非图形背景服务,那么您想要的是一个Launch Daemon. 请参阅此处了解如何创建启动守护程序.

如果您有一个普通的UI应用程序,但是当用户按下主页按钮时,您希望它在后台保持无限时间处于唤醒状态,那么您可以在应用程序的Info.plist文件中使用一些未记录的背景模式:

<key>UIBackgroundModes</key>
<array>
    <string>continuous</string>
    <string>unboundedTaskCompletion</string>
</array>
Run Code Online (Sandbox Code Playgroud)

然后,当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 ....");
    }];
}
Run Code Online (Sandbox Code Playgroud)

通常,iOS仅为您提供最多10分钟的UI应用程序才能在后台运行.使用未记录的背景模式,您将能够保持超过10分钟的限制.

注意:这并没有要求与MobileSubstrate有挂钩.如果您正在使用第二种方法(未记录的背景模式),那么它确实需要安装您的应用程序/Applications/,而不是在正常的沙箱区域(/var/mobile/Applications/).


Wri*_*sCS 2

根据您的“应用程序”要执行的操作,您可以挂钩 MobileSubstrate。这将加载 SpringBoard 并本质上“在后台”运行。

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