将 ios 的活动添加到 google 日历
Add event to google calendar from ios
我按照以下教程从 google 日历中获取事件,效果很好。
https://developers.google.com/google-apps/calendar/quickstart/ios
现在我卡在 iOS 应用程序的插入事件中,因此它也可以与网络同步。请指导我正确的方向或 post 一些示例代码。
我在 viewDidLoad 中使用此代码进行授权
// Initialize the Google Calendar API service & load existing credentials from the keychain if available.
self.service = [[GTLServiceCalendar alloc] init];
self.service.authorizer =
[GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName
clientID:kClientID
clientSecret:kClientSecret];
授权似乎很好,因为获取事件工作得很好。但是我正在使用以下代码添加一个事件
- (void)addAnEvent {
// Make a new event, and show it to the user to edit
GTLCalendarEvent *newEvent = [GTLCalendarEvent object];
newEvent.summary = @"Sample Added Event";
newEvent.descriptionProperty = @"Description of sample added event";
// We'll set the start time to now, and the end time to an hour from now,
// with a reminder 10 minutes before
NSDate *anHourFromNow = [NSDate dateWithTimeIntervalSinceNow:60*60];
GTLDateTime *startDateTime = [GTLDateTime dateTimeWithDate:[NSDate date]
timeZone:[NSTimeZone systemTimeZone]];
GTLDateTime *endDateTime = [GTLDateTime dateTimeWithDate:anHourFromNow
timeZone:[NSTimeZone systemTimeZone]];
newEvent.start = [GTLCalendarEventDateTime object];
newEvent.start.dateTime = startDateTime;
newEvent.end = [GTLCalendarEventDateTime object];
newEvent.end.dateTime = endDateTime;
GTLCalendarEventReminder *reminder = [GTLCalendarEventReminder object];
reminder.minutes = [NSNumber numberWithInteger:10];
reminder.method = @"email";
newEvent.reminders = [GTLCalendarEventReminders object];
newEvent.reminders.overrides = [NSArray arrayWithObject:reminder];
newEvent.reminders.useDefault = [NSNumber numberWithBool:NO];
[self addEvent:newEvent];
}
- (void)addEvent:(GTLCalendarEvent *)event {
GTLQueryCalendar *query = [GTLQueryCalendar queryForEventsInsertWithObject:event
calendarId:@"primary"];
[self.service executeQuery:query
delegate:self
didFinishSelector:@selector(displayAddEventResultWithTicket:finishedWithObject:error:)];
}
- (void)displayAddEventResultWithTicket:(GTLServiceTicket *)ticket
finishedWithObject:(GTLCalendarEvents *)events
error:(NSError *)error {
if (error == nil) {
NSLog(@"I think event has been added successfully!");
} else {
NSLog(@"ERROR : %@", error.localizedDescription);
}
}
但我收到响应错误 "The operation couldn’t be completed. (Insufficient Permission)"
谢谢,
要将事件添加到日历,请使用以下方法
[GTLQueryCalendar queryForEventsInsertWithObject:yourEventObject calendarId:yourCalendarId]
另请注意,您必须授权范围为 kGTLAuthScopeCalendar 才能获得 read/write 访问权限。
我成功完成了这项工作。问题出在您的服务授权方。
每次您的用户登录到您的应用程序时,accesstoken 和 refreshtoken 都会更新,因此您必须创建一个函数,在发送任何类型的请求之前获取授权方的更新值。
我创建了一个函数来在每次需要时检索更新的服务授权器。
试一试。
干杯。
-(GTLServiceCalendar *) updateAuthService{
GTLServiceCalendar *service = [GTLServiceCalendar new];
GTMOAuth2Authentication *auth = [[GTMOAuth2Authentication alloc] init];
[auth setClientID:kClientID];
[auth setClientSecret:kClientSecret];
[auth setUserEmail:[GIDSignIn sharedInstance].currentUser.profile.email];
[auth setUserID:[GIDSignIn sharedInstance].currentUser.userID];
[auth setAccessToken:[GIDSignIn sharedInstance].currentUser.authentication.accessToken];
[auth setRefreshToken:[GIDSignIn sharedInstance].currentUser.authentication.refreshToken];
[auth setExpirationDate: [GIDSignIn sharedInstance].currentUser.authentication.accessTokenExpirationDate];
service.authorizer = auth;
return service;
}
GTLRCalendar_Event *newEvent = [GTLRCalendar_Event new];
newEvent.summary = [NSString stringWithFormat:@"%@(%@)", model.listingName, model.listingType];
newEvent.colorId = @"11";
newEvent.reminders.useDefault = [NSNumber numberWithInt:1];
GTLRDateTime *startDateTime = [GTLRDateTime dateTimeWithDate:timingModel.availableTime];
GTLRCalendar_EventDateTime *startEventDateTime = [GTLRCalendar_EventDateTime new];
startEventDateTime.dateTime = startDateTime;
newEvent.start = startEventDateTime;
GTLRDateTime *endDateTime = [GTLRDateTime dateTimeWithDate:timingModel.closingTime];
GTLRCalendar_EventDateTime *endEventDateTime = [GTLRCalendar_EventDateTime new];
endEventDateTime.dateTime = endDateTime;
newEvent.end = endEventDateTime;
GTLRCalendarService *service = [GTLRCalendarService new];
service.authorizer = user.authentication.fetcherAuthorizer;
GTLRCalendarQuery_EventsInsert *query = [GTLRCalendarQuery_EventsInsert queryWithObject:newEvent calendarId:@"primary"];
[service executeQuery:query completionHandler:^(GTLRServiceTicket * _Nonnull callbackTicket, id _Nullable object, NSError * _Nullable callbackError) {
NSLog(@"%@", @"executed query");
if(callbackError == nil)
{
NSLog(@"%@", newEvent.summary);
}
else
{
NSLog(@"%@", callbackError);
}
}];
我按照以下教程从 google 日历中获取事件,效果很好。 https://developers.google.com/google-apps/calendar/quickstart/ios
现在我卡在 iOS 应用程序的插入事件中,因此它也可以与网络同步。请指导我正确的方向或 post 一些示例代码。
我在 viewDidLoad 中使用此代码进行授权
// Initialize the Google Calendar API service & load existing credentials from the keychain if available.
self.service = [[GTLServiceCalendar alloc] init];
self.service.authorizer =
[GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName
clientID:kClientID
clientSecret:kClientSecret];
授权似乎很好,因为获取事件工作得很好。但是我正在使用以下代码添加一个事件
- (void)addAnEvent {
// Make a new event, and show it to the user to edit
GTLCalendarEvent *newEvent = [GTLCalendarEvent object];
newEvent.summary = @"Sample Added Event";
newEvent.descriptionProperty = @"Description of sample added event";
// We'll set the start time to now, and the end time to an hour from now,
// with a reminder 10 minutes before
NSDate *anHourFromNow = [NSDate dateWithTimeIntervalSinceNow:60*60];
GTLDateTime *startDateTime = [GTLDateTime dateTimeWithDate:[NSDate date]
timeZone:[NSTimeZone systemTimeZone]];
GTLDateTime *endDateTime = [GTLDateTime dateTimeWithDate:anHourFromNow
timeZone:[NSTimeZone systemTimeZone]];
newEvent.start = [GTLCalendarEventDateTime object];
newEvent.start.dateTime = startDateTime;
newEvent.end = [GTLCalendarEventDateTime object];
newEvent.end.dateTime = endDateTime;
GTLCalendarEventReminder *reminder = [GTLCalendarEventReminder object];
reminder.minutes = [NSNumber numberWithInteger:10];
reminder.method = @"email";
newEvent.reminders = [GTLCalendarEventReminders object];
newEvent.reminders.overrides = [NSArray arrayWithObject:reminder];
newEvent.reminders.useDefault = [NSNumber numberWithBool:NO];
[self addEvent:newEvent];
}
- (void)addEvent:(GTLCalendarEvent *)event {
GTLQueryCalendar *query = [GTLQueryCalendar queryForEventsInsertWithObject:event
calendarId:@"primary"];
[self.service executeQuery:query
delegate:self
didFinishSelector:@selector(displayAddEventResultWithTicket:finishedWithObject:error:)];
}
- (void)displayAddEventResultWithTicket:(GTLServiceTicket *)ticket
finishedWithObject:(GTLCalendarEvents *)events
error:(NSError *)error {
if (error == nil) {
NSLog(@"I think event has been added successfully!");
} else {
NSLog(@"ERROR : %@", error.localizedDescription);
}
}
但我收到响应错误 "The operation couldn’t be completed. (Insufficient Permission)"
谢谢,
要将事件添加到日历,请使用以下方法
[GTLQueryCalendar queryForEventsInsertWithObject:yourEventObject calendarId:yourCalendarId]
另请注意,您必须授权范围为 kGTLAuthScopeCalendar 才能获得 read/write 访问权限。
我成功完成了这项工作。问题出在您的服务授权方。
每次您的用户登录到您的应用程序时,accesstoken 和 refreshtoken 都会更新,因此您必须创建一个函数,在发送任何类型的请求之前获取授权方的更新值。
我创建了一个函数来在每次需要时检索更新的服务授权器。
试一试。
干杯。
-(GTLServiceCalendar *) updateAuthService{
GTLServiceCalendar *service = [GTLServiceCalendar new];
GTMOAuth2Authentication *auth = [[GTMOAuth2Authentication alloc] init];
[auth setClientID:kClientID];
[auth setClientSecret:kClientSecret];
[auth setUserEmail:[GIDSignIn sharedInstance].currentUser.profile.email];
[auth setUserID:[GIDSignIn sharedInstance].currentUser.userID];
[auth setAccessToken:[GIDSignIn sharedInstance].currentUser.authentication.accessToken];
[auth setRefreshToken:[GIDSignIn sharedInstance].currentUser.authentication.refreshToken];
[auth setExpirationDate: [GIDSignIn sharedInstance].currentUser.authentication.accessTokenExpirationDate];
service.authorizer = auth;
return service;
}
GTLRCalendar_Event *newEvent = [GTLRCalendar_Event new];
newEvent.summary = [NSString stringWithFormat:@"%@(%@)", model.listingName, model.listingType];
newEvent.colorId = @"11";
newEvent.reminders.useDefault = [NSNumber numberWithInt:1];
GTLRDateTime *startDateTime = [GTLRDateTime dateTimeWithDate:timingModel.availableTime];
GTLRCalendar_EventDateTime *startEventDateTime = [GTLRCalendar_EventDateTime new];
startEventDateTime.dateTime = startDateTime;
newEvent.start = startEventDateTime;
GTLRDateTime *endDateTime = [GTLRDateTime dateTimeWithDate:timingModel.closingTime];
GTLRCalendar_EventDateTime *endEventDateTime = [GTLRCalendar_EventDateTime new];
endEventDateTime.dateTime = endDateTime;
newEvent.end = endEventDateTime;
GTLRCalendarService *service = [GTLRCalendarService new];
service.authorizer = user.authentication.fetcherAuthorizer;
GTLRCalendarQuery_EventsInsert *query = [GTLRCalendarQuery_EventsInsert queryWithObject:newEvent calendarId:@"primary"];
[service executeQuery:query completionHandler:^(GTLRServiceTicket * _Nonnull callbackTicket, id _Nullable object, NSError * _Nullable callbackError) {
NSLog(@"%@", @"executed query");
if(callbackError == nil)
{
NSLog(@"%@", newEvent.summary);
}
else
{
NSLog(@"%@", callbackError);
}
}];