😇 공부를 한 내용을 기록한 것으로 틀린 정보가 있을 수 있으며, 피드백은 언제나 환영입니다!
❗️결론부터 말하자면 HealthKit은 share에 대한 권한 허용의 여부는 확인이 가능하지만, read 권한의 허용 여부는 확인이 불가능하다.
만보랑을 만드는 중..
HealthKit의 접근 권한이 무조건 허용했음
으로 나오는 것을 발견하였다.
func authorizedHealthKIt() {
let healthKitTypes = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
self.requestAuthorization(toShare: nil, read: [healthKitTypes]) { success, Error in
if success {
print("헬스킷에 대한 접근을 허용했다.")
// 걸음 수 데이터를 가져오는 코드들
} else {
print("헬스킷에 대한 접근을 거부했다.")
}
}
}
오잉..? 거부를 한 상황에서도 무조건 "헬스킷에 대한 접근을 허용했다."
가 출력되었다.
찾아보니 requestAuthorization에서 의미하는 successs
는 permission뷰가 성공적으로 띄워졌는가? 였다.
그러므로, 아래의 화면이 띄워지면, success
! 이다.
그렇다면 read를 허용했을 때 걸음 수 데이터를 받아오도록 처리하기 위해서는 어떻게 해야 할까?
먼저 HealthKit의 걸음 권한은 toShare
과 read
가 있다.
toShare
: 어플에서 걸음 수를 HealthKit에 쓰는 것.read
: HealthKit의 걸음 수를 어플에서 읽어오는 것.✔︎ 만보랑의 경우에는 애플의 건강 어플에서 걸음 수를 읽어오는 것만이 필요하기 때문에 read권한만 있으면 된다.
👉그런데, 위의 사진을 보면 알 수 있듯이 HealthKit의 authorizationStatus
를 통해서 확인할 수 있는 권한은 다음의 3가지 뿐이다.
.notDetermined
: 권한 설정을 하지 않았다.
.sharingDenied
: share 권한을 거부했다.
.sharingAuthorized
: share 권한을 허용했다.
👉 내가 궁금한 것은 read에 대한 것인데, 이것은 확인이 불가능하다. 어떻게 해야할까?
❗️이 글의 맨 처음에 적어놨듯이, authorizationStatus
를 통해서는 read권한에 대해서 확인할 수 없다고 한다.
🔗https://stackoverflow.com/questions/33018445/how-to-check-if-healthkit-has-been-authorized
그럼 어떠케해..
우선 처음에 했던 방법은
만보랑에서는 처음 어플을 깔았을 때 한 달 전의 데이터를 가져오게 되는데, 대다수의 사용자의 경우에 걸음 수가 한달 동안 0걸음일 확률은 높지 않다.
👉 우선 HealthKit에 접근을 시도하고, 얻어진 한 달 걸음의 수가 0일 경우에 read권한을 허용하지 않았음 으로 간주한다.
한 달 걸음의 수가 0인 경우에는 메인 화면에 접근 권한에 대해 허용해 달라고 표시를 해 두고 어플을 출시했다.
하지만,, 이게 최선일리 없다..!
어플을 열 때마다, 새로운 데이터를 받아와야 하는 것은 어딘가 불편한 지점이 분명..
문득, 저 3가지 옵션들이 모두 아닌 경우라면? read를 허용한 것이 아닐까?
= read를 허용했다는 것은, .notDetermined
도 아니고, 그렇다고 쉐어를 허용한 것.sharingAuthorized
도 아니고, 그렇다고 쉐어를 거부한 것.sharingAuthorized
도 아니니까..
✔︎헬스킷 읽기 접근을 허용하지 않은 경우 authorizationStatus를 확인해 보았다.
오..! 저것을 read허용으로 보면될까❗️ 했지만
ㅋ...근데 이것은..ㅎ.. 건강 허용했을 때에도 똑같음..ㅎ.. 그래서 해결책은 아닌 것으로,, 그래서 0걸음이면 read 허용했다고 간주하는 것으로..
(다소 허무한 결론..도망가겠읍니다)
func requestAuthorization(toShare typesToShare: Set<HKSampleType>?, read typesToRead: Set<HKObjectType>?, completion: @escaping (Bool, Error?) -> Void)
func authorizationStatus(for type: HKObjectType) -> HKAuthorizationStatus
😇 공부를 한 내용을 기록한 것으로 틀린 정보가 있을 수 있으며, 피드백은 언제나 환영입니다!
안녕하세요 잘보고 있습니다~ 만보랑 귀여워요 ><