web-dev-qa-db-ja.com

サイレントモードでiOS 6にロックされているときにオーディオの再生を開始するにはどうすればよいですか?

エンドユーザープロセス

  1. アプリを開く
  2. 「サイレントモード」をオンにします。
  3. 「ロックボタン」を押す
  4. アプリは、数時間経過してもサウンドの再生を開始できますが、途中でオーディオを再生することはできません。

これを行うアプリ

多くのアラームアプリはこれをなんとか実現しており、実際に家でアプリを終了しても音が出ないため、アプリを実行し続けるために無音のオーディオを使用しているとは思いません。

  • 目覚まし時計Pro
  • 私の時計
  • ウェーブアラーム
  • 驚いた
  • iHome
  • ...

...ロックされた後、ループを実行し続けていますか、それとも通知(無音ではサウンドを再生できません)を開始してアプリを起動してオーディオを再生しますか、それとも他の方法ですか?

現在実装されているメソッド

AVAudioPlayerを使用:

AudioSessionInitialize(nil, nil, nil, nil);
AudioSessionSetActive(YES);

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),&sessionCategory);

そして、Info.plistを次のように設定します。

必要なバックグラウンドモード(UIBackGroundModes)-アプリはオーディオ(オーディオ)を再生します

現在のところ

アプリの実行中や画面上で、無音でも音声を再生できます。オーディオが既に実行されている場合、アプリをホームボタンで閉じることができ、オーディオが実行されます。ただし、アプリがオーディオを再生しておらず、画面がロックされている場合、すべてのスレッドが強制終了され、オーディオは再生されません。これらのアプリはどのようにしてこれを回避しますか?

これまでに見つかった可能なアプローチ

A。アプリを無期限に実行し続けるには、無限ループで 'beginBackgroundTaskWithExpirationHandler:'を使用します。

長所:

  • ユーザーが家を押したときでも、多くの状況でこれを機能させることができるようです。

短所:

  • これは、私が知る限り、Appleポリシーに違反します。
  • より多くのリソースを使用します

コメント:

私はこれを動作させるためにほとんど持っており、多少の調整が必要かもしれません。これは、ホームBTNを押しても実行されないため、他のすべてのアラームが行っていることではないようです。これは、ロックされているがBG内ではないときに実行する許可を与える方法を使用していることを示唆しています。 (これが私が必要とするものです)

また、ランニングの残り時間を尋ねると、約10分です。無限ループをそこにドロップすることにより、数値は実際には0まで減少し、その後、数時間にわたって負の値になります。

B。サイレントオーディオループを使用して、連続オーディオ再生メディアセンターを装う

長所:

  • ロックされているときに動作し、ほとんどの状況で実行し続けます。

短所:

  • 別のメディアセンターによって中断された場合やその他の場合に失敗する可能性があります。
  • また行くことができますAppleポリシー。

コメント:

これは多くの状況で機能しますが、理想的とは言えません。そして、私が再び言うように、文書化されていない別の方法がなければなりません。

これまでの結論

リストされたアプリを使用したテストは、先ほど説明した2つの方法のいずれも使用していないことを示唆しています。メソッド 'A'はより接近しているように見えますが、実装した場合、これらのアプリの動作は機能しません。

私はApple開発者チケットを使用して詳細情報を取得しました。これらの手段に沿って新しい発見事項も投稿します。

ありがとうございました

これまでのご参加、そして洞察に感謝いたします。

47
Andres Canella

Plistファイルにいくつかの変更を加える必要があります。

つまり、1)必須のバックグラウンドモードをアプリがオーディオを再生するように設定します。

2)「アプリケーションはバックグラウンドで実行されません」をYESに設定します。

 NSError *setCategoryErr = nil;
    NSError *activationErr  = nil;
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
    [[AVAudioSession sharedInstance] setActive:YES error:&activationErr];

次に、これらのコードをAppDelegeで作成する必要があります

これで、電話の画面ロック中またはバックグラウンドでオーディオを簡単に実行できます。

15
dhaval rupani

以前にこれをアプリで行っていた場合:

    AudioSessionInitialize (NULL, NULL, NULL, NULL);
    AudioSessionSetActive(true);

    // Allow playback even if Ring/Silent switch is on mute
    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
                             sizeof(sessionCategory),&sessionCategory);

