0

我的 iPad 上有两 (2) 个日历 (iCal)(一个用于个人,一个用于应用程序)。它们同步到我的 iMac 仅用于测试。(节省了我输入特定应用程序日历的时间)。

我目前正在编写一个需要访问应用程序日历的应用程序。它是 iPad 上的主日历。我试图让 Apple 的 SimpleEKDemo(未修改)与应用程序的日历一起使用,但到目前为止,我什至无法让它不崩溃,更不用说返回任何东西了。几个小时以来,我一直在研究 Google 和 SO 问题,并决定是时候召集大炮了。

这是它崩溃的代码:

- (void)viewDidLoad
{
    self.title = @"Events List";

    // Initialize an event store object with the init method. Initilize the array for events.
    self.eventStore = [[EKEventStore alloc] init];

    self.eventsList = [[NSMutableArray alloc] initWithArray:0];

    // Get the default calendar from store.
    self.defaultCalendar = [self.eventStore defaultCalendarForNewEvents];  //  <---- crashes here    --------

    //  Create an Add button
    UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:
                                      UIBarButtonSystemItemAdd target:self action:@selector(addEvent:)];
    self.navigationItem.rightBarButtonItem = addButtonItem;
    [addButtonItem release];

    self.navigationController.delegate = self;

    // Fetch today's event on selected calendar and put them into the eventsList array
    [self.eventsList addObjectsFromArray:[self fetchEventsForToday]];

    [self.tableView reloadData];
}

这是“崩溃”的输出:

2012-10-05 14:33:12.555 SimpleEKDemo[874:907] defaultCalendarForNewEvents failed: Error Domain=EKCADErrorDomain Code=1013 "The operation couldn’t be completed. (EKCADErrorDomain error 1013.)"

我需要确保我在正确的日历上......我该怎么做?

4

2 回答 2

12

您需要确保在尝试访问 Event Store 之前获得许可。请注意,您只需要调用一次。如果用户拒绝访问,他们需要转到 iOS 设置(请参阅代码中的注释)为您的应用启用权限。

/* iOS 6 requires the user grant your application access to the Event Stores */
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
    /* iOS Settings > Privacy > Calendars > MY APP > ENABLE | DISABLE */
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
     {
         if ( granted )
         {
             NSLog(@"User has granted permission!");
         }
         else
         {
             NSLog(@"User has not granted permission!");
         }
     }];
}

在 iOS 5 中,您只能EKEntityTypeEvent在 Event Store 中访问事件 ( ),这与在 iOS 6 中您可以访问提醒 ( EKEntityTypeReminder) 不同。但是您需要上述代码至少获得 1 次授权。

我还应该提到,在您访问之前,您需要获得许可EventStore,在您的情况下:[self.eventStore defaultCalendarForNewEvents];.

此外,defaultCalendarForNewEvents这将是访问用户默认日历的正确方法。如果您希望访问具有其他名称的日历,则需要遍历日历并根据返回的结果选择适当的日历。

于 2012-10-05T21:38:50.840 回答
3

//检查用户设备上是否安装了iOS6或更高版本* ** * ** * **

if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {

    //Request the access to the Calendar
    [eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted,NSError* error){

        //Access not granted-------------
        if(!granted){
            NSString *message = @"Hey! I Can't access your Calendar... check your privacy settings to let me in!";
            UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Warning"
                                                               message:message
                                                              delegate:self
                                                     cancelButtonTitle:@"Ok"
                                                     otherButtonTitles:nil,nil];
            //Show an alert message!
            //UIKit needs every change to be done in the main queue
            dispatch_async(dispatch_get_main_queue(), ^{[alertView show];});

            //Access granted------------------
        }
        else
        {
            self.defaultCalendar=[self.eventStore defaultCalendarForNewEvents];

        }
    }];
}

//Device prior to iOS 6.0  *********************************************
else{
    self.defaultCalendar=[self.eventStore defaultCalendarForNewEvents];
    }
于 2013-04-24T03:48:55.070 回答