이 게시물에서는 Couchbase Mobile을 사용하여 여러 기기에서 iOS 앱과 iOS 앱 확장 프로그램 간에 데이터를 공유하는 방법에 대해 설명합니다. 이전 게시물에서 post에서 독립형 임베디드 데이터 저장소로 Couchbase Lite를 사용하여 동일한 기기에서 iOS 앱과 해당 앱 확장 프로그램 간에 데이터를 공유하는 방법에 대해 설명했습니다. 이 글에서는 이를 확장하여 동기화 게이트웨이를 활용하여 iOS 기기에서 앱과 해당 앱 확장 프로그램 간에 데이터를 동기화할 수 있도록 하려고 합니다.
참고: 당사는 카우치베이스 라이트 v1.4.1 현재 프로덕션 릴리스입니다. 하지만 여기서 설명하는 모든 내용은 최신 릴리스에 적용됩니다. 개발자 프리뷰 버전 2.0 의 Couchbase Mobile.
배경
Swift로 iOS 앱을 개발하는 데 익숙하고 Couchbase Lite를 iOS 앱에 통합하는 것에 대한 기본적인 이해가 있다고 가정하겠습니다. 이 시작하기 가이드 는 시작하기에 좋은 곳입니다.
아직 읽어보지 않으셨다면 다음 내용을 읽어보시기 바랍니다. 관련 블로그 게시물 에서 앱 확장 기능의 기본 사항과 이를 지원하도록 앱을 구성하는 방법에 대해 알아보세요.
이전 게시물에서와 마찬가지로 오늘 확장을 통해 Couchbase Mobile을 사용하는 방법에 대해 설명합니다. "위젯"이라고도 하는 이러한 유형의 확장 프로그램은 알림 센터의 오늘 보기에 표시되며 사용자가 빠른 업데이트를 받을 수 있도록 해 줍니다.
카우치베이스 라이트
Couchbase Lite는 기기에서 실행되는 임베디드 데이터베이스입니다. 여러 배포 모드에서 사용할 수 있습니다. 독립형 임베디드 데이터베이스로 사용하거나 여러 장치에서 데이터를 동기화할 수 있는 원격 동기화 게이트웨이와 함께 사용할 수 있습니다. 이 글에서는 Couchbase Lite와의 통합에 대한 자세한 내용은 다루지 않습니다. 다만 카우치베이스 라이트 시작하기 블로그에서 시작하기 좋은 곳입니다.
동기화 게이트웨이
동기화 게이트웨이는 모바일 앱이 연결하는 인터넷을 향한 구성 요소입니다. 클라이언트 간 데이터 동기화, 라우팅 및 권한 부여를 담당합니다. 데이터를 다음 위치에 유지하도록 구성할 수 있습니다. 카우치베이스 서버. 이 게시물에서는 다음에서 Couchbase Server를 사용합니다. "walrus" 모드를 사용하면 데이터가 인메모리에 유지됩니다. 즉, 이 데모 애플리케이션에서는 동기화 게이트웨이가 Couchbase Server에 의해 지원되지 않습니다. 이는 개발 목적에 적합합니다. 실제 앱에서는 데이터를 서버에 보존하고 싶을 것입니다.
작업 목록 앱 샘플
Github에서 샘플 프로젝트를 다운로드한 후 동기화 지원 branch.
|
1 |
git 복제 git@github.com:카우치바스랩/카우치베이스-모바일-ios-앱-확장.git |
|
1 |
git 결제 동기화 지원 |
샘플 앱은 사용자가 작업을 추가, 편집, 삭제할 수 있는 간단한 작업 목록 앱입니다. 사용자는 작업을 완료로 표시할 수 있습니다. 앱을 열지 않고도 알림 센터에서 바로 상위 2개의 작업을 표시하는 오늘 확장 프로그램이 앱과 함께 번들로 제공됩니다. 사용자는 알림 센터에서 바로 작업을 완료로 표시할 수 있습니다.
모든 작업은 로컬 Couchbase Lite 데이터베이스에 저장되고 원격 동기화 게이트웨이와 동기화되므로 다른 장치의 앱/앱 확장 프로그램에서 변경 사항을 사용할 수 있습니다.
즉, 컨테이너 앱과 확장 프로그램 모두 동기화 게이트웨이와 동기화되는 Couchbase Lite 데이터베이스에 액세스해야 한다는 의미입니다.
동기화 게이트웨이 설치/실행
- 첫째, 다운로드 및 설치 동기화
게이트웨이를 아직 만들지 않았다면요.
- 동기화 게이트웨이를 출시할 예정입니다. 샘플 구성 파일 샘플 앱 리포지토리에서 다운로드했습니다.
- 먼저 다음 내용을 열어 검토해 보겠습니다. 샘플 구성 파일
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "log": ["*"], "CORS": { "Origin":["*"] }, "데이터베이스": { "demo": { "서버": "월러스:", "bucket": "default", "users": { "GUEST": { "disabled": false, "admin_channels": ["*"] } }, "지원되지 않음": { "user_views": { "enabled":true } } } } } |
주목할 만한 몇 가지 항목
- 데이터베이스의 이름은 데모
- 동기화 게이트웨이는 다음 위치에 배포되도록 구성됩니다. 바다코끼리 모드로 설정합니다. 이 모드는 개발 목적으로만 적합합니다.
- 다음을 활성화했습니다. guest 액세스 권한이 필요합니다. 이 기능은 개발 목적으로만 적합합니다. 실제 애플리케이션에서는 게스트 액세스를 비활성화해야 합니다.
- 먼저 샘플 앱 리포지토리를 복제한 폴더로 전환합니다.
|
1 |
cd /경로/에/카우치베이스-모바일-ios-앱-확장 |
- 그런 다음 구성 파일로 동기화 게이트웨이를 시작합니다.
|
1 |
/경로/에/동기화-게이트웨이 동기화-게이트웨이-구성.json |
아키텍처
앱 확장은 독립형 앱이 아닙니다. 앱 확장 프로그램은 앱 내에 번들로 제공되며, 이를 컨테이너 앱. 앱 확장은 컨테이너 앱에 번들로 제공되지만 별도의 프로세스에서 컨테이너 앱과 독립적으로 실행됩니다. 앱 확장은 확장 기능의 기능이 필요한 다른 앱에 의해 실행됩니다. 앱 확장 프로그램을 실행하는 앱을 호스트 앱. 확장 프로그램의 UI는 호스트 앱의 컨텍스트에 표시됩니다.
샘플 앱에서는 CBLiteTaskExtension 는 오늘 위젯 유형의 앱 확장이고 CB라이트태스크앱 는 해당 컨테이너 앱입니다. 시스템 알림 센터 는 사실상 앱 확장 프로그램의 호스트 앱입니다.
컨테이너 앱과 해당 확장 프로그램은 자체 샌드박스에서 실행되는 독립적인 프로세스이지만, 컨테이너 앱과 해당 확장 프로그램은 다음을 통해 데이터를 공유할 수 있습니다. 공유 컨테이너.
즉, Couchbase Lite 데이터베이스가 다음 위치에 있다면 공유 컨테이너이 두 가지를 모두 허용합니다. CBLiteTaskExtension 그리고 CB라이트태스크앱 를 클릭하여 액세스합니다. 그러면 콘텐츠가 앱에서 로컬로 업데이트되었는지 또는 오늘 위젯에서 업데이트되었는지에 관계없이 Couchbase Lite 데이터베이스는 일반적인 방식으로 동기화 게이트웨이에 변경 사항을 푸시업합니다. 마찬가지로 동기화 게이트웨이에서 가져온 변경 사항은 앱과 오늘 위젯 모두에서 사용할 수 있습니다.

