簡體   English   中英

如何使用帶有私有數據庫的 CoreData + CloudKit 更新手表並發症?

[英]How to update watch complications using CoreData + CloudKit with a private database?

我的應用程序使用在 iPhone、手表和 iCloud 之間同步的數據庫。 直到最近,我才使用自定義同步代碼。
特別是,當 iPhone 上的數據發生變化時,手表並發症會通過transferCurrentComplicationUserInfo(_:)進行更新。 這或多或少立即更新了並發症。

新版應用改為使用 CoreData + CloudKit,iPhone 和手表使用私有數據庫自動與 iCloud 同步。
例如,如果 iPhone 更新數據,它會自動上傳到 iCloud,iCloud 會向手表發送無聲推送通知以更新那里的數據。
如果我在手表上打開應用程序,就會應用更新,手表會顯示新數據。 到現在為止還挺好。

問題是在應用程序未在手表上運行時更新並發症數據。
在我當前的版本中,只有在激活應用程序時才會更新並發症。 這顯然不是並發症的想法,我確信我遺漏了一些東西。

即使應用程序終止或在后台,我如何更新並發症?

編輯由於Paulw11的評論:

在 iPhone 上更改數據后,必須盡快更新復雜功能。
由於這種情況隨時可能發生,因此在手表中安排后台刷新任務並不能解決問題。

簡短的回答:

可以使用推送類型的complication向手表發送推送通知,但目前 iCloud 無法做到這一點。
使用 iCloud,必須發送無聲推送,並在本地更新並發症。

長答案:

watchOS 6 實現了PushKit 框架

PushKit 通知不同於您使用用戶通知框架處理的通知。 PushKit 通知不是顯示警報、標記應用程序圖標或播放聲音,而是喚醒或啟動應用程序並給它時間做出響應。

它使用PKPushRegistry對象,該對象可讓您指定PKPushTypecomplication 文件:

使用此類通知提供與 watchOS 應用程序復雜功能相關的更新數據。 watchOS 應用程序的復雜功能必須在用戶當前的鍾面上處於活動狀態。 如果不是,系統不會提供這種類型的推送。 對於 watchOS 6 及更高版本,將推送通知直接發送到 Apple Watch。

壞消息:
PushKit需要遠程通知服務器。 有許多商業服務器允許您使用特定的PKPushType發送推送通知,但 iCloud 沒有。

使用 iCloud,因此也使用 CoreData + CloudKit 鏡像,可以在相應的數據庫中存儲訂閱記錄,生成內部永久查詢。 當查詢觸發時,iCloud 會發送一個靜默的遠程通知。 它會喚醒應用程序,並且有效負載可讓您更新復雜性。
有幾種訂閱類型可以讓 iCloud 響應特定的更改: CKDatabaseSubscriptionCKRecordZoneSubscriptionCKQuerySubscription
CoreData + CloudKit 與私有數據庫的鏡像使用名為com.apple.coredata.cloudkit.zone的特定區域,因此這里CKRecordZoneSubscription可能是合適的, 請參閱此處 它還允許您指定recordType ,以便僅在修改此類型的記錄時發送推送通知。

編輯:

警告:使用靜默遠程通知進行更新的可能性很小,並且並非每次推送都可以處理。 文檔說:

系統將后台通知視為低優先級:您可以使用它們來刷新應用程序的內容,但系統不保證它們的交付。 此外,如果總數過多,系統可能會限制后台通知的傳遞。 系統允許的后台通知數量取決於當前情況,但不要嘗試每小時發送超過兩個或三個。

當設備收到后台通知時,系統可能會保留並延遲通知的傳遞,這可能會產生以下副作用: 當系統收到新的后台通知時,它會丟棄舊的通知,只保留最新的通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM