Saturday, 9 April 2016

Custom Calender

Custom Calender




1)  Write Following Code In NSObject :


* NSObject ( Get Method For add & Remove Event ) 

MyCalendar.h :



#import <Foundation/Foundation.h>

@interface MyCalendar : NSObject


+ (void)requestAccess:(void (^)(BOOL granted, NSError *error))success;
+ (BOOL)addEventAt:(NSDate*)eventDate withEndDate:(NSDate*)endDate withTitle:(NSString*)title inLocation:(NSString*)location latitude: (NSString*)latval longitude:(NSString*)longval ;
+ (BOOL)removeEventAt:(NSDate*)eventDate withEndDate:(NSDate*)endDate withTitle:(NSString*)title inLocation:(NSString*)location;



@end



MyCalendar.m :


#import "MyCalendar.h"
#import <EventKit/EventKit.h>

#import "SQLManager.h"


static EKEventStore *eventStore = nil;
static NSString *savedEventId;

@implementation MyCalendar



+ (void)requestAccess:(void (^)(BOOL granted, NSError *error))callback;
{
    if (eventStore == nil) {
        eventStore = [[EKEventStore alloc] init];
    }
    // request permissions
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:callback];
}


+ (BOOL)addEventAt:(NSDate*)eventDate withEndDate:(NSDate*)endDate withTitle:(NSString*)title inLocation:(NSString*)location latitude: (NSString*)latval longitude:(NSString*)longval ;
{
    EKEvent *event = [EKEvent eventWithEventStore:eventStore];
    EKCalendar *calendar = nil;
    NSString *calendarIdentifier = [[NSUserDefaults standardUserDefaults] valueForKey:@"my_calendar_identifier"];

    // when identifier exists, my calendar probably already exists
    // note that user can delete my calendar. In that case I have to create it again.
    if (calendarIdentifier) {
        calendar = [eventStore calendarWithIdentifier:calendarIdentifier];
    }
    
    // calendar doesn't exist, create it and save it's identifier
    if (!calendar) {
        calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:eventStore];
        
        // set calendar name. This is what users will see in their Calendar app
        [calendar setTitle:@"My Calendar"];
       
           if (calendar.source == nil)
        {
            for (EKSource *source in eventStore.sources)
            {
                
                if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"])
                {
                    if([source calendarsForEntityType:EKEntityTypeEvent].count>0)
                    {     //Check to see if Calendar is enabled on iCloud
                        
                        NSLog(@"iCloud Calendar is Enabled."); //Calendar is Enabled
                        calendar.source = source;
                        
                    }else
                    {
                        
                        NSLog(@"iCloud Calendar is Disabled."); //Calendar is Disabled
                        
                        if (source.sourceType == EKSourceTypeLocal)
                        {
                            calendar.source = source;
                            break;
                        }
                        
                    }
                    
                    break;
                }
                
                else if (source.sourceType == EKSourceTypeLocal)
                {
                    calendar.source = source;
                    break;
                }
            }
        }


        
        // save this in NSUserDefaults data for retrieval later
        NSString *calendarIdentifier = [calendar calendarIdentifier];
        
        NSError *error = nil;
        BOOL saved = [eventStore saveCalendar:calendar commit:YES error:&error];
        if (saved) {
            // saved successfuly, store it's identifier in NSUserDefaults
            [[NSUserDefaults standardUserDefaults] setObject:calendarIdentifier forKey:@"my_calendar_identifier"];
        } else {
            // unable to save calendar
            return NO;
        }
    }
    
    // this shouldn't happen
    if (!calendar) {
        return NO;
    }
    
    // assign basic information to the event; location is optional
        event.calendar = calendar;
        event.location = location;
        event.title = title;


    // set the start date to the current date/time and the event duration to two hours
        NSDate *startDate = eventDate;
        event.startDate = startDate;
        event.endDate =  endDate;
    
        //event.endDate = [startDate dateByAddingTimeInterval:3600 * 2];
    
    EKStructuredLocation* structuredLocation = [EKStructuredLocation locationWithTitle:location];  // locationWithTitle has the same behavior as event.location
    CLLocation *mylocation = [[CLLocation alloc] initWithLatitude:[latval floatValue] longitude:[longval floatValue]];
    structuredLocation.geoLocation = mylocation;
    
    [event setValue:structuredLocation forKey:@"structuredLocation"];
    
    SQLManager *sqlObj = [[SQLManager alloc] init];
    
    [sqlObj createAndOpenDatabase] ;
    
    [[sqlObj getAllUserInfo] valueForKey:@"alertValue"] ;
    
    NSLog(@"%@",[[sqlObj getAllUserInfo] valueForKey:@"alertValue"]);
    
    if (![[[sqlObj getAllUserInfo] valueForKey:@"alertValue"] isEqualToString:@"0"] && ![[[sqlObj getAllUserInfo] valueForKey:@"alertValue"] isEqualToString:@"4"])
    {
        if ([[[sqlObj getAllUserInfo] valueForKey:@"alertValue"] isEqualToString:@"1"])
        {
            
            NSLog(@"%@", event.startDate);
            NSLog(@"%@", eventDate);
            
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"HH:mm"];
            
            NSString *endTimeString = [formatter stringFromDate:event.startDate];
            
            NSDateFormatter *df = [[NSDateFormatter alloc] init] ;
            [df setDateFormat:@"HH:mm"];
            NSDate *date1 = [df dateFromString:endTimeString];
            NSDate *date2 = [df dateFromString:@"08:00"];
            NSTimeInterval interval = [date2 timeIntervalSinceDate:date1];
            
            int hours = (int)interval / 3600;
            int minutes = (interval - (hours*3600)) / 60;
            
            NSString *timeDiff = [NSString stringWithFormat:@"%d:%02d", hours, minutes];
            
            NSLog(@"%f",interval);
            
            NSLog(@"%@",timeDiff);
            
            EKAlarm *enterAlarm = [EKAlarm alarmWithRelativeOffset:interval];
            
            [enterAlarm setProximity:EKAlarmProximityEnter];
            
            [enterAlarm setStructuredLocation:structuredLocation];
            
            [event addAlarm:enterAlarm];
            
            event.alarms = [NSArray arrayWithObject:enterAlarm];

        }
        else if ([[[sqlObj getAllUserInfo] valueForKey:@"alertValue"] isEqualToString:@"2"])
        {
        
            NSTimeInterval interval = 60*120* -1;
            
            EKAlarm *enterAlarm = [EKAlarm alarmWithRelativeOffset:interval];
            
            [enterAlarm setProximity:EKAlarmProximityEnter];
            
            [enterAlarm setStructuredLocation:structuredLocation];
            
            event.alarms = [NSArray arrayWithObject:enterAlarm];
        
        }
        else if ([[[sqlObj getAllUserInfo] valueForKey:@"alertValue"] isEqualToString:@"3"])
        {
            
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"HH:mm"];
            
            NSString *endTimeString = [formatter stringFromDate:event.startDate];
            
            NSDateFormatter *df = [[NSDateFormatter alloc] init] ;
            [df setDateFormat:@"HH:mm"];
            NSDate *date1 = [df dateFromString:endTimeString];
            NSDate *date2 = [df dateFromString:@"08:00"];
            NSTimeInterval interval = [date2 timeIntervalSinceDate:date1];
            
            int hours = (int)interval / 3600;
            int minutes = (interval - (hours*3600)) / 60;
            
            NSString *timeDiff = [NSString stringWithFormat:@"%d:%02d", hours, minutes];
            
            NSLog(@"%f",interval);
            
            NSLog(@"%@",timeDiff);
            
            EKAlarm *enterAlarm = [EKAlarm alarmWithRelativeOffset:interval];
            
            [enterAlarm setProximity:EKAlarmProximityEnter];
            
            [enterAlarm setStructuredLocation:structuredLocation];
            
            [event addAlarm:enterAlarm];
            
            NSTimeInterval interval1 = 60*120* -1;
            
            EKAlarm *enterAlarm1 = [EKAlarm alarmWithRelativeOffset:interval1];
            
            [enterAlarm1 setProximity:EKAlarmProximityEnter];
            
            [enterAlarm1 setStructuredLocation:structuredLocation];
            
            [event addAlarm:enterAlarm1];
            
            event.alarms = [NSArray arrayWithObjects:enterAlarm,enterAlarm1, nil];
            
            
        }
        
    }
   
    NSError *error = nil;
    
    BOOL result = [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
    
    if (result) {
        if ([event respondsToSelector:@selector(calendarItemIdentifier)]) {
            [[NSUserDefaults standardUserDefaults] setObject:event.eventIdentifier forKey:title];
            NSLog(@"Event ID: %@",event.calendarItemIdentifier);
        }
        return YES;
    } else {
       // [[NSUserDefaults standardUserDefaults] setObject:event.UUID forKey:@"eventid"];
        // unable to save event to the calendar
        return NO;
    }
}

    
+ (BOOL)removeEventAt:(NSDate*)eventDate withEndDate:(NSDate*)endDate withTitle:(NSString*)title inLocation:(NSString*)location
{
    EKEventStore *eventStore = [[EKEventStore alloc] init];
    NSLog(@"Event ID: %@",[[NSUserDefaults standardUserDefaults] objectForKey:title]);

    BOOL result;
    NSError* err = nil;
    
    EKEvent *existingEvent = [eventStore eventWithIdentifier:[[NSUserDefaults standardUserDefaults] objectForKey:title]];
        if (existingEvent != nil) {
            
            EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];
            
            [eventStore removeReminder:reminder commit:YES error:&err];
        
            result = [eventStore removeEvent:existingEvent span:EKSpanThisEvent commit:YES error:&err];
           
        }
    if (result) {
         [[NSUserDefaults standardUserDefaults] removeObjectForKey:title];
        return YES;
    } else {
         NSLog(@"Error unsave event: %@", err);
        // unable to save event to the calendar
        return NO;
    }
    
}