공유 컨테이너 설정
공유 컨테이너는 고유한 공유 컨테이너를 등록하여 설정할 수 있습니다. 앱 그룹 를 생성하고 컨테이너 앱과 해당 앱 확장자 모두에서 사용할 수 있도록 활성화합니다.
관련 내용을 검토해 주세요. post 를 사용하도록 앱을 구성하는 방법에 대해 알아보십시오. "앱 그룹"
앱 연습
- 열기
CBLiteApp.xc작업공간Xcode를 사용합니다. 앱은 Xcode 8.3 이상에서 작동해야 하지만, 여러 기기에서 동기화 기능을 테스트할 때 유용한 여러 시뮬레이터 실행을 지원하기 때문에 저는 Xcode 9를 선호합니다. 따라서 옵션이 있다면 Xcode 9를 사용하시기 바랍니다. - 앱 대상 "CBLiteTaskApp"을 선택하여 iOS 시뮬레이터에서 앱을 빌드하고 실행합니다. 이제 알림 센터의 오늘 보기로 전환합니다.
- 아래와 같이 새 확장 프로그램 위젯을 오늘 보기에 추가합니다.

- Xcode 9을 사용하는 경우 두 번째 시뮬레이터에서 앱을 실행하고 앞서 표시된 대로 오늘 보기에 확장 위젯을 추가합니다. 이제 작업 목록 앱을 실행하는 두 개의 시뮬레이터가 생겼습니다.
- 한 시뮬레이터에서 앱을 사용하여 '+' 버튼을 탭하여 몇 가지 작업을 추가합니다. 두 번째 시뮬레이터의 오늘 위젯에서 실시간으로 업데이트되는 것을 확인할 수 있습니다. 하나의 시뮬레이터를 실행 중인 경우 동일한 장치에서 오늘 위젯으로 전환할 수 있습니다. 추가한 작업이 위젯에 표시되는 것을 확인할 수 있습니다.