ユーザーに、オーディオがアプリで機能していなかったと教えてもらいました(iOS5よりかなり前です)。彼らのリング/サイレントスイッチが「サイレント」に設定されていることが判明しました。そのため、このコードを追加したところ、「サイレント」設定が上書きされました。これは、たとえば音楽アプリがあり、音楽を再生し続けたい場合に便利です。

5
Mark Granoff

これに対する長い間求められていた解決策は、場所に基づく正当化である可能性があります。基本的に位置情報バックグラウンドサービスを使用して、アプリの定期的な更新を正当化し、アラームをトリガーします。これは、Apple==========================================================================================================.

これについては、将来的に少し検討します。今すぐ調べる時間がある場合、または洞察力がある場合は、遠慮なく投稿してください。

ハッピーハンティング。

2
Andres Canella

バックグラウンドでオーディオを使用する必要があるとしてアプリを登録しましたか?

ドキュメントから

A:iOS 4のiPhoneでMPMoviePlayerControllerを使用してオーディオのみのムービーやその他のオーディオファイルを再生しています。アプリケーションがバックグラウンドに切り替わったとき、または画面がロックされたときに、オーディオが引き続き再生されるようにするにはどうすればよいですか?

まず、アプリケーションがバックグラウンド実行をサポートすることを宣言する必要があります。アプリケーションは、Info.plistファイルにUIBackgroundModesキーを含めることでこれを行います。このキーは、アプリケーションがサポートするバックグラウンドタスクを識別します。その値は、1つ以上の文字列を含む配列です。文字列値audioを指定して、アプリケーションがバックグラウンドでユーザーに可聴コンテンツを再生することを示します。

次に、画面がロックされてもムービーオーディオが継続するようにするには、オーディオセッションに適切なカテゴリを割り当てる必要があります。カテゴリー(iPhone OS 2.2以降)がAVAudioSessionCategorySoloAmbient(または同等のkAudioSessionCategory_SoloAmbientSound)であるデフォルトのオーディオセッションに依存することはできません。

画面がロックしたとき、またはリング/サイレントスイッチが「サイレント」の位置にあるときに再生を続行するには、AVAudioSessionCategoryPlayback(または同等のkAudioSessionCategory_MediaPlayback)カテゴリを使用します。リスト1は、AVAudioSessionCategoryPlaybackカテゴリーを使用してアプリケーションのオーディオセッションを初期化する方法を示しています。

1
sosborn

ちょうどチェック、あなたのコードはこの行が欠けていますか?

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
1
MyCSharpCorner

SystemSoundIDを調べてください。彼らのオーディオは、音量ボタンとサイレントモードで設定された音量にもかかわらず、「設定」>「サウンド」の「リンガーとアラート」スライダーの音量で再生されます。

0
Greg
0
Rohit Wankhede

これらのアプリは要件について非常に明確であることに気づきました。 (1)ユーザーがこのアプリのローカル通知アラートを[設定]> [通知]で許可しない限り、機能しません。(2)ユーザーが画面をロックしたときにアプリが最前面に表示されます(たとえば、ユーザーがクリックしても機能しません)アプリを終了するホームボタンその後画面をロックします)。

したがって、おそらくローカル通知とバックグラウンドで再生される無音の組み合わせです。サイレントサウンドとは、画面がロックされているときに、アプリが最前面にある場合は中断されないことを意味します。これにより、ローカル通知がアプリ自体に送信され、アプリはアラーム音を鳴らして応答することができます。または、おそらく無音ではなく、聞こえるアラーム音はローカル通知に添付されたカスタム音だけです(しかしそうであれば、画面がロックされているときにアプリを最前面にする必要がある理由がわかりません)。

また、私はこれをテストしていませんが、マーラー事件(http://www.nytimes.com/2012/01/13/nyregion/ringing-)に対応して、iPhoneのサイレントスイッチの動作が5.1で変更されている可能性があります。最終的に停止しましたが、コンサートのアラート-アラーム-persists.html)。これは、開発者が5.1までこれを行うことができるとコメントしている理由を説明しています。

0
matt