iPhoneがスタンバイモードになると、iPhoneアプリはどうなりますか?

StackOverflow https://stackoverflow.com/questions/411436

  •  03-07-2019
  •  | 
  •  

質問

私のアプリはNSTimerを使用していますが、iPhoneがスタンバイモードになったとき(ハードウェアボタンを押すかアイドルタイマーによって)NSTimerが起動しないようです。

iPhoneを再度アクティベートしても、アプリはまだフォアグラウンドにあります。 iPhoneがスタンバイモードの場合、サードパーティのアプリはどうなりますか?

役に立ちましたか?

解決

ここでは明白ではありませんが、元のポスターはスレッドを開始することで彼の質問に対する答えを見つけたと思います(こちら)をiPhoneデベロッパーフォーラムで入手できます(情報がここで共有されなかったため、最終的に自分自身を見つける必要がありました)。

他の誰かが同じ質問をして、将来ページを見つけた場合、「eskimo1」と呼ばれるAppleフォーラムに誰かが投稿した有用な回答があります。 (元のスレッド全体でコンテキストが提供されなくても読みやすいように、少し編集しました):

  • iPhoneアプリのステータスの用語については、「アクティブ」 「アウェイク」を意味するのではなく、「GUIにアタッチ」を意味します。 「最前部」に類似していると考えてください。 Mac OS Xで。デバイスをロックすると、アプリは非アクティブになりますが、デバイスはスリープ状態になる場合とスリープ状態にならない場合があります
  • デバイスが主電源に接続されている場合(USB経由など)、iPhone OSがスリープすることはほとんどありません。ただし、バッテリーで実行している場合はスリープできます。
  • 画面がロックされてからしばらくすると(Oliver Drobnikによると20秒)、デバイスはスリープします。これはラップトップの蓋を閉めるようなものです。メインCPU上のすべてのアクティビティが停止します。
  • これは、デバイスが正しいオーディオセッションでオーディオを再生している場合には発生しません。 DTS Q& A QA1626"オーディオセッション-画面が表示されたときにオーディオ再生を継続する詳細についてはをロックします。
  • idleTimerDisabledプロパティ(アプリの実行中に画面がオフにならないようにオンにできる)は、ユーザーが非アクティブになった後に画面をロックすることに関するものであることに注意してください。システムのスリープとは直接関係ありません(ロックされた直後にシステムがスリープする可能性があるという点で間接的に関係しています)。

他のヒント

iPhone OSプログラミングガイドアプリケーションの中断、特に applicationWillResignActive および applicationDidBecomeActive イベントを参照してください。 (ガイド全体を読むことは確かに読む価値があります。)イベントを無視すると、タイマーはしばらく続いたように見え、その後停止します。論理的に聞こえますが、実行し続けると、アプリケーションは簡単にバッテリーを消耗する可能性があります。そして、アプリケーションはどうなりますか? CPU時間をまったく取得していないと思います–マシンを元に戻したときにのみフリーズおよび解凍します“オン。”

最初のアドバイスは、アイドルタイマーを無効にしないことです。これは単なるハックです。 UIイベント中にタイマーを保持したい場合は、NSCommonModesを使用して現在の実行ループでタイマーを実行します。

// create timer and add it to the current run loop using common modes

self.timer = [NSTimer timerWithTimeInterval:.1 target:self selector:@selector(handleTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

この投稿の情報を、作成中の小さなサンプルに使用しました。これは、オーディオが停止しないように再生を開始したときに使用したコードです。

AudioSession.Category = AudioSessionCategory.MediaPlayback;

そして、アプリケーションが元の値にリセットするための再生が完了したら:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

完全なサンプルはこちら:

http://github.com/migueldeicaza/monotouch-samples/ tree / master / StreamingAudio /

最近いくつかのタイマーを使用し、オーディオプロンプトを再生し、2つの比較的単純な変更を加えた作業中のアプリでこの問題に直面しました:

  1. AppDelegate で次のメソッドを実装しましたが、画面がロックされていてもアプリが存在し続けることができます

    // this receives the notification when the device is locked
    - (void)applicationWillResignActive:(UIApplication *)application
    { 
    }
    
    // this receives the notification that the application is about to become active again
    - (void)applicationWillBecomeActive:(NSNotification *)aNotification
    {
    }
    

    references: UIApplicationDelegate Protocol Reference & APIの NSApplicationクラスリファレンス doc(Xcodeからアクセス可能、 applicationWillBecomeActive を検索するだけです)。

  2. メインの viewcontroller クラスを AVAudioPlayerDelegate にし、Appleの" AddMusic"のこのコードを使用しました。アプリが再生したオーディオアラートをiPodオーディオなどにうまくミックスするためのサンプル...

    このコードをviewDidLoad中に呼び出されるメソッドにドロップしました。これに興味がある場合は、「このドキュメントを読む人」に該当します。このカテゴリ:オーディオセッションプログラミングガイド

    // Registers this class as the delegate of the audio session.
    [[AVAudioSession sharedInstance] setDelegate: self];
    
    // The AmbientSound category allows application audio to mix with Media Player
    // audio. The category also indicates that application audio should stop playing 
    // if the Ring/Siilent switch is set to "silent" or the screen locks.
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
    
    // Activates the audio session.
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];
    

アプリケーションは、中断されたときに正常に動作するはずです。 (Pandora Radioを考えてください)

ビューが非表示になっているか、その他のイベントが発生したためにタイマーが割り当て解除されているかどうかを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top