{"id":1884,"date":"2015-02-13T17:24:22","date_gmt":"2015-02-13T17:24:21","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1884"},"modified":"2022-12-15T19:19:24","modified_gmt":"2022-12-16T03:19:24","slug":"photodrop","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/photodrop\/","title":{"rendered":"Cria\u00e7\u00e3o de um aplicativo de compartilhamento de fotos ponto a ponto com o Couchbase Mobile"},"content":{"rendered":"<p>Um dos recursos interessantes do Couchbase Lite que n\u00e3o tem sido muito apresentado \u00e9 a capacidade de fazer replica\u00e7\u00e3o P2P entre dois dispositivos. O Couchbase Lite \u00e9 empacotado com um componente extra chamado Couchbase Lite Listener, que permite que seu aplicativo aceite conex\u00f5es HTTP de outros dispositivos que executam o Couchbase Lite e sincronize dados com eles.<\/p>\n<p>H\u00e1 alguns meses, Wayne Carter (arquiteto-chefe de dispositivos m\u00f3veis) e Traun Leyden (engenheiro de Android) me ligaram e me venderam a ideia de criar um aplicativo simples de compartilhamento de fotos P2P que demonstrasse como \u00e9 f\u00e1cil desenvolver um aplicativo P2P usando o Couchbase Lite. Desde ent\u00e3o, eu estava empenhado e passei alguns dias trabalhando nesse pequeno aplicativo de compartilhamento de fotos P2P para iOS chamado PhotoDrop. Nesta postagem do blog, mostrarei como usei o Couchbase Lite para desenvolver o aplicativo. Isso \u00e9 o que voc\u00ea ter\u00e1 no final:<\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Vis\u00e3o geral<\/span><\/strong><\/span><\/h2>\n<p>O PhotoDrop \u00e9 um aplicativo de compartilhamento de fotos P2P semelhante ao recurso AirDrop do iOS que pode ser usado para enviar fotos entre dispositivos. Antes de entrar no c\u00f3digo, gostaria de discutir brevemente as preocupa\u00e7\u00f5es com P2P e as escolhas de design que fiz ao desenvolver o aplicativo.<\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\"><b>Descoberta de pares<\/b> pode ser feito de v\u00e1rias maneiras. No iOS, voc\u00ea pode usar o Bonjour Service para descobrir pares, mas isso pode ser um problema se mais tarde voc\u00ea quiser desenvolver o aplicativo em outras plataformas. No PhotoDrop, estou usando uma maneira mais simples e direta, usando um QRCode. Uso o QRCode para anunciar um URL de endpoint adhoc que um remetente pode escanear e enviar fotos.<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\"><b>Identidade de pares<\/b> \u00e9 um assunto relacionado \u00e0 descoberta de pares. Normalmente, \u00e9 dif\u00edcil resolver a identifica\u00e7\u00e3o de pares sem introduzir algumas etapas indesejadas no aplicativo, como registro de usu\u00e1rio, login de usu\u00e1rio e aprova\u00e7\u00e3o de pares. Ao usar um QRCode e exigir que as duas pessoas tenham uma intera\u00e7\u00e3o direta e expl\u00edcita para enviar e receber fotos, o problema \u00e9 atenuado.<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\"><b>Autentica\u00e7\u00e3o<\/b> \u00e9 necess\u00e1rio para garantir que o controle de acesso, neste caso o acesso de grava\u00e7\u00e3o para enviar fotos para o banco de dados de outro par, seja concedido \u00e0 pessoa certa. No PhotoDrop, estou usando o Basic Auth que o Couchbase Lite j\u00e1 suporta. Gero com seguran\u00e7a um nome de usu\u00e1rio e uma senha de uso \u00fanico, os agrupo com o endpoint de URL e codifico todos eles no QRCode apresentado pelo receptor ao remetente. Depois que o remetente escaneia o QRCode, ele ter\u00e1 o nome de usu\u00e1rio e a senha para a autentica\u00e7\u00e3o b\u00e1sica.<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\"><b>Canais de comunica\u00e7\u00e3o seguros<\/b> s\u00e3o necess\u00e1rios, especialmente para o envio de informa\u00e7\u00f5es confidenciais. N\u00e3o implementei comunica\u00e7\u00e3o segura neste aplicativo. No entanto, recentemente Jen Alfke adicionou suporte a TLS, incluindo uma API para gerar um certificado autoassinado em tempo real para o iOS Couchbase Lite Listener. Como todo o trabalho \u00e1rduo j\u00e1 foi feito, voc\u00ea pode adicionar suporte para isso com bastante facilidade.<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\">Afinal de contas, o fluxo atual do PhotoDrop \u00e9 bastante simples. Voc\u00ea seleciona as fotos que deseja compartilhar com seu amigo e abre o scanner QRCode para digitalizar o endpoint de destino para o qual as fotos selecionadas ser\u00e3o enviadas. Do outro lado, seu amigo abre o aplicativo, mostra o QRCode e espera que voc\u00ea escaneie e envie as fotos. A pr\u00f3xima se\u00e7\u00e3o fornecer\u00e1 todos os detalhes de implementa\u00e7\u00e3o do aplicativo.<\/span><\/span><\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Sele\u00e7\u00e3o de fotos<\/span><\/strong><\/span><\/h2>\n<p>O PhotoDrop usa ALAssetsLibrary para acessar as fotos no \u00e1lbum Camera Roll em um dispositivo iOS porque o UIImagePickerViewController n\u00e3o oferece suporte \u00e0 sele\u00e7\u00e3o de v\u00e1rias fotos.<\/p>\n<p>As fotos s\u00e3o exibidas em um UICollectionViewController. Um UICollectionViewCell personalizado simples chamado PhotoViewCell \u00e9 criado para exibir uma miniatura da foto e uma caixa de sele\u00e7\u00e3o que indica o status selecionado da foto.<\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Envio de fotos<\/span><\/strong><\/span><\/h2>\n<p>Quando as fotos selecionadas estiverem prontas para serem enviadas e o bot\u00e3o de envio for tocado, o SendViewController ser\u00e1 apresentado com as fotos selecionadas.<\/p>\n<p>Depois que o SendViewController \u00e9 apresentado, nos deparamos com a fun\u00e7\u00e3o viewDidLoad(), na qual obtemos um objeto de banco de dados vazio chamado \"db\" da classe DatabaseUtil. O motivo pelo qual obtemos um banco de dados novo \u00e9 para garantir que n\u00e3o haja documentos pendentes de uma sess\u00e3o de compartilhamento anterior.<br \/>\nA fun\u00e7\u00e3o getEmptyDatabase() da classe DatabaseUtil retorna um banco de dados vazio com o nome fornecido, excluindo o banco de dados, se ele existir, e recriando um novo.<\/p>\n<p>Depois que o SendViewController for apresentado, estaremos na fun\u00e7\u00e3o viewDidAppear(animated:Bool). Na fun\u00e7\u00e3o viewDidAppear, iniciamos a sess\u00e3o de captura de QRCode da AVFoundation para apresentar o scanner de QRCode.<\/p>\n<p>Quando um QRCode \u00e9 capturado, extra\u00edmos o URL do ponto de extremidade, que \u00e9 o URL remoto para o qual enviaremos as fotos. O c\u00f3digo principal para criar e enviar documentos com fotos come\u00e7a e termina na fun\u00e7\u00e3o replicate(url: NSURL), que tem cerca de 50 linhas de c\u00f3digo.<\/p>\n<p>O c\u00f3digo come\u00e7a com o looping de cada foto na matriz sharedAssets. Para cada foto, obtemos uma representa\u00e7\u00e3o bin\u00e1ria e a anexamos a um documento vazio do Couchbase Lite.<\/p>\n<p>Depois que terminamos de criar os documentos com foto, enviamos esses documentos para o outro dispositivo. Para fazer isso, criamos um replicador push e definimos os IDs dos documentos que gostar\u00edamos de replicar. Em geral, a configura\u00e7\u00e3o dos IDs dos documentos para o replicador \u00e9 opcional. Se os ids n\u00e3o forem fornecidos, o replicador apenas replicar\u00e1 todos os documentos no banco de dados.<\/p>\n<p>Antes de iniciarmos o replicador, configuramos um observador de notifica\u00e7\u00e3o para observar o status da replica\u00e7\u00e3o, de modo que possamos exibir o status da replica\u00e7\u00e3o adequadamente quando ela estiver em andamento.<\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Recebimento de fotos<\/span><\/strong><\/span><\/h2>\n<p>O recebimento de fotos \u00e9 feito no ReceiveViewController, que \u00e9 apresentado na tela ViewController quando um usu\u00e1rio toca no bot\u00e3o Receive. Quando o ReceiveViewController \u00e9 apresentado, obtemos um banco de dados novo chamado \"db\" no m\u00e9todo viewDidLoad(). Na fun\u00e7\u00e3o viewDidAppear(animated: Bool), chamamos startListener() para criar e iniciar um objeto CBLListener. O CBLListener \u00e9 um servidor HTTP leve incorporado que escuta as solicita\u00e7\u00f5es HTTP e as encaminha para os manipuladores apropriados para executar as opera\u00e7\u00f5es de replica\u00e7\u00e3o. Depois que o ouvinte \u00e9 iniciado, podemos obter o URL do ouvinte e apresentar um QRCode que codifica o URL. Como b\u00f4nus, o iOS CoreImage oferece suporte a um filtro QRCode, portanto, gerar uma imagem QRCode \u00e9 muito f\u00e1cil :)<\/p>\n<p>Quando configuramos o ouvinte em startListener(), ativamos a autentica\u00e7\u00e3o b\u00e1sica com o par de nome de usu\u00e1rio\/senha gerado. O par nome de usu\u00e1rio\/senha gerado serve como um par de uso \u00fanico que fornece uma solu\u00e7\u00e3o segura (suficiente) para evitar que usu\u00e1rios n\u00e3o autorizados enviem imagens para o receptor. Para gerar o nome de usu\u00e1rio e a senha, usamos a API do iOS Randomization Services (SecRandomCopyBytes) que gera valores aleat\u00f3rios criptograficamente seguros.<\/p>\n<p>No final da fun\u00e7\u00e3o startListener(), a fun\u00e7\u00e3o startObserveDatabaseChange() \u00e9 chamada para observar quaisquer altera\u00e7\u00f5es que ocorram no banco de dados por meio de notifica\u00e7\u00f5es denominadas kCBLDatabaseChangeNotification. Agora podemos observar quando os documentos fotogr\u00e1ficos do outro dispositivo s\u00e3o replicados e salvar as fotos no rolo da c\u00e2mera do dispositivo.<\/p>\n<p>A fun\u00e7\u00e3o para salvar uma foto no rolo da c\u00e2mera do dispositivo est\u00e1 abaixo. A fun\u00e7\u00e3o simplesmente obt\u00e9m a imagem do anexo do documento, cria uma CGImage e a salva no rolo da c\u00e2mera por meio da fun\u00e7\u00e3o writeImageDataToSavedPhotosAlbum() da ALAssetsLibrary. Depois de salvar uma foto, exibimos uma miniatura na tela.<\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Concluindo<\/span><\/strong><\/span><\/h2>\n<p>H\u00e1 muitas maneiras de desenvolver o aplicativo PhotoDrop, e usar o Couchbase Lite talvez seja uma das mais f\u00e1ceis. O c\u00f3digo principal para enviar e receber fotos tem apenas 100 linhas de c\u00f3digo e n\u00e3o cont\u00e9m nenhuma linha de c\u00f3digo diretamente envolvida na comunica\u00e7\u00e3o de rede. Espero que esta postagem do blog e o pr\u00f3prio aplicativo PhotoDrop lhe d\u00eaem alguma inspira\u00e7\u00e3o e ideias para usar o Couchbase Lite em aplicativos P2P. Clone o aplicativo <a href=\"https:\/\/github.com\/couchbaselabs\/photo-drop\">Reposit\u00f3rio do PhotoDrop no GitHub<\/a>Se voc\u00ea quiser, brinque com ele e me diga o que achou!<\/p>","protected":false},"excerpt":{"rendered":"<p>One of the cool features of Couchbase Lite that hasn\u2019t been featured much is an ability to do P2P replication between two devices. Couchbase Lite is packaged with an extra component called Couchbase Lite Listener that allows your application to [&hellip;]<\/p>","protected":false},"author":52,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[9025],"class_list":["post-1884","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PhotoDrop: Peer-to-Peer Photo Sharing App | Couchbase Mobile<\/title>\n<meta name=\"description\" content=\"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/photodrop\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile\" \/>\n<meta property=\"og:description\" content=\"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/photodrop\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-02-13T17:24:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-16T03:19:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/\"},\"author\":{\"name\":\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/22f722eb705c69cfaefcacc31109d3af\"},\"headline\":\"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile\",\"datePublished\":\"2015-02-13T17:24:21+00:00\",\"dateModified\":\"2022-12-16T03:19:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/\"},\"wordCount\":1278,\"commentCount\":10,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/photodrop\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/\",\"name\":\"PhotoDrop: Peer-to-Peer Photo Sharing App | Couchbase Mobile\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-02-13T17:24:21+00:00\",\"dateModified\":\"2022-12-16T03:19:24+00:00\",\"description\":\"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/photodrop\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/22f722eb705c69cfaefcacc31109d3af\",\"name\":\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/6db0719e0e3644e93ad9690b55026cd6\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g\",\"caption\":\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\"},\"description\":\"Pasin Suriyentrakorn is a Senior Software Engineer at Couchbase for Couchbase Mobile. Prior, he was an engineer at Oracle where he led development of the Mobile User Interface rendering framework for Oracle Sales Cloud iOS and Android application.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/pasin-suriyentrakorn\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PhotoDrop: Peer-to-Peer Photo Sharing App | Couchbase Mobile","description":"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/photodrop\/","og_locale":"pt_BR","og_type":"article","og_title":"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile","og_description":"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/photodrop\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-02-13T17:24:21+00:00","article_modified_time":"2022-12-16T03:19:24+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/"},"author":{"name":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/22f722eb705c69cfaefcacc31109d3af"},"headline":"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile","datePublished":"2015-02-13T17:24:21+00:00","dateModified":"2022-12-16T03:19:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/"},"wordCount":1278,"commentCount":10,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/photodrop\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/","url":"https:\/\/www.couchbase.com\/blog\/photodrop\/","name":"PhotoDrop: Peer-to-Peer Photo Sharing App | Couchbase Mobile","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-02-13T17:24:21+00:00","dateModified":"2022-12-16T03:19:24+00:00","description":"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/photodrop\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/22f722eb705c69cfaefcacc31109d3af","name":"Pasin Suriyentrakorn, engenheiro de software s\u00eanior, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/6db0719e0e3644e93ad9690b55026cd6","url":"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g","caption":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase"},"description":"Pasin Suriyentrakorn \u00e9 engenheiro de software s\u00eanior da Couchbase para o Couchbase Mobile. Antes disso, foi engenheiro da Oracle, onde liderou o desenvolvimento da estrutura de renderiza\u00e7\u00e3o da interface de usu\u00e1rio m\u00f3vel para o aplicativo Oracle Sales Cloud iOS e Android.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/pasin-suriyentrakorn\/"}]}},"authors":[{"term_id":9025,"user_id":52,"is_guest":0,"slug":"pasin-suriyentrakorn","display_name":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g","author_category":"","last_name":"Suriyentrakorn","first_name":"Pasin","job_title":"","user_url":"","description":"Pasin Suriyentrakorn \u00e9 engenheiro de software s\u00eanior da Couchbase para o Couchbase Mobile. Antes disso, foi engenheiro da Oracle, onde liderou o desenvolvimento da estrutura de renderiza\u00e7\u00e3o da interface de usu\u00e1rio m\u00f3vel para o aplicativo Oracle Sales Cloud iOS e Android."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1884"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1884\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1884"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}