2013-04-09 47 views
19

EKCalendar類國這爲calendarIdentifier屬性的文檔:EKCalendar中的「完整日曆同步」究竟是什麼?

與日曆完全同步將失去這個標識符。您應該有 的計劃,可以通過緩存其他屬性來處理標識爲 的日曆。

何時發生「完全同步」以及除calendarIdentifier之外哪些屬性可能發生變化?

+0

在這裏你可以找到一些解釋。 http://oleb.net/blog/2012/05/creating-and-deleting-calendars-in-ios/ – Ilan 2013-08-24 08:11:35

+1

這是指使用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

回答

0

基於iTunes的論壇,當完全同步沒有指定,依賴於他們來說:

http://www.openradar.appspot.com/15671424

https://idmsa.apple.com/IDMSWebAuth/login?appIdKey=4a75046cda87eab6386a9eae8caabb9824e328b9abc988119b39296495ec184c&path=/login.jspa#926856

相關,其易於改變是所有的人都可以通過其他線程訪問,(比calendarIdentifier相同)的屬性因此,那些都是非原子和可以改變的,這裏的人,我能找到:

allowsContentModifications, CGColor, immutable,title,type,allowedEntityTypes,source,subscribed,supportedEventAvailabilities 
2

何時發生「完全同步」?
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對象的任何屬性都可能無效。

此外它是有道理的閱讀上述鏈接的更多信息和細節。

1

添加日曆時發生完全同步。所有添加的日曆都緩存在系統(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刪除」)並啓用它。當您再次執行代碼時,您將看到不同的標識符,儘管日曆是相同的。

另一種情況是,如果本地緩存損壞,我會看到將執行完全同步。在這種情況下,日曆應該嘗試重建它。

因此,通過標識符查找日曆並不是一個好主意,您可以使用標題,類型,顏色等來唯一標識它。