我有一个可能的解决方案,虽然我看到的问题与你描述的略有不同。.userInitiated
qualityOfService
这是快速版本:在 Catalyst上至少使用 a 。
这就是我认为正在发生的事情。
CKOperation.h 提供以下文档:
@discussion CKOperations behave differently depending on how you set qualityOfService.
*
* @code
* Quality of Service | timeoutIntervalForResource | Network Error Behavior | Discretionary Behavior
* -------------------+----------------------------+------------------------+-----------------------
* UserInteractive | -1 (no enforcement) | fail | nonDiscretionary
* UserInitiated | -1 (no enforcement) | fail | nonDiscretionary
* Default | 1 week | fail | discretionary when app backgrounded
* Utility | 1 week | internally retried | discretionary when app backgrounded
* Background | 1 week | internally retried | discretionary
* @endcode
* timeoutIntervalForResource
* - the timeout interval for any network resources retrieved by this operation
* - this can be overridden via CKOperationConfiguration's timeoutIntervalForResource property
*
* Network Error Behavior
* - when a network request in service of a CKOperation fails due to a networking error, the operation may fail with that error, or internally retry the network request. Only a subset of networking errors are retried, and limiting factors such as timeoutIntervalForResource are still applicable.
*
* Discretionary Behavior
* - network requests in service of a CKOperation may be marked as discretionary
* - discretionary network requests are scheduled at the description of the system for optimal performance
*
* CKOperations have a default qualityOfService of Default.
请注意,默认的自主行为是“在应用程序后台运行时自主”,并且自主行为的描述说“自主网络请求被安排在系统的 [自主] 以获得最佳性能”。我认为这就是 Catalyst 中正在发生的事情。如果应用程序不在前台,请求就变成了可自由支配的——即,可延迟的。而且,就我而言,延期似乎是无限期的。
这就是我所看到的。
- 我在 iPhone 上启动了该应用程序
- 我在 Mac 上启动了该应用程序
- 我将 Mac 应用程序置于“后台”(即,它不再处于活动状态)
- 我在 iPhone 上进行了更改
- Mac 收到远程通知
- 为了响应远程通知,Mac 尝试下载(获取)记录
- 下载请求从未完成
这就是我所做的。
我已经CKOperationGroup
为我的所有CKOperation
s 分配了一个值,并且我已经为 分配了一个值defaultConfiguration.qualityOfService
。在 Catalyst 上,我改变了一些东西,所以qualityOfService
我分配的最小值是.userInitiated
. 这使得问题在测试中消失了。(需要明确的是,我尝试了很多事情;这是唯一有效的事情。)我昨晚将一个版本发布到生产环境中,而且——至少到目前为止——我也不再看到那里的问题。
如果不用CKOperationGroup
s,不用担心,qualityOfService
直接在CKOperation
s上设置即可;这应该同样有效,但这并不是我所做的。
我通过反馈向 Apple 提交了一个错误。