iOS:从 BGAppRefreshTask 启动应用程序时访问互联网时出现问题 |BGProcessingTask(BGProcessing任务)

iOS : Issue in accessing internet when app is launched from BGAppRefreshTask |BGProcessingTask

提问人:Mohammad Yasir Perwez 提问时间:11/16/2023 最后编辑:Mohammad Yasir Perwez 更新时间:11/17/2023 访问量:44

问:

用例 :我们希望在应用程序处于后台时更新我们的应用程序内容。我们想从后端服务器(HTTP GET)下载一些json数据并更新应用程序的内容,以便下次用户启动应用程序时,他可以看到更新的内容。我们使用的是 Apple 的 BackgroundTasks 框架 API,特别是 BGAppRefreshTask 和 BGProcessingTask。相当标准

问题→通过 URLSession 的 HTTP 请求不起作用。

我们注册并调度 BGAppRefreshTask 和 BGProcessingTask。我们的应用程序由 iOS 在后台启动。但是当我们向 Web 服务器发出 HTTP 请求时,我们没有得到任何响应回调。 使用默认配置时,发出请求后,根本不会调用响应回调或 URLSessionDataDelegate 方法。(我也尝试过谷歌网址,只是为了确保问题不仅出在我们的后端)。 当我在调试时检查整个流程并且连接到 Xcode 并使用此命令触发后台启动时,一切都工作正常 e -l objc -- (无效)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@“com.background_cloud_sync_apprefresh”] 我有点被这个问题困住了,已经没有想法可以尝试了。 因此,如果您在 iOS 上遇到任何此类问题,我将在这里联系专家。

我尝试过带有回调和 URLSessionDataDelegate 的 URLSession。

更新:进一步的发现。我还发现,问题可能是调用后台执行的线程没有等待URLSession请求完成。我通过放置几个 1 秒线程睡眠来验证它,并为 URLSession 提供一个单独的队列以进行委托回调。 问:如何让后台执行等待其他异步任务完成。

iOS Swift URL会话

评论

0赞 Larme 11/16/2023
您的 URLSession 是否配置为后台?CompletionBlocks/async/await 方法不起作用,您需要使用 Delegate。您的委托代码是什么?您需要显示更多代码来帮助我们了解正在发生的事情。
0赞 Mohammad Yasir Perwez 11/17/2023
不。但是我尝试了后台配置,但对于数据任务,它不起作用。
0赞 Larme 11/17/2023
没有代码就很难分辨出出哪里出了问题。我还没有测试过,但有 github.com/yorkepb/sample-background-refresh,Apple 有一个示例应用程序:developer.apple.com/documentation/backgroundtasks/......
0赞 de. 11/22/2023
请分享您的代码,以便更轻松地为您提供帮助。

答:

0赞 khyariMed 11/16/2023 #1

若要使应用程序继续在后台处理信息,需要将配置从默认值更新为:

let configuration = URLSessionConfiguration.background(withIdentifier:
                               "com.yourapp.bundleidentifier")

您可以在有关URLSession的非常好的教程中获得有关此内容的更多详细信息

评论

0赞 soundflix 11/17/2023
缺少指向“这个非常好的教程”的链接。
0赞 Mohammad Yasir Perwez 11/17/2023
@khyariMed我尝试了后台配置,但它们似乎确实适用于 get 方法的数据任务。