'캘린더'에 해당되는 글 1건

최초 작성일 : 2012/10/04 15:27 


iOS 6.0으로 업그레이드 후 기존 개발한 앱에서

연락처와 캘린더에 접근 못하는 문제가 발생하였다.

이는 iOS 6.0에서 일반 App들이 임의로 사용자의 연락처와 캘린더 정보에
접근할 수 없도록 이 데이터를 사용하고자 하면 사용자의 승인을 받도록
해놓은 때문인데 이 부분을 구현해주지 않으면 디폴트로 접근을 못하게 되어있다.

그리 긴 코드는 아니고 연락처와 캘린더 각각 하나의 메서드를 호출해주면 된다.
수정된 코드는 아래와 같다.

연락처 접근 - 수정 : 아예 공통 함수로 뺐음...

+ (ABAddressBookRef)getAddressBook {

    ABAddressBookRef addressBook;

    if (VERSION5 >= 6.0) {

        CFErrorRef err;

        int stat = ABAddressBookGetAuthorizationStatus();

        NSUserDefaults *userDefault =

                     [NSUserDefaults standardUserDefaults];

        [userDefault setBool:YES forKey:@"ACCESS_CONTACT"];

        

        if (stat == kABAuthorizationStatusAuthorized)

        {

            addressBook =

                  ABAddressBookCreateWithOptions(NULL, &err);

        } else if (stat == kABAuthorizationStatusNotDetermined)         {

            addressBook =

                  ABAddressBookCreateWithOptions(NULL, &err);

            if (!err) {

                ABAddressBookRequestAccessWithCompletion(addressBook,

                                                         ^(bool granted, CFErrorRef error) {

                                                             if (granted) {

                                                                 // Handle the granted

                                                             } else {

                                                                 // Handle the error

                                                                 [userDefault setBool:NO forKey:@"ACCESS_CONTACT"];

                                                             }

                                                         });

            }

        } else {

            addressBook = nil;

            [userDefault setBool:NO forKey:@"ACCESS_CONTACT"];

        }

        [userDefault synchronize];

    } else {

        addressBook = ABAddressBookCreate();

    }

    

    return addressBook;

}


위 내용 중 ABAddressBookRequestAccessWithCompletion 메서드는 연락처에
접근하는 최초 시점에 한 번만 호출해주면 된다.


캘린더 접근

EKEventStore *eventStore = [[EKEventStore allocinit];

if (VERSION5 >= 6.0) {

   [eventStore requestAccessToEntityType:EKEntityTypeEvent                    completion:^(BOOL granted, NSError *error) {


                if (granted){

                    //---- codes here when user allow your app to

                    // access theirs' calendar.

                

                }else

                {

                    //----- codes here when user NOT allow your

                    // app to access the calendar.

                

                }

            }

   ];

}



위와 같이 해주면 연락처나 캘린더 데이터에 접근시 해당 데이터 접근을 허용 할 것인지
묻는 컨펌 창이 뜨고 환경 설정의 개인 정보 영역에 있는 연락처와 캘린더 접근 App 목록에
이 App이 나타나게 된다.

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요