web-dev-qa-db-fra.com

Comment démarrer la lecture audio en mode silencieux et verrouillé dans iOS 6?

Processus de l'utilisateur final

  1. Ouvrir application
  2. Activez le "Mode silencieux".
  3. Appuyez sur le bouton de verrouillage
  4. L'application peut toujours commencer à jouer un son après des heures, sans lire aucun son dans l'intervalle.

Applications qui font cela

De nombreuses applications d'alarme ont réussi à le faire et je ne pense pas qu'elles utilisent un son silencieux pour maintenir l'application en marche car elles ne sonnent pas si vous quittez réellement l'application à la maison.

  • Alarm Clock Pro
  • Mon horloge
  • Alarme de vague
  • Alarmé
  • je maison
  • ...

... Gardent-ils une boucle en cours d'exécution après avoir été verrouillé ou comment une notification (qui ne peut pas jouer le son en silence) démarre-t-elle l'application pour lire l'audio, ou une autre méthode?

Méthodes actuelles mises en œuvre

AVAudioPlayer utilisant:

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

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

Et en définissant Info.plist sur:

Modes d'arrière-plan requis (UIBackGroundModes) - L'application lit l'audio (audio)

Maintenant

Je peux lire du son même en silence 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 ne lit pas d'audio et que l'écran est verrouillé, tous les threads sont supprimés et l'audio n'est jamais lu. Comment ces applications parviennent-elles à contourner ce problème?

Approches possibles trouvées jusqu'à présent

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

Avantages:

  • Il semble que vous puissiez faire fonctionner cela dans de nombreuses situations, même lorsque l'utilisateur appuie à la maison.

Inconvénients:

  • Cela va à l'encontre des politiques de Apple pour autant que je sache).
  • utilisera plus de ressources

Commentaires:

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

De plus, lorsque vous demandez combien de temps il vous reste à courir, vous obtenez environ 10 minutes. En laissant tomber une boucle infinie là-dedans, les chiffres tomberont en fait à 0, puis iront 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 d'application.

B. Utilisez une boucle audio silencieuse pour vous faire passer pour un media center de lecture audio continue

Avantages:

  • Fonctionne lorsqu'il est verrouillé et continuera de fonctionner dans la plupart des situations.

Inconvénients:

  • Peut échouer s'il est interrompu par un autre centre multimédia et à d'autres occasions.
  • Peut également aller contre Apple policy.

Commentaires:

Cela peut fonctionner dans de nombreuses situations, mais n'est de loin pas 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 avec les applications répertoriées 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 est mise en œuvre, elle ne se comportera pas comme ces applications.

J'ai utilisé un Apple ticket de développeur pour obtenir plus d'informations, je publierai également de nouvelles découvertes dans ce sens.

Merci

Toute idée est appréciée, et pour votre participation jusqu'à présent.

47
Andres Canella

Vous devez apporter quelques modifications dans le fichier plist.

c.-à-d. 1) Réglez le mode d'arrière-plan requis sur l'application pour lire le son

2) définir l'application ne s'exécute 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 ces beaucoup de code dans AppDelege

Maintenant, vous pouvez facilement exécuter l'audio pendant que l'écran du téléphone se verrouille ou en arrière-plan.

15
dhaval rupani

Si vous l'aviez déjà fait 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 de sonnerie/silencieux était réglé sur "silencieux". J'ai donc ajouté ce code, et il provoque la substitution du paramètre "silencieux". Cela est utile si vous avez une application musicale, par exemple, et que vous souhaitez que la musique continue à jouer.

5
Mark Granoff

La solution recherchée depuis longtemps pourrait être une justification basée sur l'emplacement. Utilisez essentiellement le service d'arrière-plan de localisation pour justifier des mises à jour périodiques de votre application et déclencher ainsi une alarme. Cela pourrait être justifié par Apple en incluant une fonctionnalité comme les mises à jour météorologiques, qui nécessite des services de localisation.

J'examinerai cela un peu dans le futur. S'il vous plaît, si vous avez le temps de l'examiner maintenant, ou si vous avez un aperçu, n'hésitez pas à poster.

Bonne chasse.

2
Andres Canella

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

À partir des documents :

R: J'utilise MPMoviePlayerController pour lire des films audio uniquement et d'autres fichiers audio sur l'iPhone dans iOS 4. Comment puis-je m'assurer que mon audio continuera à jouer lorsque mon application est basculée en 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. Une application le fait en incluant la clé UIBackgroundModes dans son fichier Info.plist. Cette clé identifie les tâches d'arrière-plan prises en charge par votre application. Sa valeur est un tableau qui contient une ou plusieurs chaînes. Spécifiez la valeur de chaîne audio pour indiquer que l'application lit du 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 verrouille, vous devez attribuer une catégorie appropriée à votre session audio. Vous ne pouvez pas vous fier à la session audio par défaut, dont la catégorie (à partir de l'iPhone OS 2.2) est AVAudioSessionCategorySoloAmbient (ou de manière équivalente, kAudioSessionCategory_SoloAmbientSound).

Pour que la lecture se poursuive lorsque l'écran se verrouille ou lorsque le commutateur Sonnerie/Silencieux est en position "silencieuse", utilisez la catégorie AVAudioSessionCategoryPlayback (ou la catégorie équivalente kAudioSessionCategory_MediaPlayback). Le listing 1 montre comment initialiser la session audio de votre application avec la catégorie AVAudioSessionCategoryPlayback.

1
sosborn

Juste une vérification, votre code manque cette ligne:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
1
MyCSharpCorner

Regardez dans SystemSoundID; leur audio est lu au volume du curseur "Sonnerie et alertes" dans Paramètres> Sons malgré le volume défini par les boutons de volume et le mode silencieux.

0
Greg
0
Rohit Wankhede

Je remarque que ces applications sont très claires sur leurs besoins. Ils ne fonctionneront que si (1) l'utilisateur autorise les alertes de notification locales pour cette application, dans Paramètres> Notifications, et (2) l'application est au premier plan lorsque l'utilisateur verrouille l'écran (par exemple, ils ne fonctionneront pas si l'utilisateur clique sur le bouton Accueil pour quitter l'application et puis verrouille l'écran).

C'est donc probablement une combinaison d'une notification locale et d'un son silencieux qui joue en arrière-plan. Le son silencieux signifie que lorsque l'écran est verrouillé, si l'application était au premier plan, elle n'est pas suspendue. La notification locale est ainsi envoyée à l'application elle-même et celle-ci peut répondre en produisant le son de l'alarme. Ou peut-être qu'il n'y a pas de son silencieux et que le son d'alarme que vous entendez n'est que le son personnalisé attaché à la notification locale (mais si c'est le cas, alors je ne comprends pas pourquoi l'application devrait être au premier plan lorsque l'écran est verrouillé). ).

De plus, même si je n'ai pas testé cela, le comportement du commutateur silencieux sur l'iPhone peut avoir changé en 5.1 en réponse à l'incident de Mahler (http://www.nytimes.com/2012/01/13/nyregion/ringing- finalement-arrêté-mais-concertgoers-alarm-persists.html). Cela expliquerait pourquoi les développeurs disent qu'ils pourraient le faire jusqu'à 5.1.

0
matt