UIDocumentInteractionController Accès au calendar

J'ai un file ics (Calendar) que UIDocumentInteractionController avec un UIDocumentInteractionController , en utilisant presentOptionsMenuFromRect: Lorsque cela fonctionne, le menu "Ouvrir dans" ressemble à ceci .

Comme vous pouvez le voir, pas d'option "Ajouter au calendar". Voici ce qui m'arrive: j'utilise le même code exact pour un file .vcf (carte de contact), et cela fonctionne comme prévu avec l'option "Open In Contacts" disponible.

Ai-je manqué une sorte de permission dans mon Info.plist pour l'access au calendar? Pourquoi UIDocumentInteractionController ne peut-il pas gérer correctement le type de file .ics , mais .vcf fonctionne correctement? Ces deux types de files sont très similaires. À partir du menu des options, si je m'envoie le file ics par moi-même et l'ouvre à partir de l'application de messagerie, il le lit très bien et je peux append les events à mon calendar, donc je sais que datatables sont valides. J'ai recherché haut et bas pour une solution, et personne ne semble savoir pourquoi l'access de calendar ne fonctionne pas. Certaines questions que j'ai rencontrées restnt sans réponse:

Impossible d'append le file ics au calendar

Comment puis-je avoir UIDocumentInteractionController show Calendar comme une option pour ouvrir un file .ics?

Si Apple le fait délibérément, la seule raison que je peux penser est parce qu'ils préfèrent que les développeurs utilisent EventKit pour append des events à Calendar. Si c'est vrai, cette solution est plutôt frustrante. Toute idée sur ce problème serait très appréciée.

J'ai fini par download le file .ics via ( https://github.com/KiranPanesar/MXLCalendarManager ). J'ai alors pu utiliser EventKit pour parsingr le file .ics téléchargé dans un EKEvent et l'ouvrir via EKEventEditViewController ( https://developer.apple.com/library/prerelease/ios/samplecode/SimpleEKDemo/Listings/Classes_RootViewController_m.html ). Un petit rond-point mais semblait fonctionner. Voici comment je configure ma class de controller webview qui implémente ceci:

 @interface WebViewController : UIViewController <UIWebViewDelegate, EKEventEditViewDelegate> { // EKEventStore instance associated with the current Calendar application @property (nonatomic, strong) EKEventStore *eventStore; // Default calendar associated with the above event store @property (nonatomic, strong) EKCalendar *defaultCalendar; @end @implementation WebViewController - (void)viewDidLoad { [super viewDidLoad]; ... // Initialize the event store self.eventStore = [[EKEventStore alloc] init]; } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = [request URL]; NSSsortingng *path = [url absoluteSsortingng]; NSRange range = [path rangeOfSsortingng:@".ics" options:NSCaseInsensitiveSearch]; if (range.length > 0) { [self checkCalendarAndAddEvent:url]; return NO; } [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; return YES; } -(void)checkCalendarAndAddEvent:(NSURL*)url { EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]; if(status == EKAuthorizationStatusAuthorized) { [self addEventToCalendar:url]; } else { [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { if (granted) { // Let's ensure that our code will be executed from the main queue dispatch_async(dispatch_get_main_queue(), ^{ // The user has granted access to their Calendar; add to calendar [self addEventToCalendar:url]; }); }else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Privacy Warning" message:@"Permission was not granted for Calendar" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } }]; } } -(void) addEventToCalendar: (NSURL *)url { MXLCalendarManager* calendarManager = [[MXLCalendarManager alloc] init]; self.defaultCalendar = self.eventStore.defaultCalendarForNewEvents; [calendarManager scanICSFileAtRemoteURL:url withCompletionHandler:^(MXLCalendar *calendar, NSError *error) { MXLCalendarEvent *mxlEvent = calendar.events.firstObject; EKEventEditViewController *addController = [[EKEventEditViewController alloc] init]; EKEvent * event = [EKEvent eventWithEventStore:self.eventStore]; event.location = mxlEvent.eventLocation; event.startDate = mxlEvent.eventStartDate; event.endDate = mxlEvent.eventEndDate; event.title = mxlEvent.eventSummary; event.notes = mxlEvent.eventDescription; addController.event = event; // Set addController's event store to the current event store addController.eventStore = self.eventStore; addController.editViewDelegate = self; [self presentViewController:addController animated:YES completion:nil]; }]; } @end 

J'ai également dû modifier légèrement certaines parties de MXLCalendarManager.m pour être prêt pour mes types spécifiques de formatting .ics. Par exemple, ma section de résumé de mon file .ics ressemble à:

 DESCRIPTION;LANGUAGE=en-us:The following details your appointment:\n\n\n 

où MXLCalendarManager search uniquement:

 DESCRIPTION: (Something). 

J'ai modifié le code en tant que tel pour tenir count de la; ln. Cela a également supprimé toutes les ruptures de ligne artificielles, mais m'a permis d'append le mien dans la description sommaire:

  // Extract event description [eventScanner scanUpToSsortingng:@"DESCRIPTION" intoSsortingng:nil]; [eventScanner scanUpToSsortingng:@":" intoSsortingng:nil]; [eventScanner scanUpToSsortingng:@"\nSEQUENCE" intoSsortingng:&descriptionSsortingng]; if(descriptionSsortingng.length > 1) { descriptionSsortingng = [descriptionSsortingng subssortingngFromIndex:1]; descriptionSsortingng = [[[descriptionSsortingng ssortingngByReplacingOccurrencesOfSsortingng:@"\nSEQUENCE" withSsortingng:@""] ssortingngByReplacingOccurrencesOfSsortingng:@"\r\n " withSsortingng:@""] ssortingngByReplacingOccurrencesOfSsortingng:@"\\n" withSsortingng:@"\n"]; }