9 votes

UILocalNotifications jouant un son personnalisé

J'ai implémenté la notification locale dans mon application mais je me demande s'il y a un moyen de jouer un son qui ne fait pas partie du bundle principal de l'application iPhone. En fait, dans mon application, je veux que l'utilisateur enregistre un son qui sera joué lorsque la notification locale est générée au lieu de jouer un son pré-enregistré ou par défaut. Pour autant que je sache, c'est réalisable car j'ai vu 2-3 applications dans l'app store qui font la même chose que ce que je veux faire.

- (void)alertSelector:(NSString *)AlertTitle WithFiringTime:(NSDate *)date
{ 

UILocalNotification *localNotification = [[[UILocalNotification alloc] init] autorelease];
   [localNotification setFireDate:date];
   [localNotification setTimeZone:[NSTimeZone defaultTimeZone]];
   NSDictionary *data = [NSDictionary dictionaryWithObject:date forKey:@"payload"];       
   [localNotification setUserInfo:data];[localNotification setAlertBody:AlertTitle];   
   [localNotification setAlertAction:@"View"]; [localNotification setHasAction:YES]; 
   localNotification.soundName=@"voice.aif"; 

   if (!localNotification)
          return;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
}

3voto

Bill Burgess Points 8217

Je pense que votre son n'est pas formaté de manière appropriée pour être lu par le système d'exploitation. Assurez-vous que votre son est formaté au format IMA4. Assurez-vous également que votre fichier se trouve dans le paquet d'applications, et vous devriez être en mesure de le faire.

Pour plus de références et une question similaire, voir cette question de l'OS.

Choisir un son personnalisé pour les notifications locales

Voici un lien pour Guide des notifications locales et push d'Apple . Il explique les sons en détail et les sons par défaut qui peuvent être utilisés.

0voto

Akshay Points 4691

D'après la description de la soundName propriété -

Pour cette propriété, il faut spécifier dans le fichier UILocalNotificationDefaultSoundName pour demander le système par défaut son.

Il ne semble pas que des sons autres que ceux présents dans le paquet puissent être utilisés. Êtes-vous sûr que les applications utilisent les notifications locales avec leurs sons personnalisés ? Peut-être jouent-elles des sons avec des alertes ou quelque chose comme ça.

HTH,

Akshay

0voto

Chigurh Points 865
notif.soundName = @"sound.caf";

Cela devrait fonctionner. Assurez-vous que le son se trouve bien dans le bundle de votre application, qu'il est dans le bon format (PCM linéaire ou IMA4 - pratiquement tout ce qui explique comment convertir des sons pour iOS vous dira comment faire) et qu'il dure moins de 30 secondes.

Vous pouvez convertir des fichiers wav et mp3 à l'aide du terminal :

afconvert -f caff -d LEI16@44100 -c 1 in.wav sound.caf

'in.wav' est le son d'entrée que vous voulez convertir et 'sound.caf' est le fichier de sortie, changez le répertoire pour l'endroit où vous voulez avoir le fichier de sortie.

0voto

Peterd Points 13

Assurez-vous que votre fichier son est ajouté à la liste "Copy Bundle Resources" sous Project Settings->(Target)->Build Phases. Cela a résolu le problème pour moi. Au début, je n'obtenais que le son par défaut, même si j'avais spécifié un nom de fichier personnalisé (et que le fichier avait été ajouté au projet). Mais après avoir ajouté manuellement le fichier à cette liste, cela a commencé à fonctionner.

J'ai utilisé le son du système de mon Mac pour tester. Je l'ai converti en utilisant cette commande dans une console :

afconvert /System/Library/Sounds/Basso.aiff ~/Downloads/alert2.caf -d ima4 -f caff -v

0voto

IsPha Points 1

