반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

[iCloudKit 시리즈 1] 나도 백엔드 있다 - iCloud 세팅과 개념 그리고 유저 연결하기 본문

오뚝이 개발자/SwiftUI

[iCloudKit 시리즈 1] 나도 백엔드 있다 - iCloud 세팅과 개념 그리고 유저 연결하기

rriver2 2024. 9. 27. 14:01
반응형

 💕 iCloud 구현 구현 Intro 

우선 iCloud 구현을 하기 위해서는 개발자 계정이 필요하다. 만약 Apple 개발자 계정을 구매하지 않았더라면, 다음 링크에서 개발자 계정을 등록하고, Xcode도 같은 계정으로 로그인한 다음 구현을 시작하길 바라요..!

 

개발자 계정에 로그인하기 - 시작하기 - 계정 - 도움말 - Apple Developer

동일한 Apple ID를 사용하여 여러 개발 팀에 가입한 경우, 각 팀에 연결된 계정 간 전환이 쉽습니다. 오른쪽 상단에 있는 팀 이름을 클릭하여 메뉴를 열고 팀을 선택합니다.

developer.apple.com

 

 🌷 iCloud 시리즈 목차 

1) iCloud 세팅과 개념 그리고 유저 연결하기

2.1) iCloud CRUD 해보기

2.2) 이미지, 비디오, 오디오 CRUD하기

3) Coredata -> iCloud로 변경하기

3) iCloud Noti 알아보기

4) 여러 에러나 마주했던 문제 상황들 ...


 💕 iCloud 구현 준비 단계 

1️⃣ iCloud 추가

아래와 같은 방법으로 iCloud를 추가한다. 만약 Capability에서 iCloud가 뜨지 않는다면 Xcode가 개발자 계정으로 열려있는지 확인하길 !

 

iCloud를 추가하고 나면 아래와 같이 iCloud 섹션이 생겨난다. 이때 Containers 영역에 Container를 추가하면 되는데 이때 만든 Container는 내가 만든 여러 앱들 사이에서 데이터 공유가 가능해진다! 그리고 이유는 모르겠으나, 한번 만든 Container는 삭제가 안된다고 하더라구요?? ( 숨기기는 가능 ) 그러니 test를 하더라도 이름 깔쌈하게 지으시길 바랍니다 ㅋㅋㅋ !

 

2️⃣ iCloud 홈페이지 탐방하기

방금 화면의 바로 아래에 있는 iCloud console을 클릭하면 iCloud 메인 페이지가 열린다. 

 

이 중 우선은 CloudKit Database를 둘러보자!

 

 

1) Database의 종류

- Public Database : 내 앱을 사용하는 모든 유저들이 공유하는 데이터

ex. 앱을 사용하는 모든 사람들을 위한 데이터(게임의 스코어보드, 공지사항 등), 개발자가 생산한 데이터(앱의 사용성을 높이기 위한 템플릿이나 프리셋 등), 유저들이 공개를 목적으로 생성한 데이터

- Private Database : 한 계정 내에서만 사용하는 데이터

ex. A 유저가 적은 일기

- Share Database : 여러 사용자 간에 데이터를 공유하기 위한 데이터베이스

ex. 사용자들이 협업하거나 특정 데이터를 공유할 때 사용 ( 아직 구현은 안 해봤지만, CKShare 객체가 담긴 링크 같은 걸 황용하지 않을까.. )

 

2) Zones

 

이번에 다루지는 않을 거지만, Zone은 폴더 같은 개념으로 생각하면 된다. Zone A와 Zone A는 다른 Zone이기 때문에 Zone A에 저장한 데이터와 Zone B에 저장한 데이터는 서로 접근할 수 없다. 이는 나중에 어떤 데이터를 공유할 때 Zone A만을 공유하면, Zone B는 공유될 필요 없기 때문에 데이터를 보호하는데 용이하게 사용할 수 있다. 참고로 기본적으로는 _defaultZone으로 들어간다.

 

3) Subcriptions

말 그대로 구독 개념. 그래서 notification을 만들 때 사용된다.

iCloud Notification 보러가기

 

[iCloudKit 시리즈 4] 나도 백엔드 있다 - iCloud Noti 알아보기

🌷 iCloud 시리즈 목차 1) iCloud 세팅과 개념 그리고 유저 연결하기2.1) iCloud CRUD 해보기2.2) 이미지, 비디오, 오디오 CRUD하기3) Coredate -> iCloud로 변경하기3) iCloud Noti 알아보기4) 여러 에러나 마주했

rriver2.tistory.com

 

 

3️⃣ iCloud 기본 설정 이해해보기

⚠️ Preview에서는 iCloud 로그인이 안 되어 있기 때문에 확인할 수 없고, 시뮬레이터나 실 기기로 apple 로그인 한 후 확인이 가능하다.

