2011-11-28 3 views
8

私はバックグラウンドでオーディオを再生するiPhoneアプリを開発しています。ユーザーが画面をロックしてもオーディオは再生され続けますが、ホームボタンを押して別のアプリに切り替えると一時停止します。iOS5の画面ロックとホームボタンの押下を区別する方法は?

iOS 4では、画面がロックされているときに非アクティブ状態になり、ホームボタンが押された場合にのみバックグラウンドに移動するため、問題はありませんでした。画面がロックされているiOS 5では、アプリもバックグラウンドに移動するようになりました。そのため、2つの状態の違いを知ることはもはや不可能です。この問題の解決法はありますか?

+0

にコードスニペットを置くことができる任意のGoogle検索がiOS5を通知センターを返すので、これは厄介な問題です。理想的には、登録可能なシステム通知のリストを見つけることができます。何かがポップアップすることを願っています。 – Rich86man

+0

それに応じてオーディオセッションを設定している限り、OSはそれを世話します。私はオーディオプログラマーではない)。ドキュメントで「画面ロック」を検索すると、「オーディオセッションプログラミングガイド」(オーディオセッションクックブック)に役立つ情報が見つかります。 –

+0

[デバイスのロックとバックグラウンドへのアプリの送信を区別することはできますか?](http://stackoverflow.com/questions/7754317/is-it-possible-to-distinguish-between-locking-the -device-and-a-app-to-b) – Pang

答えて

1

この現象を起こす方法はありますが、注意が必要です。 Info.plistでオーディオバックグラウンドモードを設定し、アプリのマルチタスクを無効にする必要があります。 「必要なバックグラウンドモード」キーを追加し、あなたのInfo.plistファイルで

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &error]; 

と項目「アプリケーションがオーディオを再生する」を追加します。

はAVAudioSessionCategoryPlaybackにオーディオセッションのカテゴリを設定します。そして、キー「アプリケーションがバックグラウンドで実行されない」を追加し、それを設定し、「はい」に enter image description here

今ロック画面は、ホームボタンを押すと終了しますながら(オーディオが稼働し続ける)、オーディオ、バックグラウンドモードでアプリケーションを配置しますあなたのアプリ(およびオーディオを静かに)。ユーザーが別のアプリからアプリに戻ると、もう一度起動します。したがって、アプリの読み込みに時間がかかりすぎず、再起動後に元の状態に戻ることができれば、これは実行可能なソリューションかもしれません。

iOS 4.3およびiOS 5.0.1(デバイス上)でテストしました。

+2

残念ながら、この設定はAppleの検証ルーチンに矛盾しています。私のアプリを検証するために行ったとき、次のような問題がありました。「UIApplicationExitsOnSuspendの値がYesの場合、UIBackgroundModesキーに値を指定してはいけません。アプリケーションがバックグラウンドサービスを使用する場合、UIApplicationExitsOnSuspendの値はNoでなければなりません。情報については、「情報プロパティーリストのキーリファレンス」を参照してください。 – adamcohenrose

+0

あまりにも悪いです。とにかくちょっとしたハックだった –

14

のプロパティを確認することで、これら2つのケースを区別できます。applicationStateロック画面のために背景を入力したアプリケーションの場合はUIApplicationStateInactiveに設定され、それ以外の場合はUIApplicationStateBackgroundに設定されます。

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIApplicationState state = [application applicationState]; 
    if (state == UIApplicationStateInactive) { 
     NSLog(@"Sent to background by locking screen"); 
    } else if (state == UIApplicationStateBackground) { 
     NSLog(@"Sent to background by home button/switching to other app"); 
    } 
} 
5

applicationDidEnterBackgroundが起動されたときのUIApplicationStateのLoookingがうまく機能しました。残念ながら、これは今変更されました。

すべてのiOS7のものをサポートするためにXCode5でアプリケーションをコンパイルすると(ただしビルドターゲットは5.0に設定されています)、以前はUIApplicationStateInactiveを取得した時点でロック画面で状態UIApplicationStateBackgroundが得られます。

私はこれをAppleのサポートから頼んで、確認しました。これはこれからどのように動作するかです。したがって、ユーザーがホームまたはスクリーンロックを押したかどうかを検出する方法はありません。私はそれを検出するための本当に良いユースケースを持っていたので、これは悲しいことです。

PS。 XCode 4でビルドされた私のアプリは、iOS7で動作していても古い方法で動作します。

+0

あなたのデベロッパーフォーラムポストへのリンクを追加できますか?アクセス可能な人には便利です。 – Abizern

4

私はこのことを行うより良い方法を発見しました。

Differentiate between screen lock and home button press on iOS7

これはiOS5を& iOS6 & iOS7デバイス:)であなたの両方を助けることができる。しかし、それは、iOSシミュレータでは動作しません。

[[UIApplication sharedApplication] applicationState]は、iOS7より前にUIApplicationStateInactiveUIApplicationStateBackgroundでロック画面かホームボタンかを判断することができます。

しかし、これらはiOS7の同じ状態UIApplicationStateBackgroundになり、画面の明るさで判断できます。

ロック画面の状態では、画面の明るさは0にする必要があります。それ以外の場合は、ホームボタンの状態です。

あなたは- (void)applicationDidEnterBackground:(UIApplication *)application

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIApplicationState state = [[UIApplication sharedApplication] applicationState]; 
    if (state == UIApplicationStateInactive) { 
     NSLog(@"Sent to background by locking screen"); 
    } else if (state == UIApplicationStateBackground) { 
     CGFloat screenBrightness = [[UIScreen mainScreen] brightness]; 
     NSLog(@"Screen brightness: %f", screenBrightness); 
     if (screenBrightness > 0.0) { 
      NSLog(@"Sent to background by home button/switching to other app"); 
     } else { 
      NSLog(@"Sent to background by locking screen"); 
     } 
    } 
} 

+0

これはiOS5でも動作しますか?その場合、私はあなたの答えを編集することをお勧めします。また、ポストの編集でコードが何をしているかについて少し説明できますか?最高のスタックオーバーフローの答えは、コードを表示するだけでなく、説明も提供します。あなたがそれを行うことができれば、編集された投稿が投票の変更の対象となるので、私はこのdownvoteを削除することができます。 dupの投稿については、この記事にマージされるかもしれないと思うし、少数の人々がそれにフラグを立てたので、それ自体は機能します。これが役に立ったら、Stack Overflowへようこそ! :) – jmort253

+0

@ jmort253私はそれを変更しました、それは多分私の英語でいくつかの間違いです。 – wqq

+0

文法を手助けするために編集しました。お役に立てれば! :) – jmort253

関連する問題