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 계정 로그아웃 하고 다시 로그인해주면 뜸!!
캬! 내 이름이 나온다!!