- 마찬가지로, 한 시뮬레이터에서 오늘 위젯을 통해 작업을 '완료'로 표시합니다. 두 번째 시뮬레이터의 해당 앱에서 실시간으로 상태가 업데이트되는 것을 볼 수 있습니다. 하나의 시뮬레이터를 실행 중인 경우 동일한 기기에서 앱으로 전환할 수 있습니다. 두 번째 시뮬레이터의 완료 상태가

- 이제 동기화 게이트웨이의 동기화 게이트웨이에 작업을 추가합니다. REST API. 새 작업이 앱과 두 시뮬레이터의 오늘 위젯에 모두 실시간으로 표시되는 것을 볼 수 있습니다! 아주 멋지죠!
모든 HTTP 클라이언트를 사용하여 동기화 게이트웨이에서 문서를 업데이트하기 위해 REST API 호출을 할 수 있습니다. 하지만 저는 Postman을 사용하겠습니다.
- 터미널을 열고 데이터베이스에 "task3"라는 작업을 추가하는 다음 curl 명령을 입력합니다.
|
1 2 3 4 5 6 7 8 9 |
curl -X PUT https://localhost:4984/demo/task3 -H '수락: 신청/제이슨' -H '캐시 제어: 캐시 없음' -H '콘텐츠 유형: 애플리케이션/json' -d '{ "createdOn": 1510933574.672683, "isCompleted": false, "name": "task3" }' |
앱과 위젯에 새로 추가된 작업이 표시되어야 합니다.

