web-dev-qa-db-ja.com

バックグラウンドでアプリを10分以上実行する

IOSアプリがバックグラウンド状態になったときに10分以上アクティブ状態に維持しようとしています。

どうすればこれを実装できますか。

46
user968597

iPhoneAppProgrammingGuide の「バックグラウンド実行」セクションを参照してください。つまり、アプリは次のいずれかのタイプである必要があります。

  • ミュージックプレーヤーアプリなど、バックグラウンドでユーザーに音声コンテンツを再生するアプリ
  • ナビゲーションアプリなど、ユーザーに常に現在地を通知するアプリ
  • Voice over Internet Protocol(VoIP)をサポートするアプリ
  • 新しいコンテンツをダウンロードして処理する必要があるニューススタンドアプリ
  • 外部アクセサリから定期的な更新を受け取るアプリ

そして、次のようにInfo.plistに追加する必要があります。Info.plistファイルにUIBackgroundModesキーを追加し、次の文字列を1つ以上含む配列に値を設定します。

  • オーディオ-アプリはバックグラウンドでユーザーに音声コンテンツを再生します。 (このコンテンツには、AirPlayを使用したスト​​リーミングオーディオまたはビデオコンテンツが含まれます。)
  • 場所-アプリは、バックグラウンドで実行されている場合でも、ユーザーに現在地を通知し続けます。
  • voip-アプリは、ユーザーがインターネット接続を使用して電話をかける機能を提供します。
  • newsstand-content—アプリは、バックグラウンドで雑誌や新聞のコンテンツをダウンロードして処理するNewsstandアプリです。
  • 外部アクセサリ-アプリは、外部アクセサリフレームワークを介して定期的なスケジュールで更新を配信する必要があるハードウェアアクセサリで動作します。
  • bluetooth-central —アプリは、CoreBluetoothフレームワークを介して定期的に更新を配信する必要があるBluetoothアクセサリと連携して動作します

レビュープロセスの一部は、アプリがバックグラウンド処理に関して行っていることをアプリが実行することを確認するためにチェックすることに注意してください。

56
Brian Cooley

beginBackgroundTaskWithExpirationHandler を使用して行ったことを次に示します。

  • バックグラウンドタスクを開始するメソッドを記述します。
  • バックグラウンドタスク内で、10分未満のスケジュールされた(繰り返しのない)時間でNSTimerを実行します。私の状況のた​​めに、私は5分を使用していました。
  • NStimerのセレクターが起動したら、バックグラウンドタスクを終了し、前に作成したメソッドをすぐに呼び出して別のバックグラウンドタスクを開始します。
  • メソッドを特定の時間に実行するようにスケジュールする場合は、バックグラウンドタスクでメソッドを確認する必要があります。

このソリューションは実際には理想的ではなく、依然として電力を消費しますが、必要な処理を行います。

編集:iOS7以降、これを読むことをお勧めします 優秀な投稿

20
ingh.am

このコードにより、iOSアプリがバックグラウンドで無期限に実行されます。以下のメソッドをコピーして、バックグラウンドで実行する必要があるタスクを処理するシングルトン/マネージャーに貼り付けます。

// @interface

// Declare Private property
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;

//@end
// ...

// Copy into
//@implementation 

- (void)setupBackgrounding {
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appBackgrounding:)
                                                 name: UIApplicationDidEnterBackgroundNotification
                                               object: nil];
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appForegrounding:)
                                                 name: UIApplicationWillEnterForegroundNotification
                                               object: nil];
}

- (void)appBackgrounding: (NSNotification *)notification {
    [self keepAlive];
}

- (void) keepAlive {
    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
        [self keepAlive];
    }];
}

- (void)appForegrounding: (NSNotification *)notification {
    if (self.backgroundTask != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }
}
2
rismay

特定の種類のアプリのみがバックグラウンドで実行できます。 このガイド の「長時間実行されるバックグラウンドタスクの実装」セクションを参照してください。

バックグラウンド処理を行う許可を要求していない場合は、UIApplicationの beginBackgroundTaskWithExpirationHandler を使用できますが、余分な時間を取得することはできません。

2
CJ Foley

https://github.com/yarodevuci/backgroundTask ここでコードを確認してください空のwavファイルを再生するオーディオプレーヤーを使用していますIOS 8バッテリー使用量約10 24時間の割合%使用方法:

var backgroundTask = BackgroundTask()
backgroundTask.startBackgroundTask() //Starts playing blank audio file. You can run NSTimer() or whatever you need and it will continue executing in the background.

backgroundTask.stopBackgroundTask() //Stops the task

警告:Appleは、送信しようとするとこれを拒否します!

1
Maksim Kniazev

アプリの種類がVOIP/Audio/Location ....のいずれでもない場合...(チェック Background Modes )、

または、アプリをバックグラウンドアプリとして指定したくない場合は、beginBackgroundTaskWithName:expirationHandlerまたはbeginBackgroundTaskWithExpirationHandlerを実装できますプロセスをバックグラウンドで実行するためのより多くの時間を要求します。詳細な説明があります こちら

バックグラウンドに移行するアプリは、システムによって一時停止できるように、できるだけ早く静止状態になることが期待されています。アプリがタスクの途中にあり、そのタスクを完了するのに少し余分な時間が必要な場合、UIApplicationオブジェクトのbeginBackgroundTaskWithName:expirationHandler:またはbeginBackgroundTaskWithExpirationHandler:メソッドを呼び出して、追加の実行時間を要求できます。これらのメソッドのいずれかを呼び出すと、アプリの一時停止が遅延し、作業を完了するための少し余分な時間が与えられます。その作業が完了すると、アプリはendBackgroundTask:メソッドを呼び出して、システムに終了して中断できることを通知する必要があります。

BeginBackgroundTaskWithName:expirationHandler:またはbeginBackgroundTaskWithExpirationHandler:メソッドを呼び出すたびに、対応するタスクに関連付ける一意のトークンが生成されます。アプリがタスクを完了すると、対応するトークンでendBackgroundTask:メソッドを呼び出して、タスクが完了したことをシステムに通知する必要があります。バックグラウンドタスクのendBackgroundTask:メソッドの呼び出しに失敗すると、アプリが終了します。タスクの開始時に有効期限ハンドラーを提供した場合、システムはそのハンドラーを呼び出し、タスクを終了して終了を回避する最後の機会を提供します。

0
User9527

できません。アプリでオーディオ、VoIP、GPSを使用している場合を除きます。できることは、時間が近づいていることをユーザーに通知し(ローカル通知を介して)、アプリを開閉するようにユーザーに要求することです。

また、ユーザーに通知するだけの場合は、プッシュ通知を使用できます。

0
fbernardo