5

我正在使用 MacCatalyst 将 iOS/iPadOS 应用程序移植到 MacOS。该应用程序以所有方式使用 CloudKit 和功能,除了一个:当从另一台设备提交 CloudKit 更新时,不会在 MacOS 版本上调用UIApplicationDelegate方法didReceiveRemoteNotification

在应用程序中起作用的事情:

  • 提交CKDatabaseOperation包括更新和订阅 CloudKit
  • 从 CloudKit 手动检索数据库更新
  • UIApplicationDelegate方法在调用时didRegisterForRemoteNotificationsWithDeviceToken触发并返回 trueUIApplication.isRegisteredForRemoteNotificationsUIApplication.registerForRemoteNotifications
  • 设置CKSubscription.NotificationInfo以调用在 MacOS 中正确显示的警报通知
  • UNUserNotificationCenterDelegate方法,willPresent当调用警报通知并且应用程序处于前台时
  • didReceiveRemoteNotification在 iOS 和 iPad(物理设备)上

有没有人在使用 MacCatalyst 时调用过UIApplicationDelegate方法?didReceiveRemoteNotification

更新:应用程序最终didReceiveRemoteNotification在发送更新 30 分钟后触发了该方法,但在其他更新中,即使在数小时后也不会触发该方法。有任何想法吗?

4

1 回答 1

0

我有一个可能的解决方案,虽然我看到的问题与你描述的略有不同。.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为我的所有CKOperations 分配了一个值,并且我已经为 分配了一个值defaultConfiguration.qualityOfService。在 Catalyst 上,我改变了一些东西,所以qualityOfService我分配的最小值是.userInitiated. 这使得问题在测试中消失了。(需要明确的是,我尝试了很多事情;这是唯一有效的事情。)我昨晚将一个版本发布到生产环境中,而且——至少到目前为止——我也不再看到那里的问题。

如果不用CKOperationGroups,不用担心,qualityOfService直接在CKOperations上设置即可;这应该同样有效,但这并不是我所做的。

我通过反馈向 Apple 提交了一个错误。

于 2021-11-17T16:36:51.800 回答