iOS HealthKit read에 대한 접근 권한 확인(feat. 확인 불가!)

minin·2022년 1월 15일
3

iOS Practices

목록 보기
1/4

😇 공부를 한 내용을 기록한 것으로 틀린 정보가 있을 수 있으며, 피드백은 언제나 환영입니다!

❗️결론부터 말하자면 HealthKit은 share에 대한 권한 허용의 여부는 확인이 가능하지만, read 권한의 허용 여부는 확인이 불가능하다.

1. authorizedHealthKIt에서 success의 의미?

만보랑을 만드는 중..

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! 이다.

2. requestAuthorization을 통해서 read 권한 허용 여부를 확인하려면?

그렇다면 read를 허용했을 때 걸음 수 데이터를 받아오도록 처리하기 위해서는 어떻게 해야 할까?

먼저 HealthKit의 걸음 권한은 toShareread가 있다.

  • 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

3. 나의 해결 과정(feat. 해결 못함 주의)

그럼 어떠케해..

우선 처음에 했던 방법은

만보랑에서는 처음 어플을 깔았을 때 한 달 전의 데이터를 가져오게 되는데, 대다수의 사용자의 경우에 걸음 수가 한달 동안 0걸음일 확률은 높지 않다.

​ 👉 우선 HealthKit에 접근을 시도하고, 얻어진 한 달 걸음의 수가 0일 경우에 read권한을 허용하지 않았음 으로 간주한다.

한 달 걸음의 수가 0인 경우에는 메인 화면에 접근 권한에 대해 허용해 달라고 표시를 해 두고 어플을 출시했다.

하지만,, 이게 최선일리 없다..!

어플을 열 때마다, 새로운 데이터를 받아와야 하는 것은 어딘가 불편한 지점이 분명..

문득, 저 3가지 옵션들이 모두 아닌 경우라면? read를 허용한 것이 아닐까?

= read를 허용했다는 것은, .notDetermined도 아니고, 그렇다고 쉐어를 허용한 것.sharingAuthorized 도 아니고, 그렇다고 쉐어를 거부한 것.sharingAuthorized도 아니니까..

✔︎헬스킷 읽기 접근을 허용하지 않은 경우 authorizationStatus를 확인해 보았다.

오..! 저것을 read허용으로 보면될까❗️ 했지만

ㅋ...근데 이것은..ㅎ.. 건강 허용했을 때에도 똑같음..ㅎ.. 그래서 해결책은 아닌 것으로,, 그래서 0걸음이면 read 허용했다고 간주하는 것으로..

(다소 허무한 결론..도망가겠읍니다)

그래서 결론은

  1. requestAuthorization는 퍼미션 뷰를 보여주는 것에 대한 것.
func requestAuthorization(toShare typesToShare: Set<HKSampleType>?, read typesToRead: Set<HKObjectType>?, completion: @escaping (Bool, Error?) -> Void)
  1. authorizationStatus은 share, 데이터를 HealthKit에 저장하는 권한에 관한 것만 확인이 가능하다.
func authorizationStatus(for type: HKObjectType) -> HKAuthorizationStatus

😇 공부를 한 내용을 기록한 것으로 틀린 정보가 있을 수 있으며, 피드백은 언제나 환영입니다!

profile
🍫 iOS 🍫 Swift

1개의 댓글

comment-user-thumbnail
2022년 10월 19일

안녕하세요 잘보고 있습니다~ 만보랑 귀여워요 ><

답글 달기