iOS-在应用关闭的情况下在后台运行网络请求

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res