hachinoBlog

hachinobuのエンジニアライフ

EventKitを使ってカレンダーに登録する方法(iOS6系対応)

EventKitを使って端末カレンダー連携をする際にiOS6系からはプライバシー設定が導入されたので、
アプリから端末カレンダーを操作する許可がない状態でEKEventStoreにアクセスするとクラッシュする。
対応方法としては
1. 端末のiOSが6系以降かどうか調べる
2. 6以降であった場合は許可しているかどうかの状態を取得(EKAuthorizationStatus)
3. EKAuthorizationStatusの値に応じて処理する

初回表示画面に仕込む。
(MyEventManagerは http://d.hatena.ne.jp/hachinobu/20130626/1372222635 参考)

//OSのバージョン判定
NSString *version = [[UIDevice currentDevice] systemVersion];
if ([version floatValue] >= 6.0f) {
  //iOS6対応のプライバシー設定
  //ユーザステータス取得
  EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
  /*
  EKAuthorizationStatusNotDetermined //まだユーザにアクセス許可のアラートを出していない状態
  EKAuthorizationStatusRestricted //iPhoneの設定の「機能制限」でカレンダー・リマインダーへのアクセスを制限している場合
  EKAuthorizationStatusDenied //カレンダー・リマインダーへのアクセスをユーザーから拒否されている場合
  EKAuthorizationStatusAuthorized //カレンダー・リマインダーへのアクセスをユーザーが許可している場合
  */
  //ユーザーにまだアクセスの許可を求めていない場合
  if (status == EKAuthorizationStatusNotDetermined) {
    MyEventManager *eventMg = [MyEventManager sharedInstance];
    [eventMg.sharedEventKitStore requestAccessToEntityType:EKEntityTypeEvent
                                                    completion:^(BOOL granted, NSError *error)
     {
       if(granted) {
         //許可
       } else {
         //それ以外
       }
     }];
   }
}

カレンダーにアクセスする処理をするごとに判定してステータスに応じた処理をする

//ユーザステータス取得
EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];

//許可されていなければアラートを出すなどユーザに通知する
if (status != EKAuthorizationStatusAuthorized) {
  switch (status) {
    case EKAuthorizationStatusRestricted:
      break;
                    
    case EKAuthorizationStatusDenied:
      break;
                    
    default:
      break;
  }
} else {
  //カレンダーアクセス処理

}

ちなみにカレンダーに対して送信したりする処理は特にiOS5以前のコードで大丈夫なので下記を参考にして下さい。
http://d.hatena.ne.jp/hachinobu/20130626/1372222635


参考URL
http://akio0911.net/archives/14014
http://rakuishi.com/iossdk/5498/