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/