4 votes

Comment faire fonctionner une application iOS en arrière-plan en permanence en Swift ?

Je veux faire une application qui fait une demande HTTP à un site web périodiquement. L'application doit fonctionner en arrière-plan, mais peut se réveiller ou afficher une notification, en fonction de la réponse à la demande. Comme un message de WhatsApp, mais je n'ai pas de serveur web, seul le dispositif vérifie les valeurs de la demande http get.

7voto

Jumhyn Points 2314

Cela peut être fait avec le fetch capacité mentionnée dans le Guide de l'exécution en arrière-plan d'iOS . Vous devez inclure l'option "Background fetch" dans les capacités de votre application, puis implémenter l'option "Background fetch". application(_:performFetchWithCompletionHandler:) dans le délégué de votre application. Cette méthode sera ensuite appelée lorsque iOS estimera que le moment est venu de télécharger un contenu. Vous pouvez utiliser URLSession et les méthodes associées pour télécharger ce que vous voulez, puis appeler le gestionnaire d'achèvement fourni, indiquant si le contenu était disponible.

Notez que cela ne vous permet pas de calendrier de tels téléchargements, ou d'avoir un quelconque contrôle sur le moment où ils se produisent (ou même s'ils se produisent). Le système d'exploitation n'appellera la méthode ci-dessus que lorsqu'il décidera que c'est le bon moment. La documentation d'Apple explique :

L'activation de ce mode ne garantit pas que le système laissera à votre application le temps d'effectuer des recherches en arrière-plan. Le système doit trouver un équilibre entre le besoin de votre application d'aller chercher du contenu et les besoins des autres applications et du système lui-même. Après avoir évalué ces informations, le système accorde du temps aux applications lorsqu'il y a de bonnes occasions de le faire.

À titre d'exemple, voici une mise en œuvre de base qui lance un téléchargement et programme ensuite une notification locale pour dans dix secondes si nous obtenons une bonne réponse :

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    URLSession.shared.dataTask(with: URL(string: "http://example.com/backgroundfetch")!) { data, response, error in
        guard let data = data else {
            completionHandler(.noData)
            return
        }
        guard let info = String(data: data, encoding: .utf8) else {
            completionHandler(.failed)
            return
        }
        let content = UNMutableNotificationContent()
        content.title = "Update!"
        content.body = info

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)

        let request = UNNotificationRequest(identifier: "UpdateNotification", content: content, trigger: trigger)
        let center = UNUserNotificationCenter.current()
        center.add(request) { (error : Error?) in
            if let error = error {
                print(error.localizedDescription)
            }
        }
        completionHandler(.newData)
    }
}

Le site Guide de programmation de la notification locale et à distance doit être utilisé comme référence pour la mise en œuvre des notifications.

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