코드 연습
앱은 [모델-뷰-프레젠터(MVP)패턴.
데이터베이스 관리자
그리고 데이터베이스 관리자 는 모델는 싱글톤 클래스로 구현되어 Couchbase Lite 데이터베이스 관리 기능을 처리합니다. 이 클래스는 카우치베이스 라이트 데이터베이스를 초기화하는 클래스입니다. 공유 컨테이너 이제 앱 확장 및 앱 프로세스 모두에서 사용할 수 있습니다.
열기 DatabaseManager.swift 파일을 찾아 앱그룹컨테이너URL() 함수를 사용합니다. 이 함수는 공유 컨테이너 앱에서 사용하기 위해
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 1. 공유 그룹 컨테이너의 URL 가져오기 let 파일 관리자 = FileManager.기본값 guard let groupURL = 파일 관리자 .containerURL(보안 애플리케이션 그룹 식별자: "group.com.example.CBLiteSharedData") else { 반환 nil } let 저장소 경로 = groupURL.앱딩패스 컴포넌트("CBLite") let storagePath = 저장소 경로.경로 // 2: 공유 컨테이너 위치에 'CBLite'라는 이름의 폴더를 생성합니다; 만약 !파일 관리자.파일 존재(atPath: storagePath) { do { 시도 파일 관리자.createDirectory(atPath: storagePath, 와중간디렉토리: false, 속성: nil) } catch let 오류 { 인쇄("오류 만들기 파일 경로: \(오류)") 반환 nil } } |
- 공유 그룹 컨테이너의 URL을 반환합니다. 그룹 컨테이너는 다음 위치에 저장됩니다. ~/도서관/그룹 컨테이너/
- 공유 그룹 컨테이너에 CBLite라는 폴더를 만듭니다.
찾기 configureCBManagerForSharedData() 함수를 호출합니다. 여기에서 CBLManager 객체에 생성한 폴더의 URL이 포함된 앱그룹컨테이너URL() 함수
|
1 2 3 4 5 6 7 8 9 |
// 카우치베이스 라이트 데이터베이스 폴더의 파일 보호 모드를 설정합니다. let 옵션 = CBLManagerOptions(읽기 전용: false, 파일 보호: 데이터.쓰기 옵션.completeFileProtectionUnlessOpen) let cblp옵션 = UnsafeMutablePointer.할당(용량: 1) cblp옵션.초기화(에: 옵션) 만약 let URL = self.앱그룹컨테이너URL() { // 2. 공유 컨테이너의 디렉터리로 CBLManager를 초기화합니다. _cbManager = 시도 CBLManager.init(디렉토리: URL.상대 경로, 옵션: cblp옵션) } |
- 만들기
CBLManagerOptions객체에 적절한 파일 보호 기능을 추가합니다. 값은 completeFileProtectionUnlessOpen 는 파일이 열려 있지 않으면 파일에 대한 읽기/쓰기 액세스가 제한됨을 의미합니다. - 초기화
CBLManager에 공유 컨테이너 경로를 추가합니다. 그 후 데이터베이스가 생성되면 공유 컨테이너에 데이터베이스가 생성됩니다.
찾기 공유 컨테이너에 데이터베이스 생성() 함수를 호출합니다. 여기에서 CBLManager 함수를 사용하여 Couchbase Lite 데이터베이스를 초기화합니다.
|
1 2 3 4 5 6 |
// 1: 데이터베이스 옵션 설정 let 옵션 = CBLDatabaseOptions() 옵션.storageType = kCBLSQLiteStorage 옵션.create = true // 2: 로그인한 사용자에 대한 DB가 존재하지 않으면 기존 사용자로 핸들을 반환합니다. _db = 시도 _cbManager?.오픈 데이터베이스 이름(kDBName.소문자(), 와 함께: 옵션) |
- 만들기
CBLDatabaseOptions객체 - 초기화
CBLDatabase를 사용하여CBLManager인스턴스가 생성됩니다. 데이터베이스가 생성되면 관리자가 지정한 공유 컨테이너에 생성됩니다.
이제 끝입니다! 이제 앱과 확장 프로그램 모두 읽고 쓸 수 있는 공유 컨테이너에 Couchbase Lite 데이터베이스가 있습니다.
다음 단계는 원격 동기화 게이트웨이로 동기화를 활성화하는 것입니다.
찾기 시작DB풀복제() 함수를 호출합니다. 여기에서 Pull 리플리케이터를 사용하여 동기화 게이트웨이에서 Couchbase Lite 데이터베이스로 데이터를 가져옵니다.
|
1 2 3 4 5 6 7 8 9 |
만약 (pullRepl == nil) { // 1: 원격 소스에서 풀링을 시작하기 위해 풀 복제를 생성합니다. pullRepl = _db?.createPullReplication(URL(문자열: self.kDBName.소문자(), 상대적 대상: URL.init(문자열: kRemoteSyncUrl))!) // 2. 지속적으로 변경 사항 찾기 _pullRepl?.연속 = true } // 3. 풀 리플리케이터를 시작합니다. _pullRepl?.시작() |
- 만들기
CBLR응용풀 리플리케이터 개체 - 연속 모드로 문서를 가져오도록 설정합니다. 이렇게 하면 변경 사항을 실시간으로 전파할 수 있습니다.
- 복제 시작
찾기 시작DB푸시복제() 함수를 호출합니다. 여기에서 푸시 리플리케이터를 사용하여 Couchbase Lite 데이터베이스에서 동기화 게이트웨이로 데이터를 푸시합니다.
|
1 2 3 4 5 6 7 8 9 10 11 |
만약 (_pushRepl == nil) { // 1: 푸시 복제를 생성하여 원격 소스로 푸시를 시작합니다. _pushRepl = _db?.createPushReplication(URL(문자열: self.kDBName.소문자(), 상대적 대상: URL.init(문자열:kRemoteSyncUrl))!) // 2. 지속적으로 변경 사항 푸시 _pushRepl?.연속 = true } // 3. 푸시 리플리케이터를 시작합니다. _pushRepl?.시작() |
- 만들기
CBLR응용푸시 리플리케이터 개체 - 문서를 연속 모드로 푸시하도록 설정합니다. 이렇게 하면 변경 내용을 실시간으로 전파할 수 있습니다.
- 복제 시작
복제를 사용 설정한 후에는 변경사항에 대한 알림을 받을 관찰자를 추가합니다. 이는 복제기에 대한 복제 변경 옵저버 추가() 함수입니다.
이 간단한 단계를 통해 원격 동기화 게이트웨이로 변경 사항을 복제하는 공유 Couchbase Lite 데이터베이스를 확보할 수 있습니다.
작업 발표자
그리고 작업 발표자 는 프레젠터로, 양쪽의 UI 상호작용을 처리합니다. CBLiteTaskExtension 작업 확장 및 CB라이트태스크앱 앱과 인터페이스하고 데이터베이스 관리자. 앱/앱 확장 프로그램과 데이터베이스 관리자 사이의 매개체 역할을 합니다.
검토 TaskPresenter.swift 파일을 열어야 합니다. Couchbase Lite 데이터베이스와 상호 작용하기 위해 CRUD 함수를 구현한 것을 볼 수 있습니다. 하지만 이러한 함수의 구현은 데이터베이스 관리자.
다음 단계는 무엇인가요?
이 게시물에서는 iOS 앱과 해당 투데이 앱 위젯 간에 공유 데이터 저장소로 Couchbase Lite를 얼마나 쉽게 사용할 수 있는지에 대해 설명합니다. 원격 동기화 게이트웨이와 공유 데이터베이스를 동기화하면 이제 여러 기기에서 앱/앱 확장 프로그램 전반의 변경 사항을 복제할 수 있습니다.
궁금한 점이 있으면 언제든지 트위터로 문의해 주세요. @rajagp 또는 이메일을 보내주세요. priya.rajagopal@couchbase.com. 개선 사항을 제안하려면 풀 리퀘스트를 제출하세요. GitHub 리포지토리에 저장하세요. Couchbase Lite와의 통합에 대한 자세한 내용은 이 문서에서 확인할 수 있습니다. 카우치베이스 라이트 시작하기 블로그.
그리고 카우치베이스 포럼 는 질문을 게시할 수 있는 또 다른 좋은 장소입니다.