103 세션의 카우치베이스 라이브 뉴욕 모바일 트랙에서 두 개 이상의 장치 간에 피어 투 피어 동기화를 활성화할 수 있는 Couchbase Lite의 기능을 살펴봤습니다. 에서 "카우치베이스 모바일 103: 카우치베이스 모바일로 P2P 앱 구축하기" 슬라이드에서 사진 공유 애플리케이션이 P2P 기능을 통해 Couchbase Lite를 실행하는 다른 클라이언트 장치와 사진을 교환할 수 있도록 하는 코드와 구성 요소를 자세히 살펴봤습니다.
P2P PhotoDrop 샘플 애플리케이션은 다음용 GitHub 리포지토리에서 찾을 수 있습니다. iOS 그리고 Android. 이 블로그에서는 카우치베이스 103 세션에서 소개된 카우치베이스 라이트의 기능 및 API와 사진 공유 샘플에 있는 일부 코드를 개괄적으로 요약해 보겠습니다. Couchbase 모바일 101 그리고 102 블로그에서 시작하기 위한 지침을 확인하세요.

다음은 애플리케이션의 스토리보드로, 애플리케이션의 시작점이 되는 세 개의 간단한 뷰컨트롤러가 있습니다. 발신자가 휴대폰에서 사진을 선택한 다음 전송을 클릭하면 UX 흐름이 시작됩니다. 그러면 카메라가 열려 상대방 휴대폰의 수신 QR 코드를 스캔하여 인증하고 전송을 시작합니다. 다음에서 피어 투 피어 기능을 활성화하는 애플리케이션 코드의 핵심 구성 요소를 살펴 보겠습니다. 카우치베이스 라이트.
[1] 리스너 시작
ReceiveViewController에서 포트를 0으로 설정하여 카우치베이스 라이트가 무엇을 사용할지 결정하도록 합니다. 즉, 사진을 공유할 때마다 전송을 시작할 때마다 포트가 변경됩니다. 인증이 다이제스트인 경우 인증을 활성화하고 기본적으로 Couchbase Lite 리스너에서 지원합니다. 그런 다음 사용자 이름과 비밀번호가 있고 인증을 위한 사용자 이름/비밀번호를 설정합니다. 이제 리스너를 시작할 준비가 되었습니다.
iOS
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
listener = CBLListener(manager: CBLManager.sharedInstance(), port: 0) listener.requiresAuth = true let username = secureGenerateKey(NSCharacterSet.URLUserAllowedCharacterSet()) let password = secureGenerateKey(NSCharacterSet.URLPasswordAllowedCharacterSet()) listener.setPasswords([username : password]) var success = listener.start(&error) if (success) { syncUrl = genearteSyncURL(listener.URL, username: username, password: password, dbName: database.name) startObserveDatabaseChange() } |
리스너가 시작되면 사용자 이름/비밀번호 및 데이터베이스 이름과 함께 리스너 URL을 사용하여 수신자 데이터베이스에 대한 URL 엔드포인트의 동기화 URL을 생성합니다. 이 URL을 동기화 URL 변수에 설정하고 나중에 QR 코드를 생성할 때 이를 사용하여 그에 따라 데이터베이스 변경 수신기를 시작합니다.
[2] 데이터베이스 변경 사항 관찰
사진이 수신기 데이터베이스에 동기화되는 시점을 알 수 있도록 데이터베이스 변경 리스너를 시작합니다. 그렇게 되면 공유 문서에서 공유된 사진을 가져와서 장치로 가져옵니다.
iOS
|
1 2 3 4 5 6 7 8 9 10 11 12 |
func startObserveDatabaseChange() { NSNotificationCenter.defaultCenter().addObserverForName( kCBLDatabaseChangeNotification, object: database, queue: nil) { (notification) -> Void in if let changes = notification.userInfo!["changes"] as? [CBLDatabaseChange] { for change in changes { dispatch_async(dispatch_get_main_queue(), { self.saveImageFromDocument(change.documentID) }) } } } } |
[3] QR코드 생성 및 표시
수신 뷰 컨트롤러의 마지막 단계에서는 Couchbase Lite 리스너가 있으면 데이터베이스 공유 리스너를 설정한 다음 동기화 URL을 설정합니다. 동기화 URL을 사용하면 QR 코드를 생성할 수 있습니다. 이를 위해 iOS 핵심 이미지 필터를 사용합니다. QR코드에는 리스너 포트와 인증을 위한 번들 사용자 아이디/비밀번호가 포함되어 있습니다.
[4] QR코드 스캔
이제 SendViewController 내에서 출력 유형이 AVMetadataObjectTypeQRCode인 AV Foundation 프레임워크의 일부인 iOS 클래스 AVCaptureSession을 사용합니다. 이제 QR코드 스캐너를 사용하여 QR 코드를 스캔할 수 있습니다.
[5] 문서 만들기
이제 수신자에게 보낼 사진을 반복합니다. 각 사진에 대해 문서를 만든 다음 사진을 문서에 첨부하여 데이터베이스에 저장합니다. 마지막 스니펫에서는 문서 ID를 다음 단계에서 사용할 속성인 docIds 변수에 저장합니다.
iOS
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var docIds: [String] = [] for asset in sharedAssets! { //... var data = NSData(bytesNoCopy: imageBytes, length: buffered, freeWhenDone: true) let doc = database.createDocument() let rev = doc.newRevision() rev.setAttachmentNamed("photo", withContentType: "application/octet-stream", content: data) let saved = rev.save(&error) if saved != nil { docIds.append(doc.documentID) } } |
[6] 문서 복제
이제 QR 코드에서 얻은 동기화 URL이 있으므로 마지막 단계는 그에 따라 문서를 복제하는 것입니다. 데이터베이스에서 사진 문서를 가져왔고 발신자 클라이언트 장치에서 수신자 장치로 복제할 준비가 되었습니다. 여기서 동기화 URL로 푸시 복제를 생성하여 문서 ID를 복제기에 전송하여 복제기가 해당 ID의 문서를 푸시할 수 있도록 합니다. 그리고 선택적 단계로 현재 상태를 캡처하기 위해 복제 변경 리스너의 상태를 설정합니다.
iOS
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
replicator = database.createPushReplication(url) replicator.documentIDs = docIds NSNotificationCenter.defaultCenter().addObserverForName(kCBLReplicationChangeNotification, object: replicator, queue: nil) { (notification) -> Void in if self.replicator.lastError == nil { var totalCount = self.replicator.changesCount var completedCount = self.replicator.completedChangesCount if completedCount > 0 && completedCount == totalCount { self.statusLabel.text = "Sending Completed” } } else { self.statusLabel.text = "Sending Abort" } } replicator.start() |
요약
포토드롭 애플리케이션의 핵심 구현 포인트는 인증을 위해 일회성 사용자 이름과 비밀번호를 생성하는 피어 검색에 QR 코드를 사용한다는 점입니다. 사진 송수신을 위한 핵심 코드는 약 100줄의 코드이며 네트워크 통신에 직접적으로 관여하는 코드는 포함되어 있지 않습니다.
