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.
Réponse
Trop de publicités?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.