{"id":3287,"date":"2017-04-24T10:30:54","date_gmt":"2017-04-24T17:30:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3287"},"modified":"2025-06-13T23:43:26","modified_gmt":"2025-06-14T06:43:26","slug":"data-sync-on-ios-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/data-sync-on-ios-couchbase-mobile\/","title":{"rendered":"Sincronizaci\u00f3n de datos entre dispositivos iOS usando Couchbase Mobile"},"content":{"rendered":"<p>Este post explica c\u00f3mo empezar con la replicaci\u00f3n\/sincronizaci\u00f3n de datos a trav\u00e9s de dispositivos iOS usando Couchbase Mobile. Couchbase Mobile Stack se compone de Couchbase Server, Sync Gateway y Couchbase Lite embedded NoSQL Database. En un <a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-lite-embedded-in-ios-app-part1\/\">Correo electr\u00f3nico:<\/a>En el art\u00edculo anterior, discutimos c\u00f3mo Couchbase Lite puede ser utilizado como una base de datos NoSQL independiente incrustada en aplicaciones iOS. Este post te guiar\u00e1 a trav\u00e9s de un ejemplo de aplicaci\u00f3n iOS en conjunto con un Sync Gateway que demostrar\u00e1 los conceptos b\u00e1sicos de Push &amp; Pull Replication, Authentication &amp; Access Control, Channels y Sync Functions.<\/p>\n<p><!--more--><\/p>\n<p>Aunque vamos a ver la sincronizaci\u00f3n de datos en el contexto de una App iOS en Swift, todo lo que se discuta aqu\u00ed es igualmente aplicable a apps m\u00f3viles desarrolladas en cualquier otra plataforma (Android, iOS (ObjC), Xamarin). Las desviaciones se especificar\u00e1n como tales.<\/p>\n<p>NOTA: Estaremos discutiendo Couchbase Mobile v1.4 que es la versi\u00f3n de producci\u00f3n actual. Existe una versi\u00f3n <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html?language=ios\">Vista previa para desarrolladores <\/a>versi\u00f3n 2.0 de Couchbase Mobile que tiene un mont\u00f3n de nuevas y emocionantes caracter\u00edsticas.<\/p>\n<h2>Couchbase M\u00f3vil<\/h2>\n<p>Couchbase Mobile Stack est\u00e1 compuesto por Couchbase Server, Sync Gateway y Couchbase Lite embedded NoSQL Database. Este post tratar\u00e1 los conceptos b\u00e1sicos de NoSQL <a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-replication-and-sync\/\">replicaci\u00f3n y sincronizaci\u00f3n de datos<\/a> usando Couchbase Mobile. Asumir\u00e9 que est\u00e1s familiarizado con el desarrollo de aplicaciones iOS, conceptos b\u00e1sicos de Swift, algunos conceptos b\u00e1sicos de NoSQL y que tienes alg\u00fan conocimiento de Couchbase. Si quieres leer m\u00e1s sobre Couchbase Mobile, puedes encontrar un mont\u00f3n de recursos al final de este post.<\/p>\n<h2>Pasarela de sincronizaci\u00f3n Couchbase<\/h2>\n<p>Couchbase Sync Gateway es un mecanismo de sincronizaci\u00f3n orientado a Internet que sincroniza datos de forma segura entre dispositivos, as\u00ed como entre dispositivos y la nube.<\/p>\n<p>Expone una interfaz web que proporciona<\/p>\n<ul>\n<li>Sincronizaci\u00f3n de datos entre dispositivos y la nube<\/li>\n<li>Control de acceso<\/li>\n<li>Validaci\u00f3n de datos<\/li>\n<\/ul>\n<p>Puedes utilizar cualquier cliente HTTP para explorar m\u00e1s a fondo la interfaz. Eche un vistazo a <a href=\"https:\/\/www.couchbase.com\/blog\/es\/querying-couchbase-sync-gateway-with-postman\/\">Correo electr\u00f3nico:<\/a> sobre el uso de Postman para consultar la interfaz.<\/p>\n<p>Hay tres conceptos principales relacionados con la replicaci\u00f3n o sincronizaci\u00f3n de datos mediante Sync Gateway -<\/p>\n<h3>Canal<\/h3>\n<p>Un canal puede verse como una combinaci\u00f3n de etiqueta y cola de mensajes. Cada documento puede asignarse a uno o varios canales. Los documentos se asignan a canales que especifican qui\u00e9n puede acceder a los documentos. Los usuarios tienen acceso a uno o varios canales y s\u00f3lo pueden leer los documentos asignados a esos canales. Para m\u00e1s informaci\u00f3n, consulte la p\u00e1gina\u00a0<a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/guides\/sync-gateway\/channels\/index.html?language=ios\">documentaci\u00f3n sobre Canales.<\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Funci\u00f3n de sincronizaci\u00f3n<\/h3>\n<p>La funci\u00f3n de sincronizaci\u00f3n es una funci\u00f3n JavaScript que se ejecuta en Sync Gateway. Cada vez que se a\u00f1ade un nuevo documento, revisi\u00f3n o borrado a una base de datos, se llama a la funci\u00f3n de sincronizaci\u00f3n. La funci\u00f3n de sincronizaci\u00f3n es responsable de<\/p>\n<ul>\n<li>\u00a0Validaci\u00f3n del documento,<\/li>\n<li>Autorizar el cambio<\/li>\n<li>Asignaci\u00f3n de documentos a canales y<\/li>\n<li>Conceder a los usuarios acceso a los canales.<\/li>\n<\/ul>\n<p>Para m\u00e1s informaci\u00f3n, consulte <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/guides\/sync-gateway\/sync-function-api-guide\/index.html?language=ios\">documentaci\u00f3n sobre la funci\u00f3n de sincronizaci\u00f3n<\/a>\u00a0.<\/p>\n<p>&nbsp;<\/p>\n<h3>Replicaci\u00f3n<\/h3>\n<p>La replicaci\u00f3n, tambi\u00e9n conocida como sincronizaci\u00f3n, es el proceso de sincronizar los cambios entre la base de datos local y el Sync Gateway remoto. Existen dos tipos<\/p>\n<ul>\n<li>La replicaci\u00f3n push se utiliza para transferir los cambios de la base de datos local a la remota.<\/li>\n<li>La replicaci\u00f3n pull se utiliza para extraer cambios de la base de datos remota a la local.<\/li>\n<\/ul>\n<p>Para m\u00e1s informaci\u00f3n, consulte <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/couchbase-lite\/native-api\/replication\/index.html?language=swift\">documentaci\u00f3n sobre r\u00e9plicas<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2>Instalaci\u00f3n de Couchbase Sync Gateway<\/h2>\n<p>Siga las<a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/installation\/sync-gateway\/index.html?language=ios\">\u00a0gu\u00eda de instalaci\u00f3n<\/a>\u00a0para instalar el Sync Gateway.<\/p>\n<p>Inicie su Sync Gateway con el siguiente archivo de configuraci\u00f3n. La ubicaci\u00f3n exacta del archivo de configuraci\u00f3n depender\u00e1 de la plataforma. Consulte la gu\u00eda de instalaci\u00f3n.<\/p>\n<h3>Archivo de configuraci\u00f3n de la pasarela de sincronizaci\u00f3n<\/h3>\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\": { \r\n        \"GUEST\": { \"disabled\": true, \"admin_channels\": [\"*\"] } ,\r\n        \"joe\": {\"password\":\"password\" ,\"disabled\": false, \"admin_channels\":[\"_public\",\"_joe\"]} ,\r\n        \"jane\":{\"password\":\"password\" ,\"disabled\": false, \"admin_channels\":[\"_public\",\"_jane\"]}\r\n      },\r\n      \"unsupported\": {\r\n        \"user_views\": {\r\n          \"enabled\":true\r\n        }\r\n      },\r\n    \r\n  \r\n  \"sync\": \r\n  `\r\n      \r\n      function (doc, oldDoc){\r\n     \r\n\r\n        \/\/ Check if doc is being deleted\r\n        if (doc._deleted == undefined) {\r\n          \/\/ Validate current version has relevant keys\r\n          validateDocument(doc);\r\n        }\r\n        else {\r\n          \/\/ Validate  old document has relevant keys\r\n          validateDocument(oldDoc);\r\n        }\r\n\r\n        var docOwner = (doc._deleted == undefined) ? doc.owner : oldDoc.owner;\r\n    \r\n\r\n        var publicChannel = \"_public\";\r\n\r\n        var privateChannel = \"_\"+docOwner;\r\n\r\n        \/\/ Grant user read access to public channels and user's own channel\r\n        access(docOwner,[publicChannel,privateChannel]);\r\n\r\n\r\n        \/\/ Check if this was a doc update (as opposed to a doc create or delete)\r\n        if (doc._deleted == undefined &amp;&amp; oldDoc != null &amp;&amp; oldDoc._deleted == undefined) {\r\n\r\n            if (doc.tag != oldDoc.tag) {\r\n                 throw({forbidden: \"Cannot change tag of document\"});\r\n         \r\n            }\r\n        }\r\n\r\n\r\n        \/\/ Check if new\/updated document is tagged as \"public\" \r\n        var docTag =  (doc._deleted == undefined) ? doc.tag : oldDoc.tag;\r\n    \r\n        if (doc._deleted == undefined) {\r\n          if (docTag == \"public\") {\r\n           \r\n            \/\/ All documents tagged public go into \"public\" channel which to open to all\r\n            channel(publicChannel);\r\n         \r\n        }\r\n        else {\r\n\r\n            \/\/ Ensure that the owner of document is the user making the request\r\n            requireUser(docOwner);\r\n\r\n            \/\/ All non-public tagged docs go into a user user specific channel\r\n            channel(privateChannel);\r\n\r\n         }\r\n       }\r\n       else {\r\n          channel(doc.channels);\r\n       }\r\n\r\n\r\n        function validateDocument (doc) {\r\n           \/\/ Basic validation of document\r\n          if (!doc.tag ) {\r\n            \/\/ Every doc must include a tag\r\n            throw({forbidden: \"Invalid document type: Tag not provided\" + doc.tag});\r\n          }\r\n\r\n           if (!doc.owner) {\r\n            \/\/ Every doc must include a owner\r\n            throw({forbidden: \"Invalid document type: Owner not provided\" + doc.owner});\r\n          \r\n          }\r\n        }\r\n      }\r\n  \r\n\r\n`\r\n    }\r\n  }\r\n}<\/pre>\n<p>Estos son algunos puntos clave que hay que tener en cuenta en el archivo de configuraci\u00f3n:-<\/p>\n<ul>\n<li>L\u00ednea 8: El valor \"walrus:\" para \"server\" indica que el Sync Gateway debe persistir los datos en memoria y no est\u00e1 respaldado por un servidor Couchbase.<\/li>\n<li>L\u00ednea 11: El acceso de usuarios invitados est\u00e1 desactivado<\/li>\n<li>L\u00edneas 12-13: Hay dos usuarios, \"Jane\" y \"Joe\" configurados en el sistema. Ambos usuarios tienen acceso a un canal \"_p\u00fablico\" y cada uno tiene acceso a su propio canal privado.<\/li>\n<li>L\u00ednea 22-100: Una simple funci\u00f3n de sincronizaci\u00f3n que hace lo siguiente\n<ol>\n<li>L\u00edneas 29-36 : Validaci\u00f3n del documento para garantizar que contiene las propiedades \"tag\" y \"owner\" definidas por el usuario.\n<ol>\n<li>La propiedad \"tag\" se utiliza para especificar si el documento est\u00e1 disponible p\u00fablicamente para cualquier usuario o si es privado para un usuario<\/li>\n<li>La propiedad \"owner\" se utiliza para especificar si el documento est\u00e1 disponible p\u00fablicamente para cualquier usuario o si es privado para un usuario<\/li>\n<\/ol>\n<\/li>\n<li>L\u00ednea 46: Dar acceso al usuario al canal \"_public\" y a un canal privado (identificado mediante el propietario del documento).<\/li>\n<li>L\u00edneas 51-56 : Si se trata de una actualizaci\u00f3n del documento, compruebe que la propiedad \"tag\" no se modifica en las distintas revisiones.<\/li>\n<li>L\u00ednea 66: Asignar todos los documentos con etiqueta \"public\" al canal \"_public\".<\/li>\n<li>L\u00ednea 72: Asignar todos los documentos con una etiqueta distinta de \"p\u00fablico\" al canal privado.\n<ol>\n<li>L\u00ednea 75: En el caso de los documentos de canal privado, compruebe en primer lugar que el titular del documento es quien realiza la solicitud<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<h2>Couchbase Lite<\/h2>\n<p>Couchbase Lite es una base de datos NoSQL integrada que se ejecuta en dispositivos. Couchbase Lite se puede utilizar en varios modos de despliegue. Introducci\u00f3n a Couchbase Lite \u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-lite-embedded-in-ios-app-part1\/\">Correo electr\u00f3nico:<\/a> habla del modo de despliegue aut\u00f3nomo. Couchbase Lite puede ser usado en conjunto con un Sync Gateway remoto que le permitir\u00eda sincronizar datos a trav\u00e9s de dispositivos. Este post trata sobre el modo de despliegue usando un Sync Gateway.<\/p>\n<p>Hay muchas opciones para integrar el framework Couchbase Lite en tu aplicaci\u00f3n iOS. Echa un vistazo a nuestro Couchbase Mobile <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/installation\/ios\/index.html?language=ios\">Gu\u00eda de iniciaci\u00f3n<\/a>\u00a0para las distintas opciones de integraci\u00f3n.<\/p>\n<h3>API nativa<\/h3>\n<p>Couchbase Lite expone una API nativa para iOS, Android y Windows que permite a las aplicaciones interactuar f\u00e1cilmente con la plataforma Couchbase. Como desarrollador de aplicaciones, no tienes que preocuparte por el funcionamiento interno de la base de datos integrada de Couchbase Lite, sino que puedes centrarte en crear tu aplicaci\u00f3n. La API nativa te permite interactuar con el framework de Couchbase Lite como lo har\u00edas con otros frameworks\/subsistemas de la plataforma. De nuevo, hablaremos de Couchbase Mobile v1.4 en esta entrada del blog. Puedes obtener una lista completa de las APIs en nuestro Couchbase <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/references\/couchbase-lite\/couchbase-lite\/index.html\">Desarrollador<\/a> sitio.<\/p>\n<h2>Demo iOS App<\/h2>\n<p>Descargue el proyecto de demostraci\u00f3n de Xcode desde\u00a0<a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-starterapp\">Repo de Github<\/a>\u00a0y cambiar a la rama \"soporte de sincronizaci\u00f3n\". Usaremos esta app como ejemplo en el resto del blog. Esta aplicaci\u00f3n utiliza Cocoapods para integrar el framework Couchbase Lite.<\/p>\n<pre class=\"lang:default decode:true\">git clone git@github.com:couchbaselabs\/couchbase-lite-ios-standalone-sampleapp.git\r\ngit checkout syncsupport<\/pre>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3293\" style=\"width: 291px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3293\" class=\"size-full wp-image-3293\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/demo_recording_short.gif\" alt=\"\" width=\"281\" height=\"510\" \/><p id=\"caption-attachment-3293\" class=\"wp-caption-text\">Sincronizaci\u00f3n de documentos entre usuarios<\/p><\/div>\n<ol>\n<li>Cree y ejecute la aplicaci\u00f3n. Deber\u00eda aparecer una alerta de inicio de sesi\u00f3n<\/li>\n<li>Introduzca el usuario \"jane\" y la contrase\u00f1a de \"password\" . Este usuario se configur\u00f3 en el archivo de configuraci\u00f3n de Sync Gateway<\/li>\n<li>A\u00f1ada el primer documento pulsando el bot\u00f3n \"+\" en la esquina superior derecha.\n<ol>\n<li>D\u00e9 un nombre al documento y una descripci\u00f3n de una l\u00ednea.<\/li>\n<li>Utiliza la etiqueta \"privado\".<\/li>\n<li>Entre bastidores, el replicador push env\u00eda el documento a la pasarela de sincronizaci\u00f3n y es procesado por la funci\u00f3n de sincronizaci\u00f3n. Bas\u00e1ndose en la etiqueta, la funci\u00f3n de sincronizaci\u00f3n asigna el documento al canal privado del usuario.<\/li>\n<\/ol>\n<\/li>\n<li>A\u00f1ada un segundo documento pulsando el bot\u00f3n \"+\" en la esquina superior derecha.\n<ol>\n<li>Dar un nombre al documento y una descripci\u00f3n de una l\u00ednea<\/li>\n<li>Utiliza la etiqueta \"public\".<\/li>\n<li>Entre bastidores, el replicador push env\u00eda el documento a la pasarela de sincronizaci\u00f3n y es procesado por la funci\u00f3n de sincronizaci\u00f3n. Bas\u00e1ndose en la etiqueta p\u00fablica, la funci\u00f3n Sync asigna el documento al canal p\u00fablico<\/li>\n<\/ol>\n<\/li>\n<li>Ahora \"cierra sesi\u00f3n\" Jane . Aparecer\u00e1 de nuevo la alerta de inicio de sesi\u00f3n<\/li>\n<li>Introduzca el usuario \"joe\" y la contrase\u00f1a \"password\". Este usuario tambi\u00e9n se configur\u00f3 en el archivo de configuraci\u00f3n de Sync Gateway<\/li>\n<li>Aparecer\u00e1 el documento p\u00fablico creado por Jane.\n<ol>\n<li>\u00a0Entre bastidores, el Pull Replicator extrae todos los documentos del canal privado de Joe y del canal p\u00fablico. Se extrae el documento p\u00fablico creado por Jane. Sin embargo, como Joe no ten\u00eda acceso al canal privado de Jane, el documento privado creado por Jane no se extrae.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Para verificar el estado de las cosas en Sync Gateway, puede utilizar la interfaz REST de administraci\u00f3n mediante Postman o cualquier cliente HTTP.<\/p>\n<p>Esta es la petici\u00f3n CURL a la pasarela de sincronizaci\u00f3n<\/p>\n<pre class=\"lang:default decode:true\">curl -X GET \\\r\n 'https:\/\/localhost:4985\/demo\/_all_docs?access=false&amp;channels=false&amp;include_docs=true' \\\r\n -H 'accept: application\/json' \\\r\n -H 'cache-control: no-cache' \\\r\n -H 'content-type: application\/json'<\/pre>\n<p>La respuesta de la pasarela de sincronizaci\u00f3n muestra los dos documentos asignados al canal p\u00fablico y privado de Jane, respectivamente<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"rows\": [\r\n    {\r\n      \"key\": \"-6gCouN6jj0ScYgpMD7Qj1a\",\r\n      \"id\": \"-6gCouN6jj0ScYgpMD7Qj1a\",\r\n      \"value\": {\r\n        \"rev\": \"1-dfa6d453a1515ee3dd64012ccaf53046\",\r\n        \"channels\": [\r\n          \"_jane\"\r\n        ]\r\n      },\r\n      \"doc\": {\r\n        \"_id\": \"-6gCouN6jj0ScYgpMD7Qj1a\",\r\n        \"_rev\": \"1-dfa6d453a1515ee3dd64012ccaf53046\",\r\n        \"name\": \"doc101\",\r\n        \"overview\": \"This is a private doc from Jane\",\r\n        \"owner\": \"jane\",\r\n        \"tag\": \"private\"\r\n      }\r\n    },\r\n    {\r\n      \"key\": \"-A2wR44pAFCdu1Yufx14_1S\",\r\n      \"id\": \"-A2wR44pAFCdu1Yufx14_1S\",\r\n      \"value\": {\r\n        \"rev\": \"1-1a8cd0ea3b7574cf6f7ba4a10152a466\",\r\n        \"channels\": [\r\n          \"_public\"\r\n        ]\r\n      },\r\n      \"doc\": {\r\n        \"_id\": \"-A2wR44pAFCdu1Yufx14_1S\",\r\n        \"_rev\": \"1-1a8cd0ea3b7574cf6f7ba4a10152a466\",\r\n        \"name\": \"doc102\",\r\n        \"overview\": \"This is a public doc shared by Jane\",\r\n        \"owner\": \"jane\",\r\n        \"tag\": \"public\"\r\n      }\r\n    }\r\n  ],\r\n  \"total_rows\": 2,\r\n  \"update_seq\": 5\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Explorar el c\u00f3digo<\/h3>\n<p>Ahora, vamos a examinar fragmentos de c\u00f3digo relevantes de la Demo App iOS -<\/p>\n<h4><strong>Abrir\/crear una base de datos por usuario\u00a0<\/strong><\/h4>\n<p>Abrir <em>DocListTableViewController.swift<\/em> y localice <em>openDatabaseForUser<\/em>\u00a0funci\u00f3n.<\/p>\n<pre class=\"lang:swift decode:true\">\u00a0do {\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ 1: Set Database Options\r\n\u00a0 \u00a0 \u00a0 \u00a0let options = CBLDatabaseOptions()\r\n\u00a0 \u00a0 \u00a0 \u00a0options.storageType\u00a0 = kCBLSQLiteStorage\r\n\u00a0 \u00a0 \u00a0 \u00a0options.create = true\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/ 2: Create a DB for logged in user if it does not exist else return handle to existing one\r\n\u00a0 \u00a0 \u00a0 \u00a0self.db\u00a0 = try cbManager.openDatabaseNamed(user.lowercased(), with: options)\r\n\u00a0 \u00a0 \u00a0 \u00a0self.showAlertWithTitle(NSLocalizedString(\"Success!\", comment: \"\"), message: NSLocalizedString(\"Database \\(user) was opened succesfully at path \\(CBLManager.defaultDirectory())\", comment: \"\"))\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0 \u00a0 \u00a0  \/\/ 3. Start replication with remote Sync Gateway\r\n\u00a0 \u00a0 \u00a0\u00a0 startDatabaseReplicationForUser(user, password: password)\r\n\u00a0 \u00a0 \u00a0 \u00a0return true\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 catch\u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ handle error\u00a0\u00a0 \u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n<\/pre>\n<ol>\n<li>Especifica las opciones a asociar con la base de datos. Explore las dem\u00e1s opciones de la clase CBLDatabaseOptions.<\/li>\n<li>Crea una base de datos con el nombre del usuario actual. De esta forma, cada usuario de la aplicaci\u00f3n tendr\u00e1 su propia copia local de la base de datos. Si existe una base de datos con el nombre, se devolver\u00e1 un \"handle\" a la base de datos existente, de lo contrario se crear\u00e1 una nueva. Los nombres de las bases de datos deben estar en min\u00fasculas. Si tiene \u00e9xito, se crear\u00e1 una nueva base de datos local si no existe. Por defecto, la base de datos se crear\u00e1 en la ruta por defecto (\/Library\/Application Support). Puede especificar un directorio diferente al instanciar la aplicaci\u00f3n <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/references\/couchbase-lite\/couchbase-lite\/manager\/manager\/index.html\">CBLManager<\/a> clase.<\/li>\n<li>Inicia el Proceso de Replicaci\u00f3n de la Base de Datos para las credenciales de usuario dadas. Discutiremos el c\u00f3digo de Replicaci\u00f3n en detalle en las siguientes secciones.<\/li>\n<\/ol>\n<h4><strong>B\u00fasqueda de documentos<\/strong><\/h4>\n<p>Abra el D<em>ocListTableViewController.swif<\/em>t y localice <em>getAllDocumentForUserDatabase<\/em>\u00a0\u00a0funci\u00f3n.<\/p>\n<pre class=\"lang:default decode:true\">\/\/ 1. Create Query to fetch all documents. You can set a number of properties on the query object\r\nliveQuery = self.db?.createAllDocumentsQuery().asLive()\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\nguard let liveQuery = liveQuery else {\r\n\u00a0 \u00a0 \u00a0  return\r\n}\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ 2: You can optionally set a number of properties on the query object.\r\n\/\/ Explore other properties on the query object\r\nliveQuery.limit = UInt(UINT32_MAX) \/\/ All documents\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ \u00a0 query.postFilter =\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/3. Start observing for changes to the database\r\nself.addLiveQueryObserverAndStartObserving()\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ 4: Run the query to fetch documents asynchronously\r\nliveQuery.runAsync({ (enumerator, error) in\r\n\u00a0 \u00a0 \u00a0 \u00a0 switch error {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 case nil:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ 5: The \"enumerator\" is of type CBLQueryEnumerator and is an enumerator for the results\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.docsEnumerator = enumerator\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 default:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.showAlertWithTitle(NSLocalizedString(\"Data Fetch Error!\", comment: \"\"), message: error.localizedDescription)\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 })\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 catch\u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ handle error\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n<\/pre>\n<ol>\n<li>Obtener el acceso a la base de datos con el nombre especificado<\/li>\n<li>Crear un objeto de consulta. Esta consulta se utiliza para obtener todos los documentos. La funci\u00f3n de sincronizaci\u00f3n de la puerta de enlace de sincronizaci\u00f3n garantizar\u00e1 que los documentos se extraigan \u00fanicamente de los canales accesibles para el usuario. Puede crear un objeto de consulta normal o un objeto de consulta \"en vivo\". El objeto de consulta \"en vivo\" es de tipo <em>CBLLiveQuery<\/em> que se actualiza autom\u00e1ticamente cada vez que se producen cambios en la base de datos que afectan a los resultados de la consulta. La consulta tiene una serie de propiedades que se pueden modificar para personalizar los resultados. Pruebe a modificar las propiedades y vea el efecto en los resultados<\/li>\n<li>Tendr\u00e1 que a\u00f1adir expl\u00edcitamente un observador al objeto Live Query para ser notificado de los cambios en la base de datos. Discutiremos esto m\u00e1s a fondo en la secci\u00f3n \"Observaci\u00f3n de cambios sincronizados locales y remotos en los documentos\". No olvide eliminar el observador y dejar de observar los cambios cuando ya no lo necesite.<\/li>\n<li>Ejecute la consulta de forma as\u00edncrona. Tambi\u00e9n puede hacerlo de forma sincr\u00f3nica si lo prefiere, pero probablemente sea recomendable hacerlo de forma asincr\u00f3nica si los conjuntos de datos son grandes.<\/li>\n<\/ol>\n<p>Una vez que la consulta se ejecuta correctamente, se obtiene un objeto CBLQueryEnumerator. El enumerador de consultas permite enumerar los resultados. Se presta muy bien como fuente de datos para la vista de tabla que muestra los resultados<\/p>\n<h4><\/h4>\n<h4><strong>Observaci\u00f3n de cambios sincronizados locales y remotos en los documentos\u00a0<\/strong><\/h4>\n<p>Abra el <em>DocListTableViewController.swift <\/em>y localice la funci\u00f3n addLiveQueryObserverAndStartObserving.<\/p>\n<p>Los cambios en la base de datos pueden ser el resultado de las acciones del usuario en el dispositivo local o pueden ser el resultado de cambios sincronizados desde otros dispositivos.<\/p>\n<pre class=\"lang:swift decode:true\">\u00a0\/\/ 1. iOS Specific. Add observer to the live Query object\r\n    liveQuery.addObserver(self, forKeyPath: \"rows\", options: NSKeyValueObservingOptions.new, context: nil)\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n \/\/ 2. Start observing changes\r\n    liveQuery.start()\r\n<\/pre>\n<ol>\n<li>Para recibir notificaciones de los cambios en la base de datos que afectan a los resultados de la consulta, a\u00f1ada un observador al objeto Live Query. En su lugar, aprovecharemos el patr\u00f3n Key-Value-Observer de iOS para ser notificados de los cambios. A\u00f1adir un observador KVO al objeto Live Query para empezar a observar los cambios en la propiedad \"rows\" del objeto Live Query Esto se gestiona a trav\u00e9s de las APIs de Event Handler apropiadas en otras plataformas, como la plataforma <em>addChangeListener<\/em> en Android\/Java.<\/li>\n<li>Empieza a observar los cambios .<\/li>\n<\/ol>\n<p>Siempre que se produzca un cambio en la base de datos que afecte a la propiedad \"rows\" del objeto LiveQuery, tu aplicaci\u00f3n recibir\u00e1 una notificaci\u00f3n de cambios. Cuando recibas la notificaci\u00f3n de cambio, puedes actualizar tu UI, que en este caso ser\u00eda recargar la tableview.<\/p>\n<pre class=\"lang:swift decode:true\">if keyPath == \"rows\" {\r\n\u00a0 \u00a0 self.docsEnumerator = self.liveQuery?.rows\r\n\u00a0 \u00a0 tableView.reloadData()\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h4><strong>Autenticaci\u00f3n de las solicitudes de r\u00e9plica<\/strong><\/h4>\n<p>Abrir <em>Archivo DocListTableViewController.swift<\/em> y localizar <em>startDatabaseReplicationForUser<\/em>\u00a0funci\u00f3n.<\/p>\n<p>Todas las solicitudes de replicaci\u00f3n deben estar autenticadas. En esta aplicaci\u00f3n, utilizamos la autenticaci\u00f3n b\u00e1sica HTTP.<\/p>\n<pre class=\"lang:swift decode:true\">let auth = CBLAuthenticator.basicAuthenticator(withName: user, password: password)<\/pre>\n<p>Existen varios tipos de autenticador: Basic, Facebook, OAuth1, Persona, SSL\/TLS Cert.<\/p>\n<h4><strong>Replicaci\u00f3n Pull<\/strong><\/h4>\n<p>Abrir <em>Archivo DocListTableViewController.swift<\/em> y localizar <em>startPullReplicationWithAuthenticator<\/em>\u00a0funci\u00f3n.<\/p>\n<pre class=\"lang:swift decode:true\">\/\/ 1: Create a Pull replication to start pulling from remote source\r\nlet pullRepl = db?.createPullReplication(URL(string: kDbName, relativeTo: URL.init(string: kRemoteSyncUrl))!)\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ 2. Set Authenticator for pull replication\r\npullRepl?.authenticator = auth\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ Continuously look for changes\r\npullRepl?.continuous = true\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ Optionally, Set channels from which to pull\r\n\/\/ pullRepl?.channels = [...]\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n \/\/ 4. Start the pull replicator\r\n\u00a0pullRepl?.start()\r\n<\/pre>\n<ol>\n<li>Cree un replicador de extracci\u00f3n para extraer los cambios de la puerta de enlace de sincronizaci\u00f3n remota. La direcci\u00f3n <em>kRemoteSyncUrl<\/em> es la URL del punto final de la base de datos remota en Sync Gateway.<\/li>\n<li>Asociar Autenticador con la Replicaci\u00f3n Pull. Opcionalmente se pueden establecer los canales de los que se extraer\u00e1n los documentos<\/li>\n<li>Configurar la replicaci\u00f3n como \"continua\" permitir\u00e1 que las actualizaciones de cambios se extraigan indefinidamente a menos que se detenga expl\u00edcitamente o se cierre la base de datos.<\/li>\n<li>Iniciar la replicaci\u00f3n Pull<\/li>\n<\/ol>\n<h4><strong>Replicaci\u00f3n Push<\/strong><\/h4>\n<p>Abrir <em>Archivo DocListTableViewController.swift<\/em> y localizar <em>startPushReplicationWithAuthenticator<\/em>\u00a0funci\u00f3n.<\/p>\n<pre class=\"lang:default decode:true\">\/\/ 1: Create a push replication to start pushing to remote source\r\nlet pushRepl = db?.createPushReplication(URL(string: kDbName, relativeTo: URL.init(string:kRemoteSyncUrl))!)\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ 2. Set Authenticator for push replication\r\npushRepl?.authenticator = auth\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ Continuously push\u00a0 changes\r\npushRepl?.continuous = true\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0\r\n\/\/ 3. Start the push replicator\r\npushRepl?.start()<\/pre>\n<ol>\n<li>Cree un replicador push para enviar los cambios a la puerta de enlace de sincronizaci\u00f3n remota. La direcci\u00f3n <em>kRemoteSyncUrl<\/em> es la URL del punto final de la base de datos remota en Sync Gateway.<\/li>\n<li>Asociar autenticador con la replicaci\u00f3n push.<\/li>\n<li>Configurar la replicaci\u00f3n como \"continua\" permitir\u00e1 que las actualizaciones de cambios se env\u00eden indefinidamente a menos que se detenga expl\u00edcitamente o se cierre la base de datos.<\/li>\n<li>Iniciar la replicaci\u00f3n push<\/li>\n<\/ol>\n<h4><strong>Supervisi\u00f3n del estado de la replicaci\u00f3n<\/strong><\/h4>\n<p>Abra el <em>DBListTableViewController.swift<\/em> y localice la funci\u00f3n addRemoteDatabaseChangesObserverAndStartObserving.<\/p>\n<pre class=\"lang:default decode:true\">\/\/ 1. iOS Specific. Add observer to the NOtification Center to observe replicator changes\r\nNotificationCenter.default.addObserver(forName: NSNotification.Name.cblReplicationChange, object: db, queue: nil) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 [unowned self] (notification) in\r\n\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0 \/\/ Handle changes to the replicator status - Such as displaying progress\r\n  \/\/ indicator when status is .running \r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Puede supervisar el estado de la replicaci\u00f3n a\u00f1adiendo un observador al Centro de notificaciones de iOS para recibir notificaciones de <em>cblReplicationChange<\/em> notificaciones . Usted podr\u00eda utilizar el controlador de notificaci\u00f3n, por ejemplo, para mostrar indicadores de progreso apropiados para el usuario.  Esto se maneja a trav\u00e9s de las APIs de manejadores de eventos apropiados en otras plataformas como el <em>addChangeListener<\/em> en Android\/Java.<\/p>\n<h2>\u00bfY ahora qu\u00e9?<\/h2>\n<p>Nos encantar\u00eda conocer su opini\u00f3n. As\u00ed que si tienes preguntas o comentarios, no dudes en ponerte en contacto conmigo en Twitter <a href=\"https:\/\/twitter.com\/rajagp\">@rajagp<\/a> o env\u00edeme un correo electr\u00f3nico <a href=\"mailto:priya.rajagopal@couchbase.com\">priya.rajagopal@couchbase.com<\/a>. Si desea mejorar la aplicaci\u00f3n de demostraci\u00f3n, env\u00ede una solicitud de extracci\u00f3n a la base de datos <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-starterapp\">Repo de Github.<\/a><\/p>\n<p>En <a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/c\/mobile\/\">Foros de desarrollo de Couchbase Mobile<\/a> es otro gran lugar para obtener respuestas a sus preguntas relacionadas con los m\u00f3viles. Consulte el portal de desarrollo para obtener m\u00e1s informaci\u00f3n sobre el <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/guides\/sync-gateway\/index.html?language=ios\">Pasarela de sincronizaci\u00f3n<\/a>\u00a0y <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/guides\/couchbase-lite\/index.html?language=ios\">Couchbase Lite<\/a>\u00a0. Todo lo que se discuti\u00f3 aqu\u00ed est\u00e1 en el contexto de Couchbase Mobile 1.4. Hay un mont\u00f3n de cambios nuevos y emocionantes que vienen en Couchbase Mobile 2.0. Aseg\u00farate de revisar el\u00a0\u00a0<a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html?language=ios\">Vista previa para desarrolladores <\/a>versi\u00f3n 2.0 de Couchbase Mobile.<\/p>","protected":false},"excerpt":{"rendered":"<p>This post looks at how you get started with data replication\/synchronization across iOS devices using Couchbase Mobile. The Couchbase Mobile Stack comprises of Couchbase Server, Sync Gateway and Couchbase Lite embedded NoSQL Database. In an earlier post, we discussed how [&hellip;]<\/p>","protected":false},"author":1423,"featured_media":3298,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,7667,1810,1816,2366],"tags":[1952,1536,1725,1562,1953],"ppma_author":[8948],"class_list":["post-3287","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-lite","category-couchbase-mobile","category-couchbase-server","category-sync-gateway","tag-data-replication","tag-ios","tag-nosql-database","tag-replication","tag-sync-function"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Data Synchronization Across iOS Devices Using Couchbase Mobile - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"This post looks discusses data replication\/synchronization using Couchbase Sync Gateway across devices with Couchbase Lite embedded NoSQL Database\" \/>\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\/es\/data-sync-on-ios-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Data Synchronization Across iOS Devices Using Couchbase Mobile\" \/>\n<meta property=\"og:description\" content=\"This post looks discusses data replication\/synchronization using Couchbase Sync Gateway across devices with Couchbase Lite embedded NoSQL Database\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/data-sync-on-ios-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-24T17:30:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:43:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png\" \/>\n\t<meta property=\"og:image:width\" content=\"587\" \/>\n\t<meta property=\"og:image:height\" content=\"364\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"Data Synchronization Across iOS Devices Using Couchbase Mobile\",\"datePublished\":\"2017-04-24T17:30:54+00:00\",\"dateModified\":\"2025-06-14T06:43:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/\"},\"wordCount\":2262,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png\",\"keywords\":[\"Data Replication\",\"ios\",\"NoSQL Database\",\"replication\",\"sync function\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Lite\",\"Couchbase Mobile\",\"Couchbase Server\",\"Sync Gateway\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/\",\"name\":\"Data Synchronization Across iOS Devices Using Couchbase Mobile - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png\",\"datePublished\":\"2017-04-24T17:30:54+00:00\",\"dateModified\":\"2025-06-14T06:43:26+00:00\",\"description\":\"This post looks discusses data replication\/synchronization using Couchbase Sync Gateway across devices with Couchbase Lite embedded NoSQL Database\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png\",\"width\":587,\"height\":364,\"caption\":\"Couchbase Data Synchronization\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data Synchronization Across iOS Devices Using 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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/author\/priya-rajagopalcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Sincronizaci\u00f3n de datos entre dispositivos iOS usando Couchbase Mobile - El blog de Couchbase","description":"This post looks discusses data replication\/synchronization using Couchbase Sync Gateway across devices with Couchbase Lite embedded NoSQL Database","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\/es\/data-sync-on-ios-couchbase-mobile\/","og_locale":"es_MX","og_type":"article","og_title":"Data Synchronization Across iOS Devices Using Couchbase Mobile","og_description":"This post looks discusses data replication\/synchronization using Couchbase Sync Gateway across devices with Couchbase Lite embedded NoSQL Database","og_url":"https:\/\/www.couchbase.com\/blog\/es\/data-sync-on-ios-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-04-24T17:30:54+00:00","article_modified_time":"2025-06-14T06:43:26+00:00","og_image":[{"width":587,"height":364,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png","type":"image\/png"}],"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":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"Data Synchronization Across iOS Devices Using Couchbase Mobile","datePublished":"2017-04-24T17:30:54+00:00","dateModified":"2025-06-14T06:43:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/"},"wordCount":2262,"commentCount":4,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png","keywords":["Data Replication","ios","NoSQL Database","replication","sync function"],"articleSection":["Best Practices and Tutorials","Couchbase Lite","Couchbase Mobile","Couchbase Server","Sync Gateway"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/","name":"Sincronizaci\u00f3n de datos entre dispositivos iOS usando Couchbase Mobile - El blog de Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png","datePublished":"2017-04-24T17:30:54+00:00","dateModified":"2025-06-14T06:43:26+00:00","description":"This post looks discusses data replication\/synchronization using Couchbase Sync Gateway across devices with Couchbase Lite embedded NoSQL Database","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/Screen-Shot-2017-04-18-at-12.45.04-PM.png","width":587,"height":364,"caption":"Couchbase Data Synchronization"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/data-sync-on-ios-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Data Synchronization Across iOS Devices Using Couchbase Mobile"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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, Directora de Gesti\u00f3n de Productos","image":{"@type":"ImageObject","inLanguage":"es","@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 es directora s\u00e9nior de gesti\u00f3n de productos en Couchbase y responsable de las plataformas de desarrollo para la nube y el per\u00edmetro. Lleva m\u00e1s de 20 a\u00f1os dedic\u00e1ndose profesionalmente al desarrollo de software en varios puestos de liderazgo t\u00e9cnico y de producto, con m\u00e1s de 10 a\u00f1os centrados en tecnolog\u00edas m\u00f3viles. Como delegada de est\u00e1ndares IPTV de TISPAN, fue una colaboradora clave en las especificaciones de est\u00e1ndares IPTV. Tiene 22 patentes en las \u00e1reas de redes y seguridad de plataformas.","sameAs":["https:\/\/x.com\/rajagp"],"url":"https:\/\/www.couchbase.com\/blog\/es\/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 es directora s\u00e9nior de gesti\u00f3n de productos en Couchbase y responsable de las plataformas de desarrollo para la nube y el per\u00edmetro. Lleva m\u00e1s de 20 a\u00f1os dedic\u00e1ndose profesionalmente al desarrollo de software en varios puestos de liderazgo t\u00e9cnico y de producto, con m\u00e1s de 10 a\u00f1os centrados en tecnolog\u00edas m\u00f3viles. Como delegada de est\u00e1ndares IPTV de TISPAN, fue una colaboradora clave en las especificaciones de est\u00e1ndares IPTV. Tiene 22 patentes en las \u00e1reas de redes y seguridad de plataformas."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3287","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/1423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=3287"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3287\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/3298"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=3287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=3287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=3287"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=3287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}