gpt4 book ai didi

ios - 如何让 iOS 应用程序在 Swift 中永远在后台运行?

转载 作者:搜寻专家 更新时间:2023-10-31 08:19:33 27 4
gpt4 key购买 nike

我想制作一个定期向网站发出 HTTP 请求的应用程序。该应用程序必须在后台运行,但可以唤醒或显示通知,具体取决于请求的响应。就像WhatsApp的消息一样,但我没有网络服务器,只有http get请求的设备检查值。

最佳答案

这可以通过 iOS Background Execution guide 中提到的 fetch 功能来完成。 .您需要在应用程序的功能中包含“后台获取”选项,然后在应用程序委托(delegate)中实现 application(_:performFetchWithCompletionHandler:) 方法。然后,当 iOS 认为是下载某些内容的好时机时,将调用此方法。您可以使用 URLSession 和相关方法下载您想要的任何内容,然后调用提供的完成处理程序,指示内容是否可用。

请注意,这不允许您安排此类下载,也无法控制它们何时(甚至是否)发生。操作系统只有在确定时机成熟时才会调用上述方法。 Apple 的文档解释:

Enabling this mode is not a guarantee that the system will give your app any time to perform background fetches. The system must balance your app’s need to fetch content with the needs of other apps and the system itself. After assessing that information, the system gives time to apps when there are good opportunities to do so.

例如,这是一个基本的实现,它会启动下载,然后在我们收到良好响应时从现在开始安排 10 秒的本地通知:

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)
}
}

Local and Remote Notification Programming Guide应作为实现通知的引用。

关于ios - 如何让 iOS 应用程序在 Swift 中永远在后台运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48198761/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com