2016-04-22 14 views
1

Watch拡張機能からカレンダーに新しい予定を追加する方法について質問しています。 IOS Appに関連付けられたApple Watch Appの作成に取り掛かっています。時計アプリでは、アプリケーションコンテキストを介してJSON文字列がテーブルビューに読み込まれます。 私がする必要があるのは、ユーザーがテーブルのセルをタップしたときに、時計からiPhoneのカレンダーに新しいイベントを追加する必要があるということです。WatchExtensionからカレンダーに予定を追加する

私はコード

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") 
    } 
} 

の下に使用してアプリから、正常カレンダーにイベントを追加することができるよ私はまだSaveEventとしてウォッチ拡張子からそれを追加してこだわっていますメソッドはWatchOSでは使用できません。 このアクションを実装するにはどうすればよいのですか?

答えて

0

私はこの質問に答えるために、その遅すぎると思いますが、それは私のような誰にも助けている場合、それは私の喜びだろう:) watchOS2からは、直接watchOSからイベントを保存することはできませんし、また、あなたがキーチェーンにアクセスすることはできませんペアになったデバイスの詳細。だからそれをするためには、ペアリングされたデバイスに時計接続フレームワークを介してリクエストを送信し、ペアデバイス(iPhone)にイベントを保存する必要があります。 まず、アプリケーションデリゲートのdidFinishLaunchingとwatchOSのようなiOSとwatchOSの両方のクラスで時計接続を設定します(イベントを追加する場所のビューコントローラの初期化メソッド)。イベントを保存するwatchOS方法で次のステップでその移動後に

#import <WatchConnectivity/WatchConnectivity.h> 

if ([WCSession isSupported]) { 
     WCSession *session = [WCSession defaultSession]; 
     session.delegate = self; 
     [session activateSession]; 
    } 

: - uは返信は次のようにiOSの側の機能をコールバック処理する必要がその後

-(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 ****** 

     }]; 
    } 

: -

- (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}); 

    }]; 
} 

今非常に重要なことは、iOSとwatchOS側

の両方で接続状態を確認し、保持するWatchKitフレームワークのこれらのメソッドを使用することを忘れないでください
#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"); 
} 
関連する問題