J'essaie de maintenir l'application iOS en état actif pendant plus de 10 minutes lorsqu'elle passe en mode arrière-plan.
Comment puis-je mettre en œuvre cela.
Voir la section "Exécution en arrière-plan" du iPhoneAppProgrammingGuide . En bref, votre application doit appartenir à l'un de ces types:
Et vous devez ajouter à Info.plist comme suit: Ajoutez la clé UIBackgroundModes à votre fichier Info.plist et définissez sa valeur sur un tableau contenant une ou plusieurs des chaînes suivantes:
Notez qu'une partie du processus de révision consistera à vérifier que votre application fait ce qu'elle dit en ce qui concerne le traitement en arrière-plan.
Voici ce que j'ai fait avec beginBackgroundTaskWithExpirationHandler .
NSTimer
avec une heure planifiée (non répétée) inférieure à 10 minutes. Pour les besoins de ma situation, j'utilisais 5 minutes.NStimer
a été activé, fermez la tâche en arrière-plan, puis appelez instantanément la méthode que vous avez écrite précédemment pour démarrer une autre tâche en arrière-plan.Cette solution n'est pas vraiment idéale, elle consomme toujours beaucoup d'énergie, mais fera ce que vous voulez.
Edit: Depuis iOS7, je vous suggère de lire ceci excellent post .
Ce code fait que votre application iOS s'exécute indéfiniment en arrière-plan. Copiez et collez les méthodes ci-dessous dans un singleton/manager qui gère les tâches à effectuer en arrière-plan.
// @interface
// Declare Private property
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
//@end
// ...
// Copy into
//@implementation
- (void)setupBackgrounding {
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appBackgrounding:)
name: UIApplicationDidEnterBackgroundNotification
object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appForegrounding:)
name: UIApplicationWillEnterForegroundNotification
object: nil];
}
- (void)appBackgrounding: (NSNotification *)notification {
[self keepAlive];
}
- (void) keepAlive {
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
[self keepAlive];
}];
}
- (void)appForegrounding: (NSNotification *)notification {
if (self.backgroundTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}
}
Seuls certains types d'applications sont autorisés à s'exécuter en arrière-plan. Reportez-vous à la section "Mise en œuvre de tâches d'arrière-plan de longue durée" dans le présent guide .
Si vous ne demandez pas d'autorisation de traitement en arrière-plan, vous pouvez utiliser beginBackgroundTaskWithExpirationHandler de UIApplication, mais vous ne pouvez pas gagner de temps supplémentaire.
https://github.com/yarodevuci/backgroundTask Vérifiez mon code ici J'utilise un lecteur audio lisant un fichier wav vierge Fonctionne parfaitement sous IOS 8 Utilisation de la batterie à environ 10% par période de 24 heures Comment utiliser:
var backgroundTask = BackgroundTask()
backgroundTask.startBackgroundTask() //Starts playing blank audio file. You can run NSTimer() or whatever you need and it will continue executing in the background.
backgroundTask.stopBackgroundTask() //Stops the task
Avertissement: Apple rejettera cette information si vous essayez de la soumettre!
Si votre type d’application ne correspond pas à VOIP/Audio/Localisation .... (vérifiez Modes d’arrière-plan ),
ou si vous ne souhaitez pas spécifier votre application en tant qu'application d'arrière-plan, vous pouvez implémenter beginBackgroundTaskWithName: expirationHandler ou beginBackgroundTaskWithExpirationHandler pour demander plus de temps pour exécuter votre processus en arrière-plan. Vous pouvez trouver la description détaillée ici
Les applications déplacées en arrière-plan sont supposées se mettre au repos le plus rapidement possible pour pouvoir être suspendues par le système. Si votre application est au milieu d'une tâche et qu'elle a besoin d'un peu de temps supplémentaire, elle peut appeler la méthode beginBackgroundTaskWithName: expirationHandler: ou beginBackgroundTaskWithExpirationHandler: de l'objet UIApplication pour demander un délai d'exécution supplémentaire. L'appel de l'une de ces méthodes retarde temporairement la suspension de votre application, ce qui lui laisse un peu plus de temps pour terminer son travail. Une fois ces travaux terminés, votre application doit appeler la méthode endBackgroundTask: pour que le système sache qu’elle est terminée et peut être suspendue.
Chaque appel à la méthode beginBackgroundTaskWithName: expirationHandler: ou beginBackgroundTaskWithExpirationHandler: génère un jeton unique à associer à la tâche correspondante. Lorsque votre application termine une tâche, elle doit appeler la méthode endBackgroundTask: avec le jeton correspondant pour que le système sache que la tâche est terminée. Si vous n'appelez pas la méthode endBackgroundTask: pour une tâche en arrière-plan, votre application sera terminée. Si vous avez fourni un gestionnaire d'expiration lors du démarrage de la tâche, le système appelle ce gestionnaire et vous donne une dernière chance de terminer la tâche et d'éviter la fin.
Tu ne peux pas. Sauf si votre application utilise de l'audio, de la VoIP ou du GPS. Ce que vous pouvez faire, c'est informer l'utilisateur (via des notifications locales) que le temps est presque écoulé et lui demander d'ouvrir/fermer l'application.
De plus, si vous devez simplement informer l'utilisateur, vous pouvez utiliser les notifications Push.