6
votes

Minuterie iOS en arrière-plan

Je veux dans ma candidature iOS pour démarrer une minuterie lorsque l'application est en cours d'exécution et lorsque l'application est fermée. La minuterie doit vérifier toutes les 30 minutes d'une nouvelle notification. Dans la fonction de minuterie, ils appellent toutes les 30 minutes une autre fonction monseignée ().

Comment puis-je faire cette minuterie et sur quel endroit dois-je appeler la minuterie lorsque l'application ne fonctionne pas / exécutée en arrière-plan?


0 commentaires

4 Réponses :


5
votes

AFAIK Il n'y a aucun moyen d'exécuter NSTIMER après 180s à l'arrière-plan (dans la production).

Edit: Si vous activez les modes d'arrière-plan, vous pouvez obtenir 10 minutes maximum. Vous pouvez en apprendre plus, par exemple. ici .


2 commentaires

Comment puis-je activer les modes de fond? Et quand j'ai activé des modes d'arrière-plan, je peux définir une minuterie qui appelle une fonction toutes les 10 minutes?


AD 1) Voir le lien ci-joint. Ad 2) TLDR: Non - Vous avez 10 minutes (max) pour faire toutes vos affaires. Peut-être que des notifications pourraient résoudre votre problème.



5
votes

Il est impossible de faire quelque chose lorsque l'application n'est pas au premier plan, avec 100% de certitude. Vous pouvez utiliser l'arrière-plan d'arrière-plan pour être réveillé périodiquement, mais vous ne pouvez pas contrôler quand cela se produit.

Bien qu'il existe des solutions de contournement techniques et potentiellement quelques solutions de hacky (jouer audio silencieux à l'arrière-plan), cela me semble que votre problème peut être résolu sans utiliser de minuterie et de récupération de fond.

implémenter simplement notifications à distance . Lorsque votre iOS reçoit une notification pour votre application, elle réveillera l'application et laissera le processus pendant un moment. Vous pouvez ensuite contrôler les notifications montrées à l'utilisateur et peut-être charger des données en arrière-plan.

En termes larges, vous devez:


2 commentaires

Pour notications à distance, vous devez avoir une adhésion à un développeur Apple?


Je le pense. Vous devez être capable de configurer des certificats de notification push, ce qui n'est possible que si vous êtes inscrit à l'adhésion.



3
votes
Write this both methos in your Appdelegate.m file

//For Objective c
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
          [self TimerMethod];
    }
    -(void)TimerMethod
    {
        //Every 30 minute call the functions
        _timer=[NSTimer scheduledTimerWithTimeInterval:1800.0f target:self selector:@selector(updateMethod:) userInfo:nil repeats:YES];
    }

    - (void)updateMethod:(NSTimer *)theTimer
    {
        NSLog(@"Timer set now");
    }

//For Swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool 
{
     self.TimerMethod()
}

func TimerMethod()
{
      var timer = NSTimer.scheduledTimerWithTimeInterval(1800, target: self, selector: "updateMethod", userInfo: nil, repeats: true)
}

func updateMethod()
{
    print("set timer now")
}

4 commentaires

Ce n'est pas dans la langue rapide !?


La minuterie fonctionne, mais la minuterie s'arrête lorsque je ferme l'application ou exécutez l'application dans De fond.


ApplicationWillenerForeFreat Code d'écriture dans cette méthode


@Imjaydeep il imprimé 1 fois la ligne "Définir la minuterie maintenant" et s'arrête après la fermeture de l'application maintenant.



0
votes

Ajouter ce code dans AppDeleage.swift

var backgroundUpdateTask: UIBackgroundTaskIdentifier = 0

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    return true
}

func applicationWillResignActive(application: UIApplication) {
    self.backgroundUpdateTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
        self.endBackgroundUpdateTask()
    })
}

func endBackgroundUpdateTask() {
    UIApplication.sharedApplication().endBackgroundTask(self.backgroundUpdateTask)
    self.backgroundUpdateTask = UIBackgroundTaskInvalid
}

func applicationWillEnterForeground(application: UIApplication) {
    self.endBackgroundUpdateTask()
}


0 commentaires