web-dev-qa-db-fra.com

Lire le son par défaut de la notification locale lors de l'affichage de UIAlertView?

J'écris une application de rappels pour iPhone qui affiche des rappels à l'aide de notifications locales.

Si un rappel se déclenche pendant que l'application est en cours d'exécution, la notification locale ne s'affiche pas. Au lieu de cela, la méthode didReceiveLocalNotification est appelée dans mon délégué d'application et j'imite la boîte de dialogue de notification locale en affichant un UIAlertView avec le texte de rappel.

Lorsque des notifications locales sont affichées en dehors de l'application, l'appareil vibre et le son spécifié par UILocalNotificationDefaultSoundName est lu. Encore une fois, j'aimerais imiter cela dans l'application lors de l'affichage du UIAlertView.

Je peux faire vibrer l'appareil en appelant AudioServicesPlaySystemSound(kSystemSoundID_Vibrate), mais je ne sais pas comment jouer le son par défaut de la notification locale. Il n'y a pas de constante SystemSoundID équivalente, et je ne sais pas quel serait le chemin d'accès.

tl; dr Je voudrais jouer le son par défaut de notification locale lors de l'affichage d'un UIAlertView. Des idées?

40
nickpatrick

Bonne question. Idéalement, il y aurait un moyen de sélectionner un son système à l'aide d'AudioServices. Cependant, la déclaration suivante du "System Sound Services Reference" d'Apple suggère le contraire:

Sous Mac OS X, lorsqu'un utilisateur a configuré les Préférences Système pour faire clignoter l'écran pour les alertes, ou si le son ne peut pas être rendu, l'appel de cette fonction entraînera le clignotement de l'écran. Sous Mac OS X, transmettez la constante kSystemSoundID_UserPreferredAlert pour lire le son d'alerte sélectionné par l'utilisateur dans les Préférences Système. Dans iOS, il n'y a pas de son d'alerte utilisateur préféré.

Comme il semble que le SDK ait peu à offrir, vous souhaiterez peut-être imiter les sons du système en utilisant votre propre fichier wav. Il y a une belle bibliothèque sur le lien suivant, peut-être qu'elle aura le son que vous recherchez: http://sites.google.com/site/iphonesounds/iPhoneOriginalSystemSounds_WAV.Zip

Bonne chance!

68
Andrew Little

Vous pouvez jouer le son de notification par défaut de cette manière:

AudioServicesPlaySystemSound(1315);

Dans ce lien vous trouverez la liste des identifiants que vous pouvez utiliser comme paramètre de AudioServicesPlaySystemSound (id).

Bon codage!

26
sancho

Définissez le délégué dans le fichier .h:

@interface ViewController : UIViewController <UIAlertViewDelegate>
{
}

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

@end

Et définissez la méthode déclarée ci-dessus.

Et dans le fichier .m, procédez comme suit:

- (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

Ceci est un ajout à la réponse d'Andrew Little.

Pour mieux imiter le son des notifications, vous devez également configurer la session audio:

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

Ceci est essentiel lorsque par ex. vous écoutez la musique et obtenez une notification pendant ce temps.

Les paramètres de la session ci-dessus sont identiques à ceux du son joué lorsque la notification se déclenche avec l'application en arrière-plan:

  • la musique est réduite au silence avant et reprend après le son de notification.
  • le commutateur de silence de l'appareil est correctement géré - le son n'est émis que lorsque le commutateur est activé
  • le volume est le même (notez que vous pouvez obtenir un volume différent si vous utilisez le son du système lors de l'application en arrière-plan et des fichiers d'Andrew Little)
3
sergtk