2015-01-13 3 views
1

presentOptionsMenuFromRect:을 사용하여 열려는 ics (캘린더) 파일이 UIDocumentInteractionController입니다. 이것이 실행되면 "Open In"메뉴가 this처럼 보입니다.UIDocumentInteractionController 캘린더 액세스

'알 수 있듯이'캘린더에 추가 '옵션은 없습니다. 다음과 같은 이유가 있습니다. .vcf (연락처 카드) 파일에 똑같은 코드를 사용하고 있으며 "연락처에서 열기"옵션을 사용할 수있는 works as expected을 사용할 수 있습니다.

캘린더 액세스를 위해 Info.plist에 일종의 권한이 누락 되었습니까? UIDocumentInteractionController.ics 파일 유형을 올바르게 처리 할 수 ​​없지만 .vcf은 정상적으로 작동합니까? 이 두 파일 유형은 매우 유사합니다. 옵션 메뉴에서 ics 파일을 자신에게 우편으로 보내고 메일 응용 프로그램에서 열면 올바르게 읽습니다. 이벤트가 내 캘린더에 추가되어 데이터가 유효하다는 것을 알 수 있습니다. 나는 높고 낮은 해결책을 찾았고 아무도 캘린더 액세스가 작동하지 않는 이유를 알지 못합니다. 내가 그 건너 한 몇 가지 질문은 답이 남아 : 애플이 의도적으로이 일을하는 경우

Unable to Add ics file to Calendar

How can I have UIDocumentInteractionController show Calendar as an option for opening a .ics file?

들은 개발자가 추가 EventKit를 사용하지 않고 것 때문에, 내가 생각할 수있는 유일한 이유는 이벤트를 캘린더에 보냅니다. 사실이라면 그 해결책은 오히려 실망 스럽습니다. 이 문제에 대한 어떤 통찰력이라도 대단히 감사 할 것입니다.

+0

지금 당장이 문제에 대한 해결책이 있다는 것을 조금은 낙담하게됩니다. 나는 애플에게 버그 리포트를 제출하고 그들이 말할 것이 있는지 알아 보겠다. – Alex

+0

내가 관심이 있으니 아무 것도 찾지 못하면 다시 게시 해주세요 :) – John

+1

EventKit을 사용하여 작업을 마쳤습니다. ics 파일을 전달하는 대신 원시 데이터를 파싱하고 EventKit을 사용하여 모든 이벤트가있는 달력을 만듭니다. 내 생각 엔 애플이 devs가 대신 이것을 사용하는 것을 선호 할 것입니다 (보안은 아마도?). 그 대답은 듣고 싶지 않을 수도 있지만, 유일한 선택 인 것 같습니다. ICS 파일을 전혀 읽을 수없는 많은 Android 기기를 경험했습니다. 내 기기 캘린더에 제 3 자 수입업자 앱이 필요했습니다. 따라서 ICS 파일은 두 그룹 모두에게 최우선 순위가 아닙니다. – Alex

답변

2

(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"]; 
    }