{"id":4243,"date":"2017-11-28T09:28:16","date_gmt":"2017-11-28T17:28:16","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4243"},"modified":"2025-06-13T20:09:26","modified_gmt":"2025-06-14T03:09:26","slug":"sharing-data-ios-app-extensions-sync-capability","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/sharing-data-ios-app-extensions-sync-capability\/","title":{"rendered":"Compartilhamento e sincroniza\u00e7\u00e3o de dados entre aplicativos iOS e extens\u00f5es de aplicativos entre dispositivos"},"content":{"rendered":"<p>Esta postagem discute como usar o Couchbase Mobile para compartilhar dados entre seu aplicativo iOS e sua extens\u00e3o de aplicativo iOS entre dispositivos. Em um artigo anterior <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-lite-with-ios-app-extensions\/\">postagem<\/a>Em nosso artigo, discutimos como voc\u00ea pode usar o Couchbase Lite como um armazenamento de dados aut\u00f4nomo e incorporado para compartilhar dados entre seu aplicativo iOS e sua extens\u00e3o de aplicativo no mesmo dispositivo. Nesta postagem, vamos estender isso para aproveitar o Sync Gateway e permitir a sincroniza\u00e7\u00e3o de dados entre os aplicativos e a extens\u00e3o de aplicativo correspondente nos dispositivos iOS.<\/p>\n<p><!--more--><\/p>\n<p>OBSERVA\u00c7\u00c3O: usaremos <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/\">Couchbase Lite v1.4.1<\/a> que \u00e9 a vers\u00e3o de produ\u00e7\u00e3o atual. Mas tudo o que discutimos aqui se aplica \u00e0 vers\u00e3o mais recente <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html?language=ios\">Vers\u00e3o 2.0 do Developer Preview<\/a> do Couchbase Mobile.<\/p>\n<h3 id=\"background\">Hist\u00f3rico<\/h3>\n<p>Presumo que voc\u00ea esteja familiarizado com o desenvolvimento de aplicativos iOS em Swift e tenha um conhecimento b\u00e1sico da integra\u00e7\u00e3o do Couchbase Lite em seu aplicativo iOS. Esse <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.5\/installation\/index.html\">Guia de introdu\u00e7\u00e3o<\/a> \u00e9 um \u00f3timo lugar para come\u00e7ar.<\/p>\n<p>Se voc\u00ea ainda n\u00e3o o fez, leia isto <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-lite-with-ios-app-extensions\/\">postagem de blog relacionada<\/a> sobre os conceitos b\u00e1sicos do App Extensions e como configurar seu aplicativo para oferecer suporte a ele.<\/p>\n<p>Como na postagem anterior, discutiremos como o Couchbase Mobile pode ser usado com uma extens\u00e3o Today. Esse tipo de extens\u00e3o, tamb\u00e9m conhecido como \"Widget\", aparece na visualiza\u00e7\u00e3o Today da Central de Notifica\u00e7\u00f5es e permite que os usu\u00e1rios obtenham atualiza\u00e7\u00f5es r\u00e1pidas.<\/p>\n<h3 id=\"couchbaselite\">Couchbase Lite<\/h3>\n<p>O Couchbase Lite \u00e9 um banco de dados incorporado que \u00e9 executado em dispositivos. Ele pode ser usado em v\u00e1rios modos de implanta\u00e7\u00e3o. Pode ser usado como um banco de dados incorporado aut\u00f4nomo ou pode ser usado em conjunto com um Sync Gateway remoto que permita a sincroniza\u00e7\u00e3o de dados entre dispositivos. Nesta postagem, n\u00e3o abordaremos os detalhes da integra\u00e7\u00e3o com o Couchbase Lite. O\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-lite-embedded-in-ios-app-part1\/\">Primeiros passos com o Couchbase Lite<\/a> \u00e9 um bom lugar para come\u00e7ar a fazer isso.<\/p>\n<h3 id=\"syncgateway\">Gateway de sincroniza\u00e7\u00e3o<\/h3>\n<p>O Sync Gateway \u00e9 um componente voltado para a Internet ao qual seus aplicativos m\u00f3veis se conectam. Ele \u00e9 respons\u00e1vel pela sincroniza\u00e7\u00e3o de dados entre os clientes, pelo roteamento e pela autoriza\u00e7\u00e3o. Ele pode ser configurado para manter os dados em um <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/introduction\/intro.html\">Servidor Couchbase<\/a>. Nesta postagem, usaremos o Couchbase Server em <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/installation\/sync-gateway\/index.html#walrus-mode\">\"morsa\"<\/a> em que os dados s\u00e3o mantidos na mem\u00f3ria. Em outras palavras, neste aplicativo de demonstra\u00e7\u00e3o, nosso Sync Gateway n\u00e3o ter\u00e1 o suporte do Couchbase Server. Isso \u00e9 adequado para fins de desenvolvimento. Em um aplicativo do mundo real, voc\u00ea provavelmente desejar\u00e1 manter seus dados em um servidor.<\/p>\n<h2 id=\"sampletasklistapp\">Exemplo de aplicativo de lista de tarefas<\/h2>\n<p>Baixe o projeto de amostra do Github e mude para <strong><code>suporte \u00e0 sincroniza\u00e7\u00e3o<\/code> ramo<\/strong>.<\/p>\n<pre><code> git clone git@github.com:couchbaselabs\/couchbase-mobile-ios-app-extension.git<\/code><\/pre>\n<pre><code>git checkout syncsupport <\/code><\/pre>\n<p>Nosso aplicativo de amostra \u00e9 um aplicativo simples de lista de tarefas que permite aos usu\u00e1rios adicionar, editar e excluir tarefas. Um usu\u00e1rio pode marcar tarefas como conclu\u00eddas. Uma extens\u00e3o Today \u00e9 fornecida com o aplicativo que mostra as duas principais tarefas diretamente na central de notifica\u00e7\u00f5es, sem a necessidade de abrir o aplicativo. O usu\u00e1rio pode marcar as tarefas como conclu\u00eddas diretamente na central de notifica\u00e7\u00f5es.<\/p>\n<p>Todas as tarefas s\u00e3o armazenadas em um banco de dados local do Couchbase Lite e sincronizadas com o Sync Gateway remoto para que as altera\u00e7\u00f5es sejam disponibilizadas para aplicativos\/extens\u00f5es de aplicativos em outros dispositivos.<\/p>\n<p>Isso implica que o aplicativo cont\u00eainer e a extens\u00e3o precisar\u00e3o acessar o banco de dados do Couchbase Lite, que \u00e9 sincronizado com o Sync Gateway.<\/p>\n<h2 id=\"installingrunningsyncgateway\">Instala\u00e7\u00e3o\/execu\u00e7\u00e3o do Sync Gateway<\/h2>\n<ul>\n<li>Primeiro, <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.5\/installation\/sync-gateway\/index.html#macos\">Fa\u00e7a o download e instale<\/a> o Sync<br \/>\n<h2 id=\"installingrunningsyncgateway\" style=\"margin-bottom: 35px\"><\/h2>\n<p>Gateway, caso ainda n\u00e3o o tenha feito.<\/li>\n<li>Iniciaremos o Sync Gateway com o comando <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-mobile-ios-app-extension\/blob\/syncsupport\/sync-gateway-config.json\">Exemplo de arquivo de configura\u00e7\u00e3o<\/a> que voc\u00ea baixou do reposit\u00f3rio do aplicativo de amostra.<\/li>\n<li>Vamos primeiro abrir e revisar o conte\u00fado de <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-mobile-ios-app-extension\/blob\/syncsupport\/sync-gateway-config.json\">Exemplo de arquivo de configura\u00e7\u00e3o<\/a><\/li>\n<\/ul>\n<pre class=\"lang:js decode:true\">{\r\n \"log\": [\"*\"],\r\n \"CORS\": {\r\n \"Origin\":[\"*\"]\r\n },\r\n \"databases\": {\r\n \"demo\": {\r\n      \"server\": \"walrus:\",\r\n      \"bucket\": \"default\",\r\n      \"users\": { \"GUEST\": { \"disabled\": false, \"admin_channels\": [\"*\"] } },\r\n      \"unsupported\": {\r\n         \"user_views\": {\r\n               \"enabled\":true\r\n              }\r\n        }\r\n     }\r\n  }\r\n }<\/pre>\n<p>&nbsp;<\/p>\n<p>Alguns itens dignos de nota<br \/>\n- O nome do banco de dados \u00e9 <code>demonstra\u00e7\u00e3o<\/code><br \/>\n- O Sync Gateway est\u00e1 configurado para ser implantado em <code>morsa<\/code> modo. Observe que isso \u00e9 adequado apenas para fins de desenvolvimento.<br \/>\n- N\u00f3s habilitamos <code>convidado<\/code> acesso. Observe que isso \u00e9 adequado apenas para fins de desenvolvimento. Em um aplicativo do mundo real, voc\u00ea deve desativar o acesso de convidados.<\/p>\n<ul>\n<li>Primeiro, v\u00e1 para a pasta na qual voc\u00ea clonou o reposit\u00f3rio do aplicativo de amostra.<\/li>\n<\/ul>\n<pre><code> cd \/path\/to\/couchbase-mobile-ios-app-extension<\/code><\/pre>\n<ul>\n<li>Em seguida, inicie o Sync Gateway com o arquivo de configura\u00e7\u00e3o.<\/li>\n<\/ul>\n<pre><code> \/path\/to\/sync-gateway sync-gateway-config.json<\/code><\/pre>\n<h2 id=\"architecture\">Arquitetura<\/h2>\n<p>As extens\u00f5es de aplicativos n\u00e3o s\u00e3o aplicativos aut\u00f4nomos. Elas s\u00e3o agrupadas em um aplicativo, chamado de <strong><em>Aplicativo de cont\u00eaineres<\/em><\/strong>.  Embora as App Extensions sejam agrupadas no aplicativo Container, elas s\u00e3o executadas independentemente do aplicativo Container em um processo separado. As extens\u00f5es de aplicativos s\u00e3o iniciadas por outros aplicativos que precisam da funcionalidade da extens\u00e3o. O aplicativo que inicia a extens\u00e3o de aplicativo \u00e9 chamado de <strong><em>Aplicativo host<\/em><\/strong>.  A interface do usu\u00e1rio da extens\u00e3o \u00e9 exibida no contexto do aplicativo host.<\/p>\n<p>Em nosso aplicativo de amostra, o <code>CBLiteTaskExtension<\/code> \u00e9 o widget Today do tipo App Extension e <code>CBLiteTaskApp<\/code> \u00e9 o aplicativo cont\u00eainer correspondente. O sistema <code>Centro de Notifica\u00e7\u00e3o<\/code> \u00e9 efetivamente o aplicativo host da nossa extens\u00e3o de aplicativo.<\/p>\n<p>Embora o aplicativo de cont\u00eainer e a extens\u00e3o correspondente sejam processos independentes executados em sua pr\u00f3pria \u00e1rea restrita, eles podem compartilhar dados por meio de um <strong><em>Cont\u00eainer compartilhado<\/em>.<\/strong><\/p>\n<p>Portanto, isso implica que, se nosso banco de dados do Couchbase Lite estiver localizado no diret\u00f3rio <em>Cont\u00eainer compartilhado<\/em>que permitiria a ambos <code>CBLiteTaskExtension<\/code> e <code>CBLiteTaskApp<\/code> para ter acesso a ele. O banco de dados Couchbase Lite \u00e9 ent\u00e3o respons\u00e1vel por enviar as altera\u00e7\u00f5es para o Sync Gateway da maneira usual, independentemente de o conte\u00fado ter sido atualizado localmente pelo aplicativo ou pelo widget Today. Da mesma forma, as altera\u00e7\u00f5es extra\u00eddas do Sync Gateway est\u00e3o dispon\u00edveis tanto para o aplicativo quanto para o widget Today.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/app_extension_sync.png\" alt=\"\" \/><\/figure>\n<h3 id=\"settingupasharedcontainer\">Configura\u00e7\u00e3o de um cont\u00eainer compartilhado<\/h3>\n<p>O Shared Container pode ser configurado registrando um <strong><em>Grupo de aplicativos<\/em><\/strong> e habilit\u00e1-lo para uso tanto pelo aplicativo cont\u00eainer quanto pela extens\u00e3o de aplicativo correspondente.<\/p>\n<p>Consulte as informa\u00e7\u00f5es relacionadas <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-lite-with-ios-app-extensions\/\">postagem<\/a> sobre como configurar seu aplicativo para usar <em>\"Grupos de aplicativos\"<\/em><\/p>\n<h2 id=\"appwalkthrough\">Passo a passo do aplicativo<\/h2>\n<ul>\n<li>Abra o <code>CBLiteApp.xcworkspace<\/code> usando o Xcode. Embora o aplicativo deva funcionar no Xcode 8.3 e superior, prefiro usar o Xcode 9 porque ele inclui suporte para iniciar v\u00e1rios simuladores, o que seria \u00fatil ao testar os recursos de sincroniza\u00e7\u00e3o entre dispositivos. Portanto, se voc\u00ea tiver a op\u00e7\u00e3o, use o Xcode 9.<\/li>\n<li>Crie e execute o aplicativo em um simulador de iOS escolhendo o destino do aplicativo \"CBLiteTaskApp\". Agora, alterne para a exibi\u00e7\u00e3o Hoje da Central de Notifica\u00e7\u00f5es<\/li>\n<li>Adicione seu novo widget de extens\u00e3o ao Today View, conforme mostrado abaixo<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/app_extension_first-1.gif\" alt=\"\" \/><\/p>\n<ul>\n<li>Se estiver usando o Xcode 9, inicie o aplicativo em um segundo simulador e adicione o widget de extens\u00e3o ao Today View, conforme mostrado anteriormente. Portanto, agora voc\u00ea tem dois simuladores executando o aplicativo Task List.<\/li>\n<\/ul>\n<ul>\n<li>Em um simulador, usando o aplicativo, adicione algumas tarefas tocando no bot\u00e3o \"+\". Voc\u00ea as ver\u00e1 atualizadas no widget Hoje do segundo simulador em tempo real. Se voc\u00ea estiver executando um \u00fanico simulador, poder\u00e1 alternar para o widget Hoje no mesmo dispositivo. Voc\u00ea perceber\u00e1 que as tarefas que adicionou s\u00e3o exibidas no widget.<\/li>\n<\/ul>\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5659 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/app_extension_second-min-compressed.gif\" alt=\"\" width=\"600\" height=\"625\" \/><\/figure>\n<ul>\n<li>Da mesma forma, em um simulador, marque as tarefas como \"conclu\u00eddas\" por meio do widget Today. Voc\u00ea ver\u00e1 o status sendo atualizado no aplicativo correspondente no segundo simulador em tempo real. Se voc\u00ea estiver executando um \u00fanico simulador, poder\u00e1 alternar para o aplicativo no mesmo dispositivo. Voc\u00ea perceber\u00e1 que o status de conclus\u00e3o do<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5656 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/08\/app_extension_third-min-compressed.gif\" alt=\"\" width=\"600\" height=\"619\" \/><\/p>\n<ul>\n<li>Agora, adicionaremos uma tarefa ao Sync Gateway por meio da fun\u00e7\u00e3o <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.5\/references\/sync-gateway\/index.html\">API REST<\/a>. Voc\u00ea ver\u00e1 a nova tarefa aparecer no aplicativo e no widget de hoje em ambos os simuladores, tudo em tempo real! Muito legal!<\/li>\n<\/ul>\n<p>Voc\u00ea pode usar qualquer cliente HTTP para fazer as chamadas \u00e0 API REST para atualizar um documento no Sync Gateway. Mas eu usarei o Postman.<\/p>\n<ul>\n<li>Abra um terminal e digite o seguinte comando curl que adiciona uma tarefa chamada \"task3\" ao banco de dados<\/li>\n<\/ul>\n<pre><code> curl -X PUT https:\/\/localhost:4984\/demo\/task3 \r\n -H 'accept: application\/json' \r\n -H 'cache-control: no-cache' \r\n -H 'content-type: application\/json' \r\n -d '{\r\n \"createdOn\": 1510933574.672683,\r\n \"isCompleted\": false,\r\n \"name\": \"task3\"\r\n }'<\/code><\/pre>\n<p>Voc\u00ea ver\u00e1 a tarefa rec\u00e9m-adicionada aparecer no aplicativo e no widget<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5658 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/app_extension_fourth-min-compressed.gif\" alt=\"\" width=\"600\" height=\"342\" \/><\/figure>\n<h2 id=\"codewalkthrough\">Passo a passo do c\u00f3digo<\/h2>\n<p>O aplicativo \u00e9 arquitetado usando o [<a href=\"https:\/\/(https:\/\/www.priyaontech.com\/download\/28\/\">Modelo-Vis\u00e3o-Apresentador (MVP)<\/a>] padr\u00e3o.<\/p>\n<h3 id=\"databasemanager\">Gerenciador de banco de dados<\/h3>\n<p>O <code>Gerenciador de banco de dados<\/code> \u00e9 o <em>Modelo<\/em>implementada como uma classe singleton que lida com as fun\u00e7\u00f5es de gerenciamento do banco de dados do Couchbase Lite. Essa \u00e9 a classe que inicializa o banco de dados do Couchbase Lite na classe <em>Cont\u00eainer compartilhado<\/em> portanto, agora ele est\u00e1 dispon\u00edvel para os processos do App Extension e do App<\/p>\n<p>Abra o <em>Gerenciador de banco de dados.swift<\/em> e localize o arquivo <em>appGroupContainerURL()<\/em> fun\u00e7\u00e3o. Essa fun\u00e7\u00e3o cria uma pasta no diret\u00f3rio <em>Cont\u00eainer compartilhado<\/em> para uso pelo aplicativo<\/p>\n<pre><code class=\"swift\"> \/\/ 1. Get URL to shared group container\r\n let fileManager = FileManager.default\r\n guard let groupURL = fileManager\r\n .containerURL(forSecurityApplicationGroupIdentifier: \"group.com.example.CBLiteSharedData\") else {\r\n return nil\r\n }\r\nlet storagePathUrl = groupURL.appendingPathComponent(&amp;quot;CBLite&amp;quot;)\r\nlet storagePath = storagePathUrl.path\r\n\r\n\/\/ 2: Create a folder in the shared container location with name&amp;quot;CBLite&amp;quot;\r\nif !fileManager.fileExists(atPath: storagePath) {\r\n    do {\r\n        try fileManager.createDirectory(atPath: storagePath,\r\n                                        withIntermediateDirectories: false,\r\n                                        attributes: nil)\r\n    } catch let error {\r\n        print(&amp;quot;error creating filepath: \\(error)&amp;quot;)\r\n        return nil\r\n    }\r\n}<\/code><\/pre>\n<ol>\n<li>Retorna o URL para o cont\u00eainer de grupo compartilhado. Os cont\u00eaineres de grupo s\u00e3o armazenados em <em>~\/Biblioteca\/Cont\u00eaineres de grupo\/<\/em><\/li>\n<li>Crie uma pasta chamada CBLite no cont\u00eainer do grupo compartilhado.<\/li>\n<\/ol>\n<p>Localize o <em>configureCBManagerForSharedData()<\/em> fun\u00e7\u00e3o. \u00c9 aqui que configuramos a fun\u00e7\u00e3o <code>Gerenciador de CBL<\/code> com o URL da pasta que criamos no objeto <em>appGroupContainerURL()<\/em> fun\u00e7\u00e3o<\/p>\n<pre><code class=\"swift\"> \/\/ 1. Set the file protection mode for the Couchbase Lite database folder\r\n let options = CBLManagerOptions(readOnly: false, fileProtection: Data.WritingOptions.completeFileProtectionUnlessOpen)\r\n let cblpoptions = UnsafeMutablePointer.allocate(capacity: 1)\r\n cblpoptions.initialize(to: options)\r\n if let url = self.appGroupContainerURL() {\r\n    \/\/ 2. Initialize the CBLManager with the directory of the shared container\r\n    _cbManager = try CBLManager.init(directory: url.relativePath, options: cblpoptions)\r\n    \r\n}<\/code><\/pre>\n<ol>\n<li>Criar <code>CBLManagerOptions<\/code> com as prote\u00e7\u00f5es de arquivo apropriadas. Um valor de <a href=\"https:\/\/developer.apple.com\/reference\/foundation\/nsdata.writingoptions\/1616278-completefileprotectionunlessopen\"><em>completeFileProtectionUnlessOpen<\/em><\/a> implica que o acesso de leitura\/grava\u00e7\u00e3o ao arquivo \u00e9 restrito, a menos que o arquivo esteja aberto<\/li>\n<li>Inicializar o <code>Gerenciador de CBL<\/code> com o caminho para o cont\u00eainer compartilhado. Posteriormente, quando o banco de dados for criado, ele ser\u00e1 criado no cont\u00eainer compartilhado.<\/li>\n<\/ol>\n<p>Localize o <em>openOrCreateDatabaseInSharedContainer()<\/em> fun\u00e7\u00e3o. \u00c9 aqui que inicializamos o banco de dados do Couchbase Lite usando o CBLManager<\/p>\n<pre><code class=\"swift\"> \/\/ 1: Set Database Options\r\n let options = CBLDatabaseOptions()\r\n options.storageType = kCBLSQLiteStorage\r\n options.create = true\r\n \/\/ 2: Create a DB for logged in user if it does not exist else return handle to existing one\r\n  _db  = try _cbManager?.openDatabaseNamed(kDBName.lowercased(), with: options)<\/code><\/pre>\n<ol>\n<li>Criar <code>CBLDatabaseOptions<\/code> objeto<\/li>\n<li>Inicializar o <code>Banco de dados CBLD<\/code> usando o <code>Gerenciador de CBL<\/code> que foi criada anteriormente. Quando o banco de dados for criado, ele ser\u00e1 criado no cont\u00eainer compartilhado especificado pelo gerente.<\/li>\n<\/ol>\n<p>\u00c9 isso a\u00ed! O banco de dados do Couchbase Lite est\u00e1 agora no cont\u00eainer compartilhado, no qual o aplicativo e a extens\u00e3o podem ler e gravar.<\/p>\n<p>A pr\u00f3xima etapa \u00e9 ativar a sincroniza\u00e7\u00e3o com o Sync Gateway remoto<\/p>\n<p>Localize o <em>startDBPullReplication()<\/em> fun\u00e7\u00e3o. \u00c9 aqui que configuramos a fun\u00e7\u00e3o <em>Puxar<\/em> replicador para extrair dados do Sync Gateway para o banco de dados do Couchbase Lite.<\/p>\n<pre><code class=\"swift\"> if (pullRepl == nil) {\r\n \/\/ 1: Create a Pull replication to start pulling from remote source\r\n pullRepl = _db?.createPullReplication(URL(string: self.kDBName.lowercased(), relativeTo: URL.init(string: kRemoteSyncUrl))!)\r\n        \/\/ 2. Continuously look for changes\r\n        _pullRepl?.continuous = true\r\n     }\r\n\r\n    \/\/ 3. Start the pull replicator\r\n    _pullRepl?.start()<\/code><\/pre>\n<ol>\n<li>Criar <code>CBLReplica\u00e7\u00e3o<\/code> Puxar objeto replicador<\/li>\n<li>Configure-o para extrair documentos no modo cont\u00ednuo. Isso permitir\u00e1 que as altera\u00e7\u00f5es sejam propagadas em tempo real.<\/li>\n<li>Iniciar a replica\u00e7\u00e3o<\/li>\n<\/ol>\n<p>Localize o <em>startDBPushReplication()<\/em> fun\u00e7\u00e3o. \u00c9 aqui que configuramos a fun\u00e7\u00e3o <em>Empurrar<\/em> replicador para enviar dados do banco de dados do Couchbase Lite para o Sync Gateway.<\/p>\n<pre><code class=\"swift\"> if (_pushRepl == nil) {\r\n       \/\/ 1: Create a push replication to start pushing to remote source\r\n        _pushRepl = _db?.createPushReplication(URL(string: self.kDBName.lowercased(), relativeTo: URL.init(string:kRemoteSyncUrl))!)\r\n\r\n        \/\/ 2. Continuously push  changes\r\n        _pushRepl?.continuous = true\r\n\r\n     }\r\n\r\n    \/\/ 3. Start the push replicator\r\n    _pushRepl?.start()<\/code><\/pre>\n<ol>\n<li>Criar <code>CBLReplica\u00e7\u00e3o<\/code> Empurrar objeto replicador<\/li>\n<li>Configure-o para enviar documentos no modo cont\u00ednuo. Isso permitir\u00e1 que as altera\u00e7\u00f5es sejam propagadas em tempo real.<\/li>\n<li>Iniciar a replica\u00e7\u00e3o<\/li>\n<\/ol>\n<p>Depois de ativar a replica\u00e7\u00e3o, voc\u00ea adiciona observadores para serem notificados das altera\u00e7\u00f5es. Isso \u00e9 implementado na se\u00e7\u00e3o <em>addReplicationChangeObserverForReplicator()<\/em> fun\u00e7\u00e3o.<br \/>\nCom essas etapas simples, voc\u00ea tem o banco de dados compartilhado do Couchbase Lite replicando altera\u00e7\u00f5es com o Sync Gateway remoto.<\/p>\n<h3 id=\"taskpresenter\">Apresentador de tarefas<\/h3>\n<p>O <code>Apresentador de tarefas<\/code> \u00e9 o Presenter, que lida com as intera\u00e7\u00f5es da interface do usu\u00e1rio tanto do <code>CBLiteTaskExtension<\/code> extens\u00e3o de tarefa e o <code>CBLiteTaskApp<\/code> e faz interface com o aplicativo <code>Gerenciador de banco de dados<\/code>. Ele \u00e9 o intermedi\u00e1rio entre o aplicativo\/extens\u00e3o de aplicativo e o DatabaseManager.<\/p>\n<p>Revisar o <em>TaskPresenter.swift<\/em> arquivo. Voc\u00ea ver\u00e1 que ele implementa as fun\u00e7\u00f5es CRUD para interagir com o banco de dados Couchbase Lite. Mas observe que a implementa\u00e7\u00e3o dessas fun\u00e7\u00f5es usa a vari\u00e1vel <code>Gerenciador de banco de dados<\/code>.<\/p>\n<h3 id=\"whatnext\">E agora?<\/h3>\n<p>A postagem discute como \u00e9 f\u00e1cil usar o Couchbase Lite como um armazenamento de dados compartilhado entre seu aplicativo iOS e o widget correspondente do aplicativo Today. Com a sincroniza\u00e7\u00e3o do banco de dados compartilhado com o Sync Gatway remoto, agora podemos replicar altera\u00e7\u00f5es nos aplicativos\/extens\u00f5es de aplicativos em v\u00e1rios dispositivos.<\/p>\n<p>Se tiver alguma d\u00favida, sinta-se \u00e0 vontade para entrar em contato comigo pelo Twitter <a href=\"https:\/\/twitter.com\/rajagp?lang=en\">@rajagp<\/a> ou envie-me um e-mail\u00a0<a href=\"mailto:priya.rajagopal@couchbase.com\">priya.rajagopal@couchbase.com<\/a>. Se voc\u00ea quiser sugerir melhorias, envie uma solicita\u00e7\u00e3o pull para o site <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-mobile-ios-app-extension\">GitHub<\/a> repo. Voc\u00ea pode saber mais sobre a integra\u00e7\u00e3o com o Couchbase Lite neste\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-lite-embedded-in-ios-app-part1\/\">Primeiros passos com o Couchbase Lite<\/a> blog.<\/p>\n<p>O <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">F\u00f3runs do Couchbase<\/a> s\u00e3o outro \u00f3timo lugar para postar suas perguntas.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>This post discusses\u00a0how to use Couchbase Mobile to share data between your iOS App and iOS App Extension across devices. In an earlier post, we discussed how you can use Couchbase Lite as a standalone, embedded data store to share [&hellip;]<\/p>","protected":false},"author":1423,"featured_media":5656,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1821,7667,1810],"tags":[1964,1536],"ppma_author":[8948],"class_list":["post-4243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-architecture","category-couchbase-lite","category-couchbase-mobile","tag-app-extension","tag-ios"],"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>Share data between iOS Apps &amp; App Extensions across devices<\/title>\n<meta name=\"description\" content=\"Use Couchbase Mobile Database in a shared container to share data between an iOS App and corresponding App Extension and to sync data across devices\" \/>\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\/sharing-data-ios-app-extensions-sync-capability\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sharing and Syncing Data between iOS Apps and App Extensions across devices\" \/>\n<meta property=\"og:description\" content=\"Use Couchbase Mobile Database in a shared container to share data between an iOS App and corresponding App Extension and to sync data across devices\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/sharing-data-ios-app-extensions-sync-capability\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-28T17:28:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:09:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"619\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rajagp\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"Sharing and Syncing Data between iOS Apps and App Extensions across devices\",\"datePublished\":\"2017-11-28T17:28:16+00:00\",\"dateModified\":\"2025-06-14T03:09:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/\"},\"wordCount\":1839,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif\",\"keywords\":[\"app extension\",\"ios\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Architecture\",\"Couchbase Lite\",\"Couchbase Mobile\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/\",\"name\":\"Share data between iOS Apps & App Extensions across devices\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif\",\"datePublished\":\"2017-11-28T17:28:16+00:00\",\"dateModified\":\"2025-06-14T03:09:26+00:00\",\"description\":\"Use Couchbase Mobile Database in a shared container to share data between an iOS App and corresponding App Extension and to sync data across devices\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif\",\"width\":600,\"height\":619},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sharing and Syncing Data between iOS Apps and App Extensions across devices\"}]},{\"@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\/c2da90e57717ee4970c48a87a131ac2c\",\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"caption\":\"Priya Rajagopal, Senior Director, Product Management\"},\"description\":\"Priya Rajagopal is a Senior Director of Product Management at Couchbase responsible for developer platforms for the cloud and the edge. She has been professionally developing software for over 20 years in several technical and product leadership positions, with 10+ years focused on mobile technologies. As a TISPAN IPTV standards delegate, she was a key contributor to the IPTV standards specifications. She has 22 patents in the areas of networking and platform security.\",\"sameAs\":[\"https:\/\/x.com\/rajagp\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/priya-rajagopalcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Share data between iOS Apps & App Extensions across devices","description":"Use o Couchbase Mobile Database em um cont\u00eainer compartilhado para compartilhar dados entre um aplicativo iOS e a extens\u00e3o de aplicativo correspondente e para sincronizar dados entre dispositivos","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\/sharing-data-ios-app-extensions-sync-capability\/","og_locale":"pt_BR","og_type":"article","og_title":"Sharing and Syncing Data between iOS Apps and App Extensions across devices","og_description":"Use Couchbase Mobile Database in a shared container to share data between an iOS App and corresponding App Extension and to sync data across devices","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/sharing-data-ios-app-extensions-sync-capability\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-11-28T17:28:16+00:00","article_modified_time":"2025-06-14T03:09:26+00:00","og_image":[{"width":600,"height":619,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif","type":"image\/gif"}],"author":"Priya Rajagopal, Senior Director, Product Management","twitter_card":"summary_large_image","twitter_creator":"@rajagp","twitter_misc":{"Written by":"Priya Rajagopal, Senior Director, Product Management","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"Sharing and Syncing Data between iOS Apps and App Extensions across devices","datePublished":"2017-11-28T17:28:16+00:00","dateModified":"2025-06-14T03:09:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/"},"wordCount":1839,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif","keywords":["app extension","ios"],"articleSection":["Best Practices and Tutorials","Couchbase Architecture","Couchbase Lite","Couchbase Mobile"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/","url":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/","name":"Share data between iOS Apps & App Extensions across devices","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif","datePublished":"2017-11-28T17:28:16+00:00","dateModified":"2025-06-14T03:09:26+00:00","description":"Use o Couchbase Mobile Database em um cont\u00eainer compartilhado para compartilhar dados entre um aplicativo iOS e a extens\u00e3o de aplicativo correspondente e para sincronizar dados entre dispositivos","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/app_extension_third-min-compressed.gif","width":600,"height":619},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/sharing-data-ios-app-extensions-sync-capability\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Sharing and Syncing Data between iOS Apps and App Extensions across devices"}]},{"@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\/c2da90e57717ee4970c48a87a131ac2c","name":"Priya Rajagopal, Diretora S\u00eanior, Gerenciamento de Produtos","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734","url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","caption":"Priya Rajagopal, Senior Director, Product Management"},"description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma.","sameAs":["https:\/\/x.com\/rajagp"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/priya-rajagopalcouchbase-com\/"}]}},"authors":[{"term_id":8948,"user_id":1423,"is_guest":0,"slug":"priya-rajagopalcouchbase-com","display_name":"Priya Rajagopal, Senior Director, Product Management","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","author_category":"","last_name":"Rajagopal, Senior Director, Product Management","first_name":"Priya","job_title":"","user_url":"","description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4243","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\/1423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4243"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4243\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/5656"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4243"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=4243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}