Добавление события в календарь из 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");
}
Другие вопросы по тегам