5

プライベート API や、Apple が好まない種類のものを使用することは気にしませんが、バックグラウンドで無音を再生したり、スウィズルしたりするようなものではない迅速な解決策を好みます。

明らかに、これはアプリストア向けではないので、レクチャーしないでください:)

では、「バックグラウンダー」のような制限なしにバックグラウンドで実行するにはどうすればよいでしょうか? 人々を別の方向に向けるいくつかの答えを除いて、私はなんとか答えを見つけることができませんでしたが、おそらくそれ以来、誰かがそれを掘り起こすことができました.

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 では、UI アプリケーションがバックグラウンドで動作するのに最大 10 分しか与えられません。文書化されていないバックグラウンド モードを使用すると、10 分の制限を超えて生き続けることができます。

注:これには、MobileSubstrate をフックする必要はありません。2 番目の方法 (文書化されていないバックグラウンド モード) を使用している場合は、通常のサンドボックス領域 ( ) ではなく、 にアプリをインストールする必要あります。/Applications//var/mobile/Applications/

于 2013-04-03T21:03:48.627 に答える
2

「アプリ」が何をするかによって、MobileSubstrate をフックできます。これは SpringBoard でロードされ、基本的に「バックグラウンドで」実行されます。

実際のアプリケーションを作成する場合は、MobileSUBstrate によって SpringBoard に読み込まれる「動的ライブラリ」を作成することもできます。NSNotificationCenter;を使用して、この dylib とアプリの間でやり取りできます。通知の作成と投稿。

于 2011-12-24T21:25:18.093 に答える