web-dev-qa-db-ja.com

UIAlertViewを表示するときにローカル通知のデフォルトサウンドを再生しますか?

ローカル通知を使用してリマインダーを表示するiPhone用リマインダーアプリを作成しています。

アプリケーションの実行中にリマインダーが鳴った場合、ローカル通知は表示されません。代わりに、アプリのデリゲートでdidReceiveLocalNotificationメソッドが呼び出され、UIAlertViewをリマインダーテキストとともに表示することで、ローカル通知ダイアログを模倣しています。

アプリの外部でローカル通知が表示されると、デバイスが振動し、 UILocalNotificationDefaultSoundName で指定されたサウンドが再生されます。繰り返しますが、UIAlertViewを表示するときにアプリでこれを模倣したいと思います。

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)を呼び出してデバイスを振動させることはできますが、ローカル通知のデフォルトサウンドを再生する方法がわかりません。同等のSystemSoundID定数はなく、パスがどうなるかわかりません。

tl; drUIAlertViewを表示するときに、ローカル通知のデフォルトのサウンドを再生したいと思います。何か案は?

40
nickpatrick

良い質問。理想的には、AudioServicesを使用してシステムサウンドを選択する方法があるでしょう。ただし、Appleの「System Sound Services Reference」の次のステートメントは、それ以外のことを示唆しています。

Mac OS Xでは、ユーザーがシステム設定を構成してアラートの画面を点滅させるか、サウンドをレンダリングできない場合にこの関数を呼び出すと、画面が点滅します。 Mac OS Xでは、定数kSystemSoundID_UserPreferredAlertを渡して、システム環境設定でユーザーが選択した警告音を再生します。 iOSには優先ユーザー警告音はありません。

SDKはほとんど提供していないようなので、独自のwavファイルを使用してシステムサウンドを模倣することをお勧めします。次のリンクにニースライブラリがあります。おそらく、探しているサウンドが含まれています。 http://sites.google.com/site/iphonesounds/iPhoneOriginalSystemSounds_WAV.Zip

幸運を!

68
Andrew Little

次の方法でデフォルトの通知音を再生できます。

AudioServicesPlaySystemSound(1315);

this link には、AudioServicesPlaySystemSound(id)のパラメーターとして使用できるIDのリストがあります。

良いコーディング!

26
sancho

デリゲートを.hファイルに設定します。

@interface ViewController : UIViewController <UIAlertViewDelegate>
{
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

@end

そして、上記で宣言したメソッドを設定します。

そして.mファイルでこれを行います:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/ma.mp3", [[NSBundle mainBundle] resourcePath]]];

    NSError *error;

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"message" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 

    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    audioPlayer.numberOfLoops = -1;


    [audioPlayer play];

    [alert show]; 
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex==0) {
        [audioPlayer stop];

    }
    NSLog(@"U HAVE CLICKED BUTTON");
}
3
user1541029

これはAndrew Littleの回答への追加です。

通知音をよりよく模倣するには、オーディオセッションも構成する必要があります。

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryAmbient withOptions:AVAudioSessionCategoryOptionDuckOthers error:nil];

これは、たとえばこの間、音楽を聴いて通知を受け取ります。

上記のセッションのパラメーターは、バックグラウンドでアプリケーションを使用して通知が発生したときに再生されるサウンドと同じように見えます。

  • 音楽は通知音の前に消音され、通知音の後に再開されます。
  • デバイスの無音スイッチが正しく処理されます-サウンドはスイッチがオンの場合にのみ再生されます
  • 音量は同じです(バックグラウンドでアプリケーションを使用しているときにシステムサウンドを使用している場合、Andrew Little Answerのファイルを使用すると、音量が異なる場合があります)
3
sergtk