[SwiftUI Mater] #21 CloudKit: Setup & User info

Woozoo·2023년 4월 16일
0

[SwiftUI Review]

목록 보기
36/41
post-custom-banner



container는 우선은 bundle identifier랑 같게 해줌
container 한번 만들면 삭제 안되니까 주의!

그리고 나서 CloudKit Console버튼 누르면 콘솔창이 열린다!

그러고 나서 Database에 들어가면 요런 창을 볼 수 있음




다시 엑코로 돌아와서 뷰모델 만들고 init될 때 뭔가를 해주려고함
import CloudKit해주고!
CKContainer.default().accountStatus를 작성해줬다
CKContainer는 클라우드킷 컨테이너!

한가지 알아야될건 이 앱을 사용하는 유저도 iCloud 어카운트가 있어야함

import SwiftUI
import CloudKit

class CloudKitUserBootcampViewModel: ObservableObject {
    @Published var isSignedInToiCloud: Bool = false
    @Published var error: String = ""
    
    init() {
        getiCloudStatus()
    }
    
    private func getiCloudStatus() {
        CKContainer.default().accountStatus { [weak self] returnedStatus, returnedError in
            DispatchQueue.main.async {
                switch returnedStatus {
                case .available:
                    self?.isSignedInToiCloud = true
                case .couldNotDetermine:
                    self?.error = CloudKitError.iCloudAccountNotDetermined.localizedDescription
                case .restricted:
                    self?.error = CloudKitError.iCloudAccountRestricted.localizedDescription
                case .noAccount:
                    self?.error = CloudKitError.iCloudAccountNotFound.localizedDescription
                case .temporarilyUnavailable:
                    self?.error = CloudKitError.iCloudIsUnavailable.localizedDescription
                default:
                    self?.error = CloudKitError.iCloudAccountUnkown.localizedDescription
                }
            }
        }
    }
    
    enum CloudKitError: LocalizedError {
        case iCloudAccountNotFound
        case iCloudAccountNotDetermined
        case iCloudAccountRestricted
        case iCloudAccountUnkown
        case iCloudIsUnavailable
    }
    
}

returnedStatus에 따라서 enum타입의 Error가 나눠지게 해줬다!

iCloud 로그인 하고 다시 키면 에러가 안뜨는 걸 볼 수 있음



이제 Records를 보려고 하는데
Users의 index를 먼저 설정해줘야함


그럼 유저가 뜨는 것을 볼 수 있습니다

여기서 주의할 건 Users가 프로필 같은 Users로 쓰이는 게 아니라
iCloud에 로그인한 유저를 나타내는 용도로 쓰인다는거!


iCloud에 로그인한 유저가 기록되면 그 유저의 정보를 가지고 와서 사용하는 것도 가능함
예를들면 핸드폰번호나 이메일, 이름 같은 것들

func fetchiCloudUserRecordID() {
    CKContainer.default().fetchUserRecordID { [weak self] returnedID, returnedError in
        if let id = returnedID {
            self?.discoveriCloudUser(id: id)
        }
    }
}

func discoveriCloudUser(id: CKRecord.ID) {
    CKContainer.default().discoverUserIdentity(withUserRecordID: id) { [weak self] returnedIdentity, returnedError in
        DispatchQueue.main.async {
            if let name = returnedIdentity?.nameComponents?.givenName {
                self?.userName = name
            }
        }
    }
}

이게 fetch해서 유저의 정보를 가져오는 코드인데
이거 request 요청도 해서 유저의 허락도 받아야함!!


그리고 init에서 이제 순서대로 해주면 됩니다

요 화면이 안뜰 때는 apple 계정 로그아웃 하고 다시 로그인해주면 뜸!!

캬! 내 이름이 나온다!!

profile
우주형
post-custom-banner

0개의 댓글