(https://github.com/KiranPanesar/MXLCalendarManager)을 통해 .ics 파일 다운로드가 끝났습니다. 그런 다음 EventKit을 사용하여 다운로드 한 .ics 파일을 EKEvent로 구문 분석하고 EKEventEditViewController (https://developer.apple.com/library/prerelease/ios/samplecode/SimpleEKDemo/Listings/Classes_RootViewController_m.html)를 통해 열 수있었습니다. 조금 돌아서지만 작동하는 것 같았다. 여기에 얼마나이 구현 내가 설정 내 웹보기 컨트롤러 클래스 :
나는 또한 약간의 서식을 .ics 내 특정 유형에 대한 준비를 MXLCalendarManager.m의 일부를 수정했다
@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];
NSString *path = [url absoluteString];
NSRange range = [path rangeOfString:@".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
.
DESCRIPTION;LANGUAGE=en-us:The following details your appointment:\n\n\n
이 MXLCalendarManager 만 찾고 있습니다으로 : :; LN
DESCRIPTION: (Something).
나는에 대한 계정에 같은 코드를 수정 같은 예를 들어, 내을 .ics 파일의 내 요약 섹션 보인다. 이것은 또한 모든 인공 줄 바꿈을 제거했지만 요약 설명에 내 자신을 추가 할 수있었습니다.
// Extract event description
[eventScanner scanUpToString:@"DESCRIPTION" intoString:nil];
[eventScanner scanUpToString:@":" intoString:nil];
[eventScanner scanUpToString:@"\nSEQUENCE" intoString:&descriptionString];
if(descriptionString.length > 1)
{
descriptionString = [descriptionString substringFromIndex:1];
descriptionString = [[[descriptionString stringByReplacingOccurrencesOfString:@"\nSEQUENCE" withString:@""] stringByReplacingOccurrencesOfString:@"\r\n " withString:@""] stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];
}
지금 당장이 문제에 대한 해결책이 있다는 것을 조금은 낙담하게됩니다. 나는 애플에게 버그 리포트를 제출하고 그들이 말할 것이 있는지 알아 보겠다. – Alex
내가 관심이 있으니 아무 것도 찾지 못하면 다시 게시 해주세요 :) – John
EventKit을 사용하여 작업을 마쳤습니다. ics 파일을 전달하는 대신 원시 데이터를 파싱하고 EventKit을 사용하여 모든 이벤트가있는 달력을 만듭니다. 내 생각 엔 애플이 devs가 대신 이것을 사용하는 것을 선호 할 것입니다 (보안은 아마도?). 그 대답은 듣고 싶지 않을 수도 있지만, 유일한 선택 인 것 같습니다. ICS 파일을 전혀 읽을 수없는 많은 Android 기기를 경험했습니다. 내 기기 캘린더에 제 3 자 수입업자 앱이 필요했습니다. 따라서 ICS 파일은 두 그룹 모두에게 최우선 순위가 아닙니다. – Alex