Na sessão 103 do Couchbase LIVE New York pista móvelNa seção "Sincronização", examinamos o recurso do Couchbase Lite que nos permitiria ativar a sincronização ponto a ponto entre dois ou mais dispositivos. A partir da seção "Couchbase Mobile 103: Criação de um aplicativo ponto a ponto com o Couchbase Mobile" slidesNa seção "Compartilhamento de fotos", exploramos em profundidade o código e os componentes que permitiram que o aplicativo de compartilhamento de fotos trocasse fotos com outro dispositivo cliente que executava o Couchbase Lite por meio do recurso P2P.
O aplicativo de amostra do PhotoDrop P2P pode ser encontrado no repositório do GitHub para iOS e Android. Neste blog, recapitularemos em alto nível os recursos e APIs do Couchbase Lite que foram apresentados na sessão Couchbase 103, bem como alguns dos códigos encontrados no exemplo de Compartilhamento de Fotos. Você pode consultar o Couchbase Mobile 101 e 102 blogs para obter orientação sobre como começar.

Aqui estão os storyboards do aplicativo, onde temos três ViewControllers simples, sendo que o ViewController é o ponto de entrada do aplicativo. O fluxo de experiência do usuário começa quando o remetente seleciona as fotos do telefone e clica em enviar. A câmera será aberta para escanear o código QR de recebimento do outro telefone a fim de autenticar e iniciar a transferência. Vamos examinar os principais componentes do código do aplicativo que habilita o recurso ponto a ponto a partir de Couchbase Lite.
[1] Iniciar ouvinte
No ReceiveViewController, definimos a porta como sendo igual a zero para que deixemos o Couchbase Lite decidir o que usar. Isso significa que, sempre que quisermos compartilhar as fotos, a porta será alterada toda vez que ele iniciar uma transferência. Ativamos a autenticação, na qual a autenticação é o resumo e é suportada pelo ouvinte do Couchbase Lite por padrão. Depois disso, temos o nome de usuário e a senha e definimos o nome de usuário/senha para a autenticação. Depois disso, estamos prontos para iniciar os ouvintes.
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() } |
Depois que o ouvinte é iniciado, geramos o URL de sincronização do ponto de extremidade do URL para o banco de dados receptor usando o URL do ouvinte com o nome de usuário/senha e o nome do banco de dados. Definimos o URL na variável de URL de sincronização e o usamos mais tarde quando geramos o código QR, a partir do qual iniciamos os ouvintes de alteração do banco de dados adequadamente.
[2] Observar alterações no banco de dados
Iniciamos o ouvinte de alterações no banco de dados para sabermos quando a foto é sincronizada com o banco de dados do receptor. Quando isso acontece, obtemos as fotos compartilhadas dos documentos compartilhados e as aceitamos no dispositivo.
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] Gerar e exibir código QR
Na última etapa do ReceiveViewController, quando temos os ouvintes do Couchbase Lite, configuramos os ouvintes compartilhados do banco de dados e, em seguida, temos o URL de sincronização. Com o URL de sincronização, podemos gerar o código QR. Para fazer isso, usamos o filtro de imagem principal do iOS. O código QR contém a porta do ouvinte e o nome de usuário/senha incluídos para autenticação.
[4] Ler o código QR
Agora, no SendViewController, usamos a classe iOS AVCaptureSession, que faz parte da estrutura AV Foundation com o tipo de saída AVMetadataObjectTypeQRCode. Isso agora nos permitirá usar o scanner de código QR e escanear o código QR.
[5] Criar documentos
Agora, iteramos as fotos que queremos enviar aos destinatários. Para cada foto, criamos um documento e, em seguida, anexamos a foto ao documento para salvar no banco de dados. No último snippet, salvaremos os IDs dos documentos na variável docIds, que é uma propriedade que será usada na etapa seguinte.
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] Replicar documentos
A última etapa, agora que temos o URL de sincronização que obtivemos do código QR, é replicar os documentos adequadamente. Temos os documentos com foto do banco de dados e estamos prontos para replicar do dispositivo cliente emissor para o dispositivo receptor. Aqui, criamos uma replicação por push com a URL de sincronização, na qual enviamos o ID do documento para o replicador, permitindo que o replicador faça push dos documentos com o ID. E, como etapa opcional, definimos os estados dos ouvintes de alteração de replicação para capturar o status atual.
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() |
Resumo
Os principais pontos de implementação dos aplicativos Photodrop são que eles usam o código QR para descoberta de pares, onde geramos um nome de usuário e uma senha únicos para autenticação. O código principal para envio/recebimento de fotos tem cerca de 100 linhas de código e não contém nenhum código diretamente envolvido na comunicação de rede.
