爲EKCalendar
類國這爲calendarIdentifier
屬性的文檔:EKCalendar中的「完整日曆同步」究竟是什麼?
與日曆完全同步將失去這個標識符。您應該有 的計劃,可以通過緩存其他屬性來處理標識爲 的日曆。
何時發生「完全同步」以及除calendarIdentifier
之外哪些屬性可能發生變化?
爲EKCalendar
類國這爲calendarIdentifier
屬性的文檔:EKCalendar中的「完整日曆同步」究竟是什麼?
與日曆完全同步將失去這個標識符。您應該有 的計劃,可以通過緩存其他屬性來處理標識爲 的日曆。
何時發生「完全同步」以及除calendarIdentifier
之外哪些屬性可能發生變化?
基於iTunes的論壇,當完全同步沒有指定,依賴於他們來說:
http://www.openradar.appspot.com/15671424
相關,其易於改變是所有的人都可以通過其他線程訪問,(比calendarIdentifier
相同)的屬性因此,那些都是非原子和可以改變的,這裏的人,我能找到:
allowsContentModifications, CGColor, immutable,title,type,allowedEntityTypes,source,subscribed,supportedEventAvailabilities
何時發生「完全同步」?
Calendar and Reminders Programming Guide解釋了這個問題,在這樣:如果從您的應用程序之外發生了變化,以日曆數據庫
, 事件套件能夠通過通知,以便您的應用程序可以 行爲適當地檢測改變。使用Event Kit對日曆項目所做的更改爲 自動將同步到關聯的日曆(CalDAV,Exchange和 等)。
我看到的「完全同步」事件這樣的情況下,而你的應用程序是開放的:
用戶發送您的應用程序的背景,並打開日曆應用。他更改日曆名稱,添加/編輯/刪除事件,甚至刪除一些日曆。
2.用戶將某些更改應用於Mac上的iCloud日曆。 iOS設備會收到通知,表示iCloud日曆已更改,因此必須進行同步。
3.第三方應用程序收到無聲通知,iOS在後臺啓動它,應用程序根據通知創建一些日曆事件。
通常意味着「全同步」事件隨時可能發生。
如何檢測並處理「完全同步」事件?
Observing External Changes to the Calendar Database解釋這樣這個問題:
這是可能的另一個進程或應用你的應用程序運行時修改日曆 數據庫。如果您的應用獲取了日曆 事件或提醒,請撥打,您應該註冊以通知日曆數據庫的更改 。通過這樣做,您可以確保顯示給用戶的日曆 和提醒信息是最新的。
這裏是註冊到這樣的通知代碼示例:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storeChanged:)
name:EKEventStoreChangedNotification
object:eventStore];
我覺得很有道理重新EKCalendar
類的實例,如果需要重新緩存calendarIdentifier
。
除calendarIdentifier之外,哪些屬性可能會更改?
我找不到任何有關此問題的文檔。但是由於日曆甚至可能在某個時刻不存在(例如用戶在日曆應用中手動刪除它),那麼在發生「完全同步」事件後,EKCalendar
對象的任何屬性都可能無效。
此外它是有道理的閱讀上述鏈接的更多信息和細節。
添加日曆時發生完全同步。所有添加的日曆都緩存在系統(iOS或MacOS)上並獲得唯一的ID。這可以很容易地檢查在MacOS - 如果你去目錄~/Library/Calendars/
你會看到類似目錄的列表:
3CC21C9A-0B3C-4A76-B2B0-8D3643CF2992.exchange/
45EF644F-672A-453A-ACC9-A565F017F766.calendar/
這是可以與calendarIdentifier
檢查的唯一ID。
爲了測試如何在iOS calendarIdentifier
更改,您可以創建的iCloud日曆名稱爲testcal
和使用下面的代碼來獲取標識符:
EKEventStore *eventStore = [[EKEventStore alloc] init];
NSArray *cal = [eventStore calendarsForEntityType:EKEntityTypeEvent];
for (EKCalendar *i in cal) {
if([i.title isEqualToString:@"testcal"]) {
NSLog(@"%@", i.calendarIdentifier);
}
}
之後,禁用日曆(設置 - > iCloud - >日曆,選擇「從我的iPhone刪除」)並啓用它。當您再次執行代碼時,您將看到不同的標識符,儘管日曆是相同的。
另一種情況是,如果本地緩存損壞,我會看到將執行完全同步。在這種情況下,日曆應該嘗試重建它。
因此,通過標識符查找日曆並不是一個好主意,您可以使用標題,類型,顏色等來唯一標識它。
在這裏你可以找到一些解釋。 http://oleb.net/blog/2012/05/creating-and-deleting-calendars-in-ios/ – Ilan 2013-08-24 08:11:35
這是指使用CalDAV或iCloud日曆同步本地日曆。發生這種情況時,不能再使用'calendarWithIdentifier'檢索本地日曆。所以如果你緩存'calendarIdentifier',它將不會有任何用處。您應該訪問[iCloud日曆](http://stackoverflow.com/questions/13869118/ios-ekevent-store-recreating-icloud-calendars-in-a-loop-wont-save-local),或者文檔建議,緩存日後使用的日曆的屬性值。 – 2015-07-24 20:44:44