import SwiftUI
import CloudKit

class CloudKitViewModel: 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 .noAccount:
                    self?.error = CloudKitError.iCloudAccountNotFound.rawValue
                case .couldNotDetermine:
                    self?.error = CloudKitError.iCloudAccountNotDetermined.rawValue
                case .restricted:
                    self?.error = CloudKitError.iCloudAccountRestricted.rawValue
                default:
                    self?.error = CloudKitError.iCloudAccountUnknown.rawValue
                }
            }
        }
    }
    
    enum CloudKitError: String, LocalizedError {
        case iCloudAccountNotFound
        case iCloudAccountNotDetermined
        case iCloudAccountRestricted
        case iCloudAccountUnknown
    }
}

struct CloudKitView: View {
    @StateObject private var vm = CloudKitViewModel()
    
    var body: some View {
        VStack {
            Text("IS SIGNED IN: \(vm.isSignedInToiCloud.description.uppercased())")
            Text(vm.error)
        }
    }
}

#Preview {
    CloudKitView()
}

 

그렇게 로그인을 한 상태로 앱을 빌드하게 되면 해당 container에 아래와 같이 User가 뜨게 된다. 애플에서 이렇게 만들면 돼~ 하면서 예시로 만들어준 소중한 User Record,...

그런데,,

Type is not marked indexable: Users

라는 에러를 마주하게 되죠..?

 

index가 무엇이냐.

iCoud에서는 index를 활용해서 효율적으로 검색할 수 있는 방법을 제공해준다.

Type의 종류에서 확인할 수 있는 것처럼 Queryable, Sortable, Searchable 이렇게 3가지를 확인 할 수 있다. 즉 User에서 만들어 놓은index를 나중에 활용해서 요청, 순서 정렬, 검색 기능으로 활용할 수 있는 것이다. ( 하나하나 다 만들어줘야 한다고 함 ㅎㅎ,, )

Queryable -> 쿼리 검색
Sortable -> 정렬
Searchable -> 검색

 

우왕 그리고 다시 Records로 돌아가서 다시 Users를 선택하고 쿼리를 찍어보니 내가 로그인했던 흔적을 확인할 수 있게 된다.

 

⚠️ 참고로 여기서 뜨는 User는 자동적으로 내 앱에 연결된 icloud 계정을 확인할 수 있는 거지 정식적인(?) 로그인 과정을 거쳐서 성별, 이름, 프로필 사진 등을 입력한 유저가 아니다. 즉, 나중에 정식 로그인을 만들고 그 계정에 사용자 정보를 저장하려면 커스텀한 Record를 새로 만들어서 다른 Record로 저장해야 한다.

이름 밑에 있는 파랑이를 누르면 유저의 자세한 정보를 확인할 수 있다. 앞서 알아봤던 Database 종류와 Zone 등 여러 정보를 확인할 수 있다.

 

 

4️⃣ iCloud를 통해 유저 정보 불러오기

유저 정보를 불러오려면 아래와 같이 요청을 보내야 한다. 애플 아니랄까봐

 // 1️⃣ 너의 정보를 불러와도 되겠니
 func requestPermission() {
        CKContainer.default().requestApplicationPermission([.userDiscoverability]) { [weak self] returnedStatus, returnedError in
            DispatchQueue.main.async {
                if returnedStatus == .granted {
                    self?.permissionStatus = true
                }
            }
        }
    }
 // 2️⃣ 아이클라우드에서 CKRecord.ID 불러오기
    func fetchiCloudRecordID() {
        CKContainer.default().fetchUserRecordID { [weak self] returnedID, returnedError in
            if let id = returnedID {
                self?.discoveriCloudUser(id: id)
            } else {
                // 만약 request를 거절한 경우에는 이름을 물어보는 과정을 따로 추가해야 함
            }
        }
    }
// 3️⃣ CKRecord.ID에 접근해서 정보 가져오기 
    private 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
                }
            }
        }
    }

 

 


 

이번 포스팅에서는 iCloud 세팅과 개념을 알아봤고, 유저 연결까지 해봤슘둥

다음 포스팅에는 본격적으로 iCloud CRUD를 해보자구요 ~

 

 

참고

https://developer.apple.com/documentation/cloudkit/enabling_cloudkit_in_your_app#//apple_ref/doc/uid/TP40014987-CH2

 

Enabling CloudKit in Your App | Apple Developer Documentation

Configure your app to store data in iCloud using CloudKit.

developer.apple.com

https://developer.apple.com/icloud/cloudkit/designing/

 

Designing with CloudKit - iCloud - Apple Developer

CloudKit provides a comprehensive feature set that lets you develop powerful cloud apps effortlessly.

developer.apple.com

 

 

반응형
Comments