46 votes

Comment lancer la lecture d'un fichier audio en mode silencieux et verrouillé dans iOS 6 ?

Processus pour l'utilisateur final

  1. Ouvrir l'application
  2. Activez le "mode silencieux".
  3. Appuyez sur le bouton de verrouillage
  4. L'application peut toujours COMMENCER à diffuser un son après plusieurs heures, sans diffuser de son entre-temps.

Les applications qui font cela

Beaucoup d'applications d'alarme ont réussi à faire cela & Je ne pense pas qu'elles utilisent le son silencieux pour maintenir l'application en marche car elles ne sonnent pas si vous quittez l'application avec la touche "home".

  • Réveil Pro
  • Mon horloge
  • Alarme à vagues
  • Alarme
  • iHome
  • ...

...Est-ce qu'ils gardent une boucle en cours après avoir été verrouillé ou est-ce qu'une notification (qui ne peut pas jouer le son en mode silencieux) redémarre l'application pour jouer l'audio, ou une autre méthode ?

Méthodes actuelles mises en œuvre

Utilisation d'AVAudioPlayer :

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

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

Et en mettant Info.plist à :

Modes d'arrière-plan requis (UIBackGroundModes) - L'application joue du son (audio)

Actuellement

Je peux lire le son même en mode silencieux lorsque l'application est en cours d'exécution et à l'écran. Si l'audio est déjà en cours d'exécution, l'application peut être fermée avec le bouton d'accueil et l'audio s'exécutera. MAIS si l'application n'est pas en train de jouer l'audio et que l'écran est verrouillé, tous les threads sont tués et l'audio n'est jamais joué. Comment ces applications parviennent-elles à contourner ce problème ?

Approches possibles trouvées jusqu'à présent

A. Utilisez 'beginBackgroundTaskWithExpirationHandler:' avec une boucle infinie pour faire tourner l'application indéfiniment.

Pour :

  • Il semble que l'on puisse faire fonctionner ce système dans de nombreuses situations, même lorsque l'utilisateur appuie sur la touche "home".

Cons :

  • Cela va à l'encontre de la politique d'Apple, d'après ce que je sais.
  • utilisera davantage de ressources

Commentaires :

J'ai presque réussi à le faire fonctionner et je pourrais le faire avec quelques ajustements. Il semble que ce ne soit pas ce que font toutes ces autres alarmes, car elles ne continuent pas à fonctionner si vous appuyez sur la touche Home BTN. Ce qui suggère qu'elles utilisent une méthode qui leur donne la permission de fonctionner lorsqu'elles sont verrouillées mais pas dans le BG. (Ce qui est ce dont j'ai besoin)

De même, lorsque vous demandez combien de temps il vous reste à courir, vous obtenez environ 10 minutes. En introduisant une boucle infinie, les chiffres descendront à 0 et resteront dans le négatif pendant des heures. (testé) Je ne sais pas comment cela se comporterait dans le monde réel ou en termes d'acceptation par les applications.

B. Utilisez une boucle audio silencieuse pour vous faire passer pour un centre multimédia à lecture audio continue.

Pour :

  • Il a fonctionné lorsqu'il était verrouillé, et continuera à fonctionner dans la plupart des situations.

Cons :

  • Peut échouer si elle est interrompue par un autre media center et dans certaines autres occasions.
  • On peut aussi aller à l'encontre de la politique d'Apple.

Commentaires :

Cela peut fonctionner dans de nombreuses situations, mais ce n'est de loin pas l'idéal. Et comme je le répète, il doit y avoir une autre méthode qui n'est pas documentée.

Conclusions jusqu'à présent

Les tests effectués avec les APP répertoriés suggèrent qu'ils n'utilisent aucune des deux méthodes que je viens de décrire. La méthode "A" semble être plus proche, mais si elle était mise en œuvre, elle ne se comporterait pas comme ces applications.

J'ai utilisé un ticket de développeur Apple pour obtenir plus d'informations, je posterai toute nouvelle découverte par ce biais également.

Merci.

Nous vous remercions pour votre participation jusqu'à présent.

15voto

dhaval rupani Points 286

Vous devez faire quelques changements dans le fichier plist.

c.-à-d. 1) Définir le mode d'arrière-plan requis pour que l'application joue de l'audio.

2) Définissez l'option L'application ne fonctionne pas en arrière-plan sur OUI.

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

Ensuite, vous devez écrire le code suivant dans AppDelege

Désormais, vous pouvez facilement faire fonctionner le son pendant que l'écran du téléphone se verrouille ou en arrière-plan.

5voto

MarkGranoff Points 12142

Aviez-vous déjà fait cela dans votre application ?

    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);

Un utilisateur m'a dit que l'audio ne fonctionnait pas sur une application (bien avant iOS5 !). Il s'est avéré que leur interrupteur anneau/silence était réglé sur "silencieux". J'ai donc ajouté ce code, qui permet de remplacer le réglage "silent". C'est utile si vous avez une application de musique, par exemple, et que vous voulez que la musique continue à jouer.

2voto

Andres Canella Points 674

La solution longtemps recherchée à ce problème pourrait être une justification basée sur la localisation. Il s'agirait d'utiliser le service de localisation en arrière-plan pour justifier les mises à jour périodiques de votre application et déclencher ainsi une alarme. Cela pourrait être justifié auprès d'Apple en incluant une fonction comme les mises à jour de la météo, qui nécessite des services de localisation.

Je me pencherai sur cette question à l'avenir. Si vous avez le temps d'y jeter un coup d'œil maintenant, ou si vous avez des idées, n'hésitez pas à poster.

Bonne chasse.

1voto

MyCSharpCorner Points 614

Juste une vérification, est-ce que votre code manque cette ligne :

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

1voto

sosborn Points 11273

Avez-vous enregistré votre application comme ayant besoin d'utiliser l'audio en arrière-plan ?

Extrait de la documentation :

R : J'utilise MPMoviePlayerController pour lire des films et autres fichiers audio sur l'iPhone dans iOS 4. d'autres fichiers audio sur l'iPhone dans iOS 4. Comment puis-je m'assurer que mes fichiers audio ne sont pas endommagés ? continuer à jouer lorsque mon application est mise en arrière-plan arrière-plan ou que l'écran est verrouillé ?

Tout d'abord, vous devez déclarer que votre application prend en charge l'exécution en arrière-plan. arrière-plan. Pour ce faire, une application doit inclure la propriété UIBackgroundModes dans son fichier Info.plist. Cette clé identifie les tâches d'arrière-plan votre application prend en charge. Sa valeur est un tableau qui contient une ou plusieurs plusieurs chaînes de caractères. Spécifiez la valeur de chaîne audio pour indiquer que l'application l'application diffuse un contenu audible à l'utilisateur en arrière-plan.

Ensuite, si vous voulez vous assurer que l'audio de votre film continue lorsque l'écran se lorsque l'écran se verrouille, vous devez attribuer une catégorie appropriée à votre audio. Vous ne pouvez pas vous fier à la session audio par défaut, dont la catégorie (à partir de iPhone OS 2.2) est AVAudioSessionCategorySoloAmbient (ou équivalent, kAudioSessionCategory_SoloAmbientSound).

Pour que la lecture se poursuive lorsque l'écran se verrouille, ou lorsque la touche Ring/Silent est en position "silent", utilisez la fonction AVAudioSessionCategoryPlayback (ou l'équivalent de la catégorie kAudioSessionCategory_MediaPlayback). Le Listing 1 montre comment initialiser la session audio de votre application avec la catégorie catégorie AVAudioSessionCategoryPlayback.

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