J'ai rencontré le même problème, il semble que ce n'était pas supporté auparavant ou qu'il n'était pas possible de jouer un son personnalisé pour une notification locale qui n'est pas incluse dans l'App Bundle. Mais plus tard, cela a été pris en charge et vous pouvez assigner des sons personnalisés à partir du conteneur d'application spécifiquement dans le répertoire Library/Sounds. Vous pouvez soit télécharger des sons du serveur vers ce répertoire, soit le tester en copiant un fichier .caf (Apple a indiqué que d'autres extensions pouvaient fonctionner) de l'offre groupée vers le répertoire Library/sounds, puis en supprimant la référence au fichier de l'offre groupée afin de vous assurer que si des sons sont joués, ils proviennent d'un répertoire hors de l'offre groupée. Tout cela fonctionne très bien, le principal problème pour moi est que si l'utilisateur force la citation de l'application, elle cesse de fonctionner pour les notifications locales alors qu'elle fonctionne toujours avec les notifications du kit push, je planifie cependant une notification locale lorsque le kit push arrivera. Voici le code pour tester la lecture d'un son à partir d'un répertoire :

 func copyFileToDirectoryFromBundle()
{
    // get reference to library directory
    let LibraryDirectoryPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)

    // see what is in there 
    for path in LibraryDirectoryPaths
    {
        print("di=\(path)")
    }

    // prepare for sound directory
    let libraryDirectoryPath: AnyObject = LibraryDirectoryPaths[0]
    let soundsDirectoryPath = libraryDirectoryPath.stringByAppendingPathComponent("Sounds")

    // create sounds directory under library if not there already
    if !NSFileManager.defaultManager().fileExistsAtPath(soundsDirectoryPath)
    {
    do {
        try NSFileManager.defaultManager().createDirectoryAtPath(soundsDirectoryPath, withIntermediateDirectories: false, attributes: nil)
        print("sounds library created,,,")
    } catch let error as NSError {
        print("creating sounds directory error = \(error.localizedDescription)");
    }
    }
    else
    {
        print("Sounds directory is there already under Library")
    }

    do {
        // sounds directory should have been added under library
        let directoryContents = try NSFileManager.defaultManager().contentsOfDirectoryAtURL( NSURL(string: libraryDirectoryPath as! String)!, includingPropertiesForKeys: nil, options: [])
        print("Library directs=\(directoryContents)")

        // prepare for adding subdirectory with file name from bundle
        // here is where you should save files if downloaded from server 
        // here im just moving one from bundle 

        let subDirectoryPath = directoryContents.last!

        if let pathFromBundle = NSBundle.mainBundle().pathForResource("notification", ofType:"caf") {
            let myFilePathUnderSounds = "\(subDirectoryPath.path!)\("/notification.caf")"
            if !NSFileManager.defaultManager().fileExistsAtPath(myFilePathUnderSounds)
            {
            do {
                print("bundle path=\(pathFromBundle)and datacontainer path=\(subDirectoryPath.path!)")
                try NSFileManager.defaultManager().copyItemAtPath(pathFromBundle, toPath:myFilePathUnderSounds )
                print("item copied")
            } catch let error as NSError {
                print(error.localizedDescription);
            }
            }
            else
            {
                print("Your file from bundle path = \(pathFromBundle) is already there under Sounds")
            }
        }
        else
        {
            print("Item not found in bundle")
        }

        // see item there after you add it
        let subDirectories = try NSFileManager.defaultManager().contentsOfDirectoryAtURL( subDirectoryPath, includingPropertiesForKeys: nil, options: [])

        print("files under sounds")
        for fileDirectory in subDirectories
        {
            print(fileDirectory)
        }

    } catch let error as NSError {
        print(error.localizedDescription)
    }

}

Après avoir vérifié que le fichier .caf se trouve dans le répertoire Library/Sounds . Tout ce que vous avez à faire est d'assigner le nom du fichier avec son extension à la propriété soundName de la notification locale, comme si le fichier se trouvait dans le bundle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X