如何解决iOS-在应用关闭的情况下在后台运行网络请求
您好,我目前正在开发一个跨平台(本机Java和Swift / Objective-C)移动应用程序,在该应用程序中,用户可能经常无法访问网络,但是我们希望在出现以下情况时记录并发送统计信息:网络已可用,即使我们的应用程序已关闭。我们已经可以通过Android的 Background:
* def token = TOKEN
* def handler = function(msg){ return msg.startsWith('a[')}
* def socket = karate.webSocket(WS_HOST + 'socket/761/f4t0so3p/websocket',handler)
Scenario: Demo Real
checking dcube-dev
* def body = {"type": "1ffe4b5d___AC_GET_MY_AVAILABLE_TASKS___N","token": '#(token)',"content": {"msg":null,"counter_api_enabled":false} }
* print "Body:",body
* socket.send( '#(body)')
库在Android上轻松完成此操作,就像这样:
AndroidX.WorkManager
这很好用,当我们的应用程序调用此方法时,我们的请求被添加到队列中,即使用户脱机并关闭我们的应用程序,当他们重新连接到网络时,我们的请求仍然会发出。
但是,我一直在努力寻找与该API等效的iOS,而且对于本机iOS开发我还是很陌生。我们已启用了后台任务功能,并在项目的String URL = "https://myexampleurl.com";
Data inputData = new Data.Builder()
.putString("URL",URL)
.build();
Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(NetworkWorker.class)
.setInputData(inputData)
.setConstraints(constraints)
.build();
WorkManager.getInstance(context).enqueueUniqueWork("com.lkuich.exampleWorker",ExistingWorkPolicy.APPEND_OR_REPLACE,workRequest);
中注册了我们的标识符。
首先,我们尝试使用Plist.info
“后台” API,如下所示:
URLSession
在禁用和重新启用WiFi的情况下,此方法效果很好,但如果关闭了应用程序,请求似乎就永远不会发送。
因此我们改用了class NetworkController: NSObject,URLSessionTaskDelegate {
func buildTask() -> URLSession {
let config = URLSessionConfiguration.background(withIdentifier: "com.lkuich.exampleWorker")
config.waitsForConnectivity = true
config.shouldUseExtendedBackgroundIdleMode = true
return URLSession(configuration: config,delegate: self,delegateQueue: OperationQueue.main)
}
func makeNetworkRequest(session: URLSession) {
let url = URL(string: "https://myexampleurl.com")!
let task = session.dataTask(with: url)
task.resume()
}
func urlSession(_ session: URLSession,task: URLSessionTask,didCompleteWithError error: Error?) {
print("We're done here")
}
}
,但是我很难测试它是否在关闭应用程序的情况下在后台运行,因为它通常要花几个小时才能真正运行(强制它在运行时立即运行)。网络连接有效):
BGTaskScheduler
总的来说,我的问题是,即使调用应用程序已关闭,是否可以安排网络请求在网络可用时在后台运行?如果是这样,由于我的任务必须在应用启动时进行注册,我该如何将输入数据(例如URL args)传递给后台任务?
谢谢你,洛伦K
解决方法
已关闭的应用程序可能有两种状态。它处于后台中,或者被杀死。应用可能会由于各种原因被系统杀死,也可能被用户从应用切换器中杀死它。
这很重要,因为当应用程序被终止时,您无法在后台执行任何操作。仅 VoIP 应用程序是例外(使用 PushKit ;如果该应用程序不具有VoIP功能,则现在可以使用该应用程序,您将无法通过 AppStore )和watchOS的复杂性。但是对于所有其他应用程序,当该应用程序被杀死时,您根本没有选择。那只是Apple的标准,他们不希望出于安全原因,未运行的应用能够运行代码。
使用您提到的 BGTask API,您可以在应用程序仍在后台运行时注册一些要完成的任务。我对其中一个应用程序使用了相同的API,但发现它极不稳定。有时,一项任务每30分钟执行一次,然后直到明天早晨才执行,然后一次将完全停止执行。
因此,我认为静默的推送通知是最好的解决方法,但它们也仅在应用程序仍在后台而不被杀死时才起作用。除非您的应用程序具有VoIP功能,否则您可以使用PushKit。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。