ios - ¿Qué constituye exactamente una "sincronización de calendario completa" en EKCalendar?
objective-c eventkit (3)
La documentación para la clase EKCalendar
establece esto para la propiedad calendarIdentifier
:
Una sincronización completa con el calendario perderá este identificador. Debe tener un plan para tratar con un calendario cuyo identificador ya no se pueda recuperar almacenando en caché sus otras propiedades.
¿Cuándo ocurre exactamente una "sincronización completa" y qué propiedades pueden cambiar además del calendarIdentifier
?
La sincronización completa ocurre cuando se agrega un calendario. Todos los calendarios agregados se almacenan en caché en el sistema (iOS o MacOS) y reciben una ID única. Esto se puede consultar fácilmente en MacOS: si va al directorio ~/Library/Calendars/
verá una lista con directorios como:
3CC21C9A-0B3C-4A76-B2B0-8D3643CF2992.exchange/
45EF644F-672A-453A-ACC9-A565F017F766.calendar/
cuáles son las ID únicas que pueden verificarse con calendarIdentifier
.
Para probar cómo cambia el testcal
calendarIdentifier
en iOS, puede crear un calendario en iCloud con el nombre testcal
y usar el siguiente código para obtener el identificador:
EKEventStore *eventStore = [[EKEventStore alloc] init];
NSArray *cal = [eventStore calendarsForEntityType:EKEntityTypeEvent];
for (EKCalendar *i in cal) {
if([i.title isEqualToString:@"testcal"]) {
NSLog(@"%@", i.calendarIdentifier);
}
}
Después de eso, deshabilite el calendario (Configuración -> iCloud -> Calendarios, elija "Eliminar de mi iPhone") y habilítelo. Cuando vuelva a ejecutar el código, verá un identificador diferente, aunque el calendario sea el mismo.
Otro caso en el que veo que se ejecutará una sincronización completa es si la memoria caché local está dañada. En este caso el calendario debería intentar reconstruirlo.
Por lo tanto, no es una buena idea encontrar un calendario por su identificador y puede usar el título, tipo, color y etc. para identificarlo de forma única.
Según el foro de iTunes, cuando está completo, la sincronización no está especificada y depende de ellos:
http://www.openradar.appspot.com/15671424
Relacionadas con las propiedades que son susceptibles de cambiar están todas a las que se puede acceder mediante otros subprocesos, (igual que calendarIdentifier
), por lo tanto, las que no son atómicas y que se pueden cambiar, aquí las que puedo encontrar:
allowsContentModifications, CGColor, immutable,title,type,allowedEntityTypes,source,subscribed,supportedEventAvailabilities
¿Cuándo ocurre exactamente una "sincronización completa"?
La Guía de programación de calendarios y recordatorios explica estas preguntas de esta manera:
Si se produce un cambio en la base de datos del Calendario desde fuera de su aplicación, Event Kit puede detectar el cambio mediante una notificación para que su aplicación pueda actuar adecuadamente. Los cambios realizados en los elementos del calendario con el Kit de eventos se sincronizan automáticamente con el calendario asociado (CalDAV, Exchange, etc.).
Veo tales escenarios de eventos de "sincronización completa" mientras su aplicación está abierta:
1. El usuario envía su aplicación al fondo y abre la aplicación Calendario. Cambia el nombre del calendario, agrega / edita / elimina eventos o incluso elimina algunos calendarios.
2. El usuario aplica algunos cambios al calendario de iCloud en Mac. Se notifica al dispositivo iOS que el calendario de iCloud se modificó, por lo que debe sincronizarse.
3. La aplicación de terceros recibe una notificación silenciosa, iOS la inicia en segundo plano, la aplicación crea algún evento de calendario basado en la notificación.
En general, significa que el evento de "sincronización completa" puede ocurrir en cualquier momento.
¿Cómo detectar y manejar el evento de "sincronización completa"?
La observación de cambios externos en la base de datos del calendario explica estas preguntas de esta manera:
Es posible que otro proceso o aplicación modifique la base de datos del Calendario mientras se ejecuta su aplicación. Si su aplicación obtiene eventos del calendario o recordatorios, debe registrarse para recibir notificaciones sobre los cambios en la base de datos del Calendario. Al hacerlo, se asegura de que la información del calendario y el recordatorio que muestra al usuario es actual.
Aquí está el ejemplo del código para registrarse a dicha notificación:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storeChanged:)
name:EKEventStoreChangedNotification
object:eventStore];
Creo que tiene sentido recrear instancias de clases EKCalendar y volver a asignar el ID de calendarIdentifier
si es necesario.
¿Qué propiedades son susceptibles de cambiar además del calendarIdentifier?
No puedo encontrar ninguna documentación sobre esta pregunta. Pero como el calendario puede incluso no existir en algún momento (por ejemplo, el usuario lo elimina manualmente en la aplicación Calendario), entonces cualquier propiedad del objeto EKCalendar
puede no ser válida después de que ocurra el evento de "sincronización completa".
También tiene sentido leer los enlaces anteriores para obtener más información y detalles.