@end





2)  Write This Following Code :


* ViewController ( Add & Remove Event ) 

ViewController.m :


#import "ViewController.h"
#import "MyCalendar.h"

@interface ViewController ()
{
           //------------ string for time zone

           NSString *tzName;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self fetchEvents];
    
    // Call Method For Remove
    
   // [self removeEvent];

}

#pragma mark Event Save to Local calender


- (void)fetchEvents
{
    NSDate *startDate = [self setDateManually:@"2016-04-06" time:@"6:36 pm"] ;
    
    NSDate *endDate = [self setDateManually:@"2016-04-10" time:@"9:41 pm"] ;
    
    NSString *calLocation = [NSString stringWithFormat:@"Ahmedabad\nCTM"];
    
    
    [MyCalendar requestAccess:^(BOOL granted, NSError *error) {
        if (granted) {
            BOOL result = [MyCalendar addEventAt:startDate withEndDate:endDate withTitle:@"Birth Day Party"  inLocation:calLocation latitude:@"23.0300" longitude:@"72.5800"];
            if (result) {
                // added to calendar
            } else {
                // unable to create event/calendar
            }
        } else {
            // you don't have permissions to access calendars
        }
    }];
    
    
}

-(NSDate *)setDateManually:(NSString *)dateStr time:(NSString *)time
{
    NSString *temp = [NSString stringWithFormat:@"%@" , dateStr] ;
    
    NSRange stringRange = {0, MIN([temp length], 10)};
    stringRange = [temp rangeOfComposedCharacterSequencesForRange:stringRange];
    
    NSString *shortString = [temp substringWithRange:stringRange];
    
    NSDateFormatter* gmtDf = [[NSDateFormatter alloc] init] ;
    

    NSString *timeZone=[self getTimezone];

    [gmtDf setTimeZone:[NSTimeZone timeZoneWithName: timeZone]];
    [gmtDf setDateFormat:@"yyyy-MM-dd"];
    
    NSDate* gmtDate = [gmtDf dateFromString:shortString];
    
    
    
    NSRange stringRange1 = {0, MIN([time length], 5)};
    stringRange1 = [time rangeOfComposedCharacterSequencesForRange:stringRange1];
    
    NSString *shortString1 = [time substringWithRange:stringRange1];
    
    
    NSString *hourStr = [shortString1 componentsSeparatedByString:@":"][0];
    NSString *minutesStr = [shortString1 componentsSeparatedByString:@":"][1];
    
    NSString *timeSpecific = [time substringFromIndex:[time length] - 2];  //// AM , PM
    
    NSInteger hour ;
    NSInteger minutes ;
    
    
    if([timeSpecific isEqualToString:@"am"])
    {
        hour  = [hourStr intValue];
        minutes  = [minutesStr intValue];
    }
    else
    {
        hour = 12 + [hourStr intValue];
        minutes = [minutesStr intValue];
    }
    
    NSCalendar* usCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian] ;
    [usCalendar setTimeZone:[NSTimeZone timeZoneWithName:timeZone]];
    
    NSDate *d = [usCalendar dateBySettingHour:hour minute:minutes second:0 ofDate:gmtDate options:0];
    
    NSLog(@"date here : %@" , d) ;
    
    return d ;
}

-(NSString *)getTimezone
{
    NSDate *today = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    // display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    NSString *currentTime = [dateFormatter stringFromDate:today];
    
    NSLog(@"User's current time in their preference format:%@",currentTime);
    NSTimeZone *timeZone = [NSTimeZone localTimeZone];
    tzName = [timeZone name];
    return tzName;

}

-(void)removeEvent
{
    NSDate *startDate = [self setDateManually:@"2016-04-06" time:@"6:36 pm"] ;
    
    NSDate *endDate = [self setDateManually:@"2016-04-10" time:@"9:41 pm"] ;
    
    [MyCalendar requestAccess:^(BOOL granted, NSError *error) {
        if (granted) {
            BOOL result = [MyCalendar removeEventAt:startDate withEndDate:endDate withTitle:@"Birth Day Party"  inLocation:@"Ahmedabad"];
            
          
            if (result) {
                // added to calendar
            } else {
                // unable to create event/calendar
            }
        } else {
            // you don't have permissions to access calendars
        }
    }];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

No comments:

Post a Comment