Добавление события в календарь из WatchExtension
Я спрашиваю о добавлении нового события в календарь из Watch Extension . Я работаю над созданием приложения Apple Watch, привязанного к приложению IOS, приложение просмотра часов считывает строку JSON, передаваемую ему через контекст приложения в табличном представлении. Что мне нужно сделать, это когда пользователь нажимает на ячейку таблицы, новое событие должно быть добавлено в календарь iPhone с часов.
Я могу добавить событие в календарь успешно из приложения, используя код ниже
func WatchEvent(){
let eventStore = EKEventStore()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let date = dateFormatter.dateFromString("2016-05-28T20:20:00")
let endDate = date!.dateByAddingTimeInterval(1 * 60 * 60) // One hour
if (EKEventStore.authorizationStatusForEntityType(.Event) != EKAuthorizationStatus.Authorized) {
eventStore.requestAccessToEntityType(.Event, completion: {
granted, error in
self.createEvent(eventStore, title: "TestTitile :"+"Dr.Test", startDate: date!, endDate: endDate , alertinterval:-(24 * 60 * 60) , notes: "TestNote" , appointmentlocation: "TestLocation")
})
} else {
self.createEvent(eventStore, title: "TestTitlte :"+"Dr.Test", startDate: date!, endDate: endDate , alertinterval:-(24 * 60 * 60) , notes: "TestNote" , appointmentlocation: "TestLocation")
}
}
//==================================================================
func createEvent(eventStore: EKEventStore, title: String, startDate: NSDate, endDate: NSDate, alertinterval:NSTimeInterval , notes: String , appointmentlocation: String) {
let event = EKEvent(eventStore: eventStore)
event.title = title
event.startDate = startDate
event.endDate = endDate
event.calendar = eventStore.defaultCalendarForNewEvents
var interval = NSTimeInterval()
interval = alertinterval
//-(24 * 60 * 60) // -(30 * 60) // -(24 * 60 * 60)
let alarm = EKAlarm(relativeOffset: interval)
event.addAlarm(alarm)
event.notes = notes
event.location = appointmentlocation
do {
try eventStore.saveEvent(event, span: .ThisEvent)
// savedEventId = event.eventIdentifier
} catch {
print("Error Happened")
}
}
но я все еще застрял с добавлением его из расширения Watch, так как метод SaveEvent недоступен в WatchOS . Итак, что я могу сделать, чтобы реализовать это действие на Apple Watch?
1 ответ
Я думаю, что уже слишком поздно, чтобы ответить на этот вопрос, но если это поможет кому-то, как я, это будет мое удовольствие:) С watchOS2 вы не можете сохранить событие непосредственно из watchOS, а также вы не можете получить доступ к деталям цепочки для ключей с сопряженных устройств. Таким образом, для этого вам нужно отправить запрос через платформу отслеживания соединений на сопряженные устройства и попытаться сохранить событие на сопряженном устройстве (iPhone). Прежде чем что-либо делать, сначала настройте связность часов в классах iOS и watchOS, таких как делегат приложения didFinishLaunching
и watchOS любой метод инициализации контроллеров представления (откуда вы хотите добавить событие).
#import <WatchConnectivity/WatchConnectivity.h>
if ([WCSession isSupported]) {
WCSession *session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
}
после этого перейдите к следующему шагу, который является методом watchOS для сохранения события:-
-(void)addEventToDeviceCalendar
{
self.eventStore = [[EKEventStore alloc] init];
[self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
NSMutableDictionary *eventInfoDict = [NSMutableDictionary new];
self.defaultCalendar = [self.eventStore defaultCalendarForNewEvents];
EKEvent *event = [EKEvent eventWithEventStore:self.eventStore];
event.title = title;
[eventInfoDict setObject:title forKey:@"eventTitle"];
if (eventDate)
{
NSString *dateString = eventDate;
//dateString = [NSString stringWithFormat:@"%@ %@",eventDate,@"09:00:00"];
if (eventTime) {
dateString = [NSString stringWithFormat:@"%@ %@",eventDate,eventTime];
[eventInfoDict setObject:@YES forKey:@"eventTime"];
}
[eventInfoDict setObject:dateString forKey:@"eventDate"];
NSDate *date = [[MyDataObject sharedInstance] dateFromDateString:dateString];
event.startDate = date;
}
else{
event.startDate = [NSDate date]; //today
}
event.endDate = [event.startDate dateByAddingTimeInterval:60*60]; //set 1 hour meeting
event.location = venue;
[eventInfoDict setObject:venue forKey:@"location"];
event.notes = description;
[eventInfoDict setObject:description forKey:@"notes"];
[event setCalendar:self.defaultCalendar];
NSMutableDictionary *trackDict = [[NSMutableDictionary alloc] init];
[trackDict setObject:kAppleWatchAddEvent forKey:kRequestTypeWatchKit];
[trackDict setValue:eventInfoDict forKey:kAppleWatchEvent];
// Only if using WatchOS 2 or higher
[[WCSession defaultSession] sendMessage: trackDict
replyHandler:^(NSDictionary *replyHandler) {
NSString *obj = [replyHandler valueForKey:@"reply"];
NSLog(@"%@",obj);
if ([obj isEqual:kAppleWatchAddEvent])
{
savedEventId = event.eventIdentifier;
}
}
errorHandler:^(NSError *error) {
}
];
//[self.eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; ******* Watch OS does not support save or remove event ******
}];
}
После этого вам нужно обработать функцию ответного обратного вызова на стороне iOS следующим образом:
- (void)session:(nonnull WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message replyHandler:(void(^)(NSDictionary<NSString *,id> *))replyHandler {
NSString *requestType = message[kRequestTypeWatchKit];
if ([requestType isEqual:kAppleWatchAddEvent]) {
NSMutableDictionary *event = message[kAppleWatchEvent];
[self addWatchEventToDeviceCalendar:event replyHandler:^(NSDictionary *replyHandlerForWatch) {
replyHandler(replyHandlerForWatch);
}];
}
}
-(void)addWatchEventToDeviceCalendar:(NSMutableDictionary *)eventObj replyHandler:(void(^)(NSDictionary<NSString *,id> *))replyHandler
{
[self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { replyHandler(@{@"reply":@"notAdded"}); }
self.defaultCalendar = [self.eventStore defaultCalendarForNewEvents];
EKEvent *event = [EKEvent eventWithEventStore:self.eventStore];
event.title = [eventObj objectForKey:@"eventTitle"];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setLocale:[NSLocale localeWithLocaleIdentifier:[APP_DELEGATE LanguageCode]]];
if (eventObj[@"eventTime"]) {
[df setDateFormat:@"EEE MMM d h:mma"];
}else{
[df setDateFormat:@"EEE MMM d"];
}
if (eventObj[@"eventDate"])
{
NSString *dateString = [eventObj objectForKey:@"eventDate"];
NSDate *date = [df dateFromString:dateString];
event.startDate = date;
}
else{
event.startDate = [NSDate date]; //today
}
event.endDate = [event.startDate dateByAddingTimeInterval:60*60]; //set 1 hour meeting
event.location = [eventObj objectForKey:@"location"];
event.notes = [eventObj objectForKey:@"notes"];
[event setCalendar:self.defaultCalendar];
NSError *err = nil;
[self.eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
replyHandler(@{@"reply":kAppleWatchAddEvent});
}];
}
Теперь очень важная вещь, пожалуйста, не забудьте использовать эти методы среды WatchKit для проверки и сохранения состояния подключения как на iOS, так и на стороне WatchOS.
#pragma mark - Standard WatchKit Delegate
- (void)sessionDidDeactivate:(WCSession *)session
{
if(WCSession.isSupported){
WCSession* session = WCSession.defaultSession;
session.delegate = self;
[session activateSession];
}
}
-(void)sessionWatchStateDidChange:(nonnull WCSession *)session
{
if(WCSession.isSupported){
WCSession* session = WCSession.defaultSession;
session.delegate = self;
[session activateSession];
if(session.reachable){
NSLog(@"session.reachable");
}
if(session.paired){
if(session.isWatchAppInstalled){
if(session.watchDirectoryURL != nil){
}
}
}
}
}
#pragma mark - WatchKit Handlers
- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState
error:(NSError *)error
{
NSLog(@"PHONE - activationDidCompleteWithState");
}