web-dev-qa-db-fra.com

Exécuter l'application pendant plus de 10 minutes en arrière-plan

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.

46
user968597

Voir la section "Exécution en arrière-plan" du iPhoneAppProgrammingGuide . En bref, votre application doit appartenir à l'un de ces types:

  • Applications qui lisent du contenu audible à l'utilisateur en arrière-plan, telle qu'une application de lecteur de musique
  • Applications qui tiennent les utilisateurs informés de leur position à tout moment, telle qu'une application de navigation
  • Applications prenant en charge le protocole de voix sur Internet (VoIP)
  • Les applications de kiosque à journaux qui doivent télécharger et traiter du nouveau contenu
  • Applications recevant des mises à jour régulières d'accessoires externes

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:

  • audio: l'application lit le contenu audible pour l'utilisateur en arrière-plan. (Ce contenu inclut la diffusion de contenu audio ou vidéo en utilisant AirPlay.)
  • emplacement: l'application tient les utilisateurs informés de leur emplacement, même pendant son exécution en arrière-plan.
  • voip: l'application offre à l'utilisateur la possibilité de passer des appels téléphoniques via une connexion Internet.
  • newsstand-content: l'application est une application de Newsstand qui télécharge et traite le contenu d'un magazine ou d'un journal en arrière-plan.
  • accessoire externe: l'application fonctionne avec un accessoire matériel qui doit fournir des mises à jour selon un calendrier régulier par le biais de la structure d'accessoires externes.
  • bluetooth-central: l'application fonctionne avec un accessoire Bluetooth qui doit fournir des mises à jour selon un horaire régulier via le cadre CoreBluetooth.

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.

56
Brian Cooley

Voici ce que j'ai fait avec beginBackgroundTaskWithExpirationHandler .

  • Ecrivez une méthode qui lance une tâche en arrière-plan.
  • Dans cette tâche en arrière-plan, exécutez une 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.
  • Une fois que le sélecteur 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.
  • Si vous souhaitez planifier l'exécution de méthodes à des heures spécifiques, vous devez les rechercher dans la 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 .

20
ingh.am

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;
    }
}
2
rismay

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.

2
CJ Foley

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!

1
Maksim Kniazev

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.

0
User9527

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.

0
fbernardo