{"id":2515,"date":"2017-04-23T16:14:25","date_gmt":"2017-04-23T23:14:25","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2515"},"modified":"2024-01-12T12:26:11","modified_gmt":"2024-01-12T20:26:11","slug":"getting-started-with-urban-airship-push-notifications","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/getting-started-with-urban-airship-push-notifications\/","title":{"rendered":"Primeiros passos com as notifica\u00e7\u00f5es por push do Urban Airship"},"content":{"rendered":"<p style=\"text-align: center\"><img decoding=\"async\" style=\"max-width: 30% ! important\" src=\"\/wp-content\/original-assets\/2017\/january\/getting-started-with-urban-airship-push-notifications\/urban-airship-logo-blue.png\" alt=\"Urban Airship Logo\" align=\"middle\" \/><\/p>\n<p><a href=\"https:\/\/www.urbanairship.com\/\">Aeronave urbana<\/a> \u00e9 um servi\u00e7o popular de mensagens e notifica\u00e7\u00f5es. <span style=\"font-weight: 400\">\u00a0Na parte 1 desta postagem, veremos como configurar as notifica\u00e7\u00f5es push do Urban Airship. Na parte 2 da postagem, usaremos essas notifica\u00e7\u00f5es para<\/span> acionam replica\u00e7\u00f5es em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/mobile\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase Mobile<\/a>.<\/p>\n<h2>O que voc\u00ea precisar\u00e1<\/h2>\n<p>Voc\u00ea pode usar o Urban Airship (UA) gratuitamente. (Consulte o site da UA para obter detalhes sobre os pre\u00e7os atuais.) \u00c9 necess\u00e1rio registrar uma conta.<\/p>\n<ul>\n<li>Relato de um dirig\u00edvel urbano<\/li>\n<li>Uma conta do Firebase (requer uma conta de login do Google)<\/li>\n<li>Android Studio (ou Xcode)<\/li>\n<\/ul>\n<h2>Parte 1 - Configurando o Urban Airship<\/h2>\n<p>Abra um projeto Android ou iOS existente em seu IDE (ou crie um novo). Aqui, ilustrarei o uso do Android.<\/p>\n<p>Fa\u00e7a login na sua conta da UA. Navegue at\u00e9 a p\u00e1gina Novo aplicativo. Preencha o nome do aplicativo. Selecione as plataformas que voc\u00ea deseja usar. (Escolheremos Android e iOS para este exemplo.) Ao clicar em \"Save\", voc\u00ea ser\u00e1 levado ao guia de in\u00edcio r\u00e1pido.  (Se voc\u00ea j\u00e1 tiver passado pelo in\u00edcio r\u00e1pido e precisar relembrar a configura\u00e7\u00e3o, poder\u00e1 encontrar as etapas para Android\u00a0<a href=\"https:\/\/docs.urbanairship.com\/platform\/android\/\">aqui<\/a>\u00a0e para iOS <a href=\"https:\/\/docs.urbanairship.com\/platform\/ios\/\">aqui<\/a>.)<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" style=\"max-width: 70% ! important\" src=\"\/wp-content\/original-assets\/2017\/january\/getting-started-with-urban-airship-push-notifications\/urban-airship---new-app.png\" alt=\"Urban Airship New Application Dialog\" align=\"middle\" \/><\/p>\n<h3>In\u00edcio r\u00e1pido da UA<\/h3>\n<p>Aqui \u00e9 oferecida uma guia para cada plataforma selecionada. Conforme mencionado, vamos nos concentrar na cria\u00e7\u00e3o para Android desta vez.<\/p>\n<p>Siga as etapas de in\u00edcio r\u00e1pido do Urban Airship. Tenho algumas dicas para os problemas que encontrei.<\/p>\n<h4>Etapas 1 e 2 do in\u00edcio r\u00e1pido do Urban Airship<\/h4>\n<p>O guia UA refere-se ao script build.gradle do projeto, mas mostra a modifica\u00e7\u00e3o do script build.gradle do m\u00f3dulo. Adicionei o reposit\u00f3rio do UA ao script gradle do meu projeto e a depend\u00eancia do UA ao script gradle do m\u00f3dulo. Isso funcionou bem.<\/p>\n<p>Procure o ID do aplicativo no script gradle do m\u00f3dulo.<\/p>\n<h4>Etapa 5 do in\u00edcio r\u00e1pido do Urban Airship<\/h4>\n<p>Para criar sua pr\u00f3pria classe de aplicativo, clique com o bot\u00e3o direito do mouse na \u00e1rea do aplicativo do painel de navega\u00e7\u00e3o do projeto e selecione Novo &gt; Classe Java. Na janela pop-up, defina o nome da classe. Em seguida, para a superclasse, digite android.app.Application.<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" style=\"max-width: 50% ! important\" src=\"\/wp-content\/original-assets\/2017\/january\/getting-started-with-urban-airship-push-notifications\/screen-shot-2017-01-28-at-3.37.30-pm.png\" alt=\"Creating an Application subclass\" align=\"middle\" \/><\/p>\n<p>N\u00e3o se esque\u00e7a de atualizar seu arquivo de manifesto. Voc\u00ea pode usar o nome totalmente qualificado de sua classe ou a forma abreviada que o UA mostra. O formul\u00e1rio totalmente qualificado tem a seguinte apar\u00eancia:<\/p>\n<pre class=\"lang:default decode:true\">    &lt;application\r\n        android:name=\"com.couchbase.cblite.android.cbpushsync.MyApplication\"<\/pre>\n<h4>Etapa 6 do in\u00edcio r\u00e1pido do Urban Airship<\/h4>\n<p>A UA usa o Firebase Cloud Messaging (FCM). A sexta etapa tem um link para a documenta\u00e7\u00e3o adicional da UA. Essa nova p\u00e1gina tem instru\u00e7\u00f5es detalhadas sobre como criar uma chave de API para seu aplicativo.<\/p>\n<p>As instru\u00e7\u00f5es nessa p\u00e1gina sob o t\u00edtulo \"Configurar o servi\u00e7o FCM\/GCM com o Urban Airship\" est\u00e3o um pouco desatualizadas. Voc\u00ea encontrar\u00e1 a \u00e1rea para inserir a chave Api e o pacote no final do guia de in\u00edcio r\u00e1pido agora, em vez de onde os documentos dizem para procurar.<\/p>\n<p>Em um lugar, os documentos do UA se referem ao \"N\u00famero do projeto da API do Google\". Isso \u00e9 o que o FCM chama de ID do remetente.<\/p>\n<h2>Testes<\/h2>\n<p>O in\u00edcio r\u00e1pido termina com uma \u00e1rea de teste, sem muitas instru\u00e7\u00f5es. Se voc\u00ea observar o c\u00f3digo inclu\u00eddo na subclasse Application, ver\u00e1 que ele est\u00e1 ativando as notifica\u00e7\u00f5es do usu\u00e1rio. Para testar, crie seu aplicativo e instale-o em um emulador ou dispositivo. (Tentei em ambos e funcionaram bem).<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" style=\"max-width: 70% ! important\" src=\"\/wp-content\/original-assets\/2017\/january\/getting-started-with-urban-airship-push-notifications\/screen-shot-2017-01-28-at-4.15.18-pm.png\" alt=\"Urban Airship Test Panel\" align=\"middle\" \/><\/p>\n<p>Digite algo no campo de texto e clique em \"Send Test\" (Enviar teste). Voc\u00ea ver\u00e1 um \u00edcone aparecer na \u00e1rea de notifica\u00e7\u00e3o do Android. Estranhamente, isso n\u00e3o inclui o texto inserido na \u00e1rea de teste.<\/p>\n<p>Para a solu\u00e7\u00e3o de problemas, a UA o direciona para um link obscuro \"Error Console\" no canto inferior direito da p\u00e1gina de documenta\u00e7\u00e3o. Infelizmente, o link s\u00f3 me levou de volta ao guia de in\u00edcio r\u00e1pido.<\/p>\n<h2>Concluindo a parte 1<\/h2>\n<p><span style=\"font-weight: 400\">Como voc\u00ea viu nas etapas anteriores, a configura\u00e7\u00e3o do Urban Airship foi bastante r\u00e1pida. O in\u00edcio r\u00e1pido mostra como enviar uma notifica\u00e7\u00e3o de alerta. Para acionar a sincroniza\u00e7\u00e3o de dados em um cliente do Couchbase Lite, \u00e9 necess\u00e1rio enviar um alerta silencioso; a parte 2 desta publica\u00e7\u00e3o abordar\u00e1 esse assunto.<\/span><\/p>\n<h2>Parte 2 - Acionando a sincroniza\u00e7\u00e3o de dados a partir da nuvem<\/h2>\n<p><span style=\"font-weight: 400\">Na parte 1 desta postagem, voc\u00ea configurou o Urban Airship; na parte 2, mostrarei<\/span> um aplicativo Android de amostra criado com <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/couchbase-lite\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase Lite<\/a> que usa uma notifica\u00e7\u00e3o push do Urban Airship para acionar a sincroniza\u00e7\u00e3o de dados da nuvem para um dispositivo m\u00f3vel. Aqui, \"a nuvem\" ser\u00e1 um <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Gateway de sincroniza\u00e7\u00e3o<\/a> em uma configura\u00e7\u00e3o de teste. (O Couchbase Lite e o Sync Gateway fazem parte da pilha do Couchbase Mobile. Voc\u00ea pode ler sobre o Couchbase Mobile <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/mobile\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">aqui<\/a>.)<\/p>\n<h2>Hist\u00f3rico<\/h2>\n<p>O Couchbase Mobile sincroniza os dados usando replica\u00e7\u00f5es unidirecionais. Voc\u00ea pode definir as replica\u00e7\u00f5es para serem executadas e encerradas imediatamente quando os dados locais estiverem atualizados (\"one-shot\") ou para ouvir indefinidamente novas altera\u00e7\u00f5es (\"continuous\").<\/p>\n<p>H\u00e1 alguns motivos pelos quais voc\u00ea pode querer usar um servi\u00e7o como o Urban Airship para acionar a sincroniza\u00e7\u00e3o em vez de configurar uma replica\u00e7\u00e3o cont\u00ednua. Por exemplo, uma replica\u00e7\u00e3o cont\u00ednua \"pull\" (que recupera dados da nuvem) precisa manter uma conex\u00e3o de rede aberta. Uma conex\u00e3o aberta necessariamente causar\u00e1 algum consumo na bateria do dispositivo, mesmo quando estiver inativa. O ideal \u00e9 que um aplicativo abra uma conex\u00e3o somente quando houver altera\u00e7\u00f5es a serem transferidas.<\/p>\n<p>Al\u00e9m disso, os servi\u00e7os de notifica\u00e7\u00e3o por push, como o Urban Airship, costumam ter v\u00e1rios recursos avan\u00e7ados para lidar com grupos de dispositivos. A UA pode lhe proporcionar grande flexibilidade no gerenciamento de quando as opera\u00e7\u00f5es acontecem. Al\u00e9m disso, se o seu aplicativo j\u00e1 usa um servi\u00e7o push, ele j\u00e1 requer sua pr\u00f3pria conex\u00e3o de rede aberta. Faz sentido usar isso para acionar o Couchbase Lite em vez de duplicar a rede.<\/p>\n<p>Este exemplo mostrar\u00e1 como integrar o Urban Airship. Examinarei todas as pe\u00e7as necess\u00e1rias para que voc\u00ea possa criar um aplicativo totalmente funcional.<\/p>\n<h2>O aplicativo<\/h2>\n<p>Aqui est\u00e1 uma olhada no aplicativo em a\u00e7\u00e3o. A parte superior da imagem mostra o aplicativo em execu\u00e7\u00e3o. A parte inferior mostra uma notifica\u00e7\u00e3o push enviada pela linha de comando. Quando o aplicativo recebe a notifica\u00e7\u00e3o por push, ele exibe um bot\u00e3o girat\u00f3rio de progresso, dispara uma replica\u00e7\u00e3o pull de uma s\u00f3 vez e exibe as altera\u00e7\u00f5es do documento recebidas em uma exibi\u00e7\u00e3o de texto.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3417\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/CBPushSync.gif\" alt=\"\" width=\"366\" height=\"544\" \/>Para entender esse exemplo, daremos uma olhada em quatro classes, um pouco da \"cola\" que as une e mostraremos como testar os resultados.<\/p>\n<h2>Classes exigidas pela Urban Airship<\/h2>\n<p>Para usar o Urban Airship (UA), precisamos implementar duas classes, uma subclasse do Autopilot e uma subclasse do AirshipReceiver.<\/p>\n<h3>Piloto autom\u00e1tico<\/h3>\n<p>UA precisa ser inicializado antes do uso. Voc\u00ea pode fazer isso de duas maneiras: ou chamar <code>decolagem<\/code> na se\u00e7\u00e3o <code>onCreate<\/code> ou criando uma subclasse do Autopilot. Optei pela segunda op\u00e7\u00e3o. Como veremos, o UA tem uma maneira interessante de usar automaticamente nossa subclasse.<\/p>\n<p>A classe \u00e9 simples. N\u00e3o quero exibir nada na barra de notifica\u00e7\u00e3o. Uso essa classe para desativar as notifica\u00e7\u00f5es do usu\u00e1rio, e isso \u00e9 tudo.<\/p>\n<p>Aqui est\u00e1 a listagem completa do CBAutoPilot.java.<\/p>\n<pre class=\"lang:java decode:true\">package com.couchbase.cblite.android.cbpushsync;\r\n\r\nimport com.urbanairship.Autopilot;\r\nimport com.urbanairship.UAirship;\r\n\r\npublic class CBAutoPilot extends Autopilot {\r\n    @Override\r\n    public void onAirshipReady(UAirship airship) {\r\n        airship.getPushManager().setUserNotificationsEnabled(false);\r\n    }\r\n}<\/pre>\n<p>Para usar essa classe, o UA emprega uma t\u00e9cnica exclusiva do Android. Voc\u00ea indica qual classe usar com uma entrada em seu arquivo de manifesto do Android. No meu caso, a entrada tem a seguinte apar\u00eancia (colocada dentro do arquivo <code>aplicativo<\/code> se\u00e7\u00e3o):<\/p>\n<pre class=\"lang:default decode:true\">        &lt;meta-data android:name=\"com.urbanairship.autopilot\"\r\n            android:value=\"com.couchbase.cblite.android.cbpushsync.CBAutoPilot\"\/&gt;\r\n<\/pre>\n<p>\u00c9 aqui que acontece um pouco da m\u00e1gica do Android. O UA inclui uma classe de provedor de conte\u00fado para automatizar a inicializa\u00e7\u00e3o. \u00c9 garantido que os provedores de conte\u00fado sejam instanciados antes que o aplicativo <code>onCreate<\/code> \u00e9 chamado. O UA usa isso para incluir c\u00f3digo para ler essa entrada de metadados, instanciar a subclasse e chamar o m\u00e9todo <code>onAirshipReady<\/code> m\u00e9todo.<\/p>\n<h3>AirshipReceiver<\/h3>\n<p>Com o UA inicializado e pronto para funcionar, precisamos fornecer os ganchos para capturar e processar as notifica\u00e7\u00f5es. Para fazer isso, implemente uma subclasse de AirshipReceiver. Novamente, a classe \u00e9 simples.<\/p>\n<p>Aqui est\u00e1 a listagem completa do CBAirshipReceiver.java.<\/p>\n<pre class=\"lang:java decode:true\">package com.couchbase.cblite.android.cbpushsync;\r\n\r\nimport android.content.Context;\r\nimport android.support.annotation.NonNull;\r\nimport android.util.Log;\r\n\r\nimport com.urbanairship.AirshipReceiver;\r\nimport com.urbanairship.push.PushMessage;\r\n\r\npublic class CBAirshipReceiver extends AirshipReceiver {\r\n    private static final String TAG = \"CBAirshipReceiver\";\r\n\r\n    @Override\r\n    protected void onPushReceived(Context context, PushMessage message, boolean notificationPosted) {\r\n        Log.i(TAG, \"Received push message. Alert: \" + message.getAlert() + \". posted notification: \" + notificationPosted);\r\n\r\n        switch(message.getAlert()) {\r\n            case \"start\":\r\n                CBLHelper.getInstance().startReplication();\r\n                break;\r\n            case \"stop\":\r\n                CBLHelper.getInstance().stopReplication();\r\n                break;\r\n            case \"reset\":\r\n                CBLHelper.getInstance().reset();\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n\r\n    @Override\r\n    protected void onChannelCreated(@NonNull Context context, @NonNull String channelId) {\r\n        Log.i(TAG, \"Channel created. Channel Id:\" + channelId + \".\");\r\n    }\r\n\r\n    @Override\r\n    protected void onChannelUpdated(@NonNull Context context, @NonNull String channelId) {\r\n        Log.i(TAG, \"Channel updated. Channel Id:\" + channelId + \".\");\r\n    }\r\n\r\n    @Override\r\n    protected void onChannelRegistrationFailed(Context context) {\r\n        Log.i(TAG, \"Channel registration failed.\");\r\n    }\r\n}\r\n<\/pre>\n<p>Quando come\u00e7armos a testar o aplicativo, veremos como o UA permite que voc\u00ea defina o texto do alerta. Usei isso aqui para fornecer algumas opera\u00e7\u00f5es remotas diferentes. Um alerta pode iniciar e interromper replica\u00e7\u00f5es. Tamb\u00e9m inclu\u00ed a possibilidade de, enviando \"reset\", excluir o banco de dados. Fiz isso porque, uma vez que voc\u00ea replica os dados, eles s\u00e3o persistentes no dispositivo. O desligamento do aplicativo n\u00e3o redefine o banco de dados local. Em vez de sempre ter de adicionar novos documentos por meio do Sync Gateway para mostrar que a replica\u00e7\u00e3o est\u00e1 funcionando, adicionei a capacidade de limpar o banco de dados do dispositivo e come\u00e7ar de novo.<\/p>\n<p>Voc\u00ea notar\u00e1 alguns outros m\u00e9todos substitu\u00eddos acima. Esses m\u00e9todos s\u00e3o todos declarados abstratos na classe AirshipReceiver, portanto, temos de incluir pelo menos uma implementa\u00e7\u00e3o m\u00ednima. Acontece, por\u00e9m, que precisamos saber a ID do canal do dispositivo para enviar uma mensagem a ele. Essa ID de canal muda com frequ\u00eancia. Em um post futuro, mostrarei como registrar a ID para que um aplicativo do lado do servidor possa enviar para o dispositivo. Por enquanto, \u00e9 \u00fatil registrar a ID para que possamos extra\u00ed-la e us\u00e1-la nos testes.<\/p>\n<h2>As classes de aplicativos<\/h2>\n<p>Os ganchos acima colocam o UA em funcionamento, capturam notifica\u00e7\u00f5es e acionam a\u00e7\u00f5es com base em seu conte\u00fado. Agora vamos dar uma olhada no aplicativo em si.<\/p>\n<p>O aplicativo consiste em uma Activity configurada para que possamos ver o conte\u00fado dos documentos \u00e0 medida que eles s\u00e3o extra\u00eddos. A outra classe envolve algumas das funcionalidades do Couchbase Lite em um auxiliar.<\/p>\n<h3>A atividade principal<\/h3>\n<p>Na atividade principal, quero mostrar uma barra de progresso enquanto as replica\u00e7\u00f5es acontecem e, em seguida, exibir o conjunto de documentos enviados.<\/p>\n<p>Aqui est\u00e1 a listagem completa do MainActivity.java<\/p>\n<pre class=\"lang:java decode:true\">package com.couchbase.cblite.android.cbpushsync;\r\n\r\nimport android.os.Bundle;\r\nimport android.support.v7.app.AppCompatActivity;\r\nimport android.support.v7.widget.Toolbar;\r\nimport android.util.Log;\r\nimport android.view.View;\r\nimport android.widget.ProgressBar;\r\nimport android.widget.TextView;\r\n\r\nimport com.couchbase.lite.Database;\r\nimport com.couchbase.lite.Document;\r\nimport com.couchbase.lite.DocumentChange;\r\nimport com.couchbase.lite.replicator.Replication;\r\nimport com.couchbase.lite.replicator.ReplicationState;\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\n\r\nimport java.io.IOException;\r\n\r\npublic class MainActivity extends AppCompatActivity {\r\n    private static String TAG = MainActivity.class.getSimpleName();\r\n    private static final ObjectMapper mapper = new ObjectMapper();\r\n\r\n    private CBLHelper cblHelper = CBLHelper.getInstance();\r\n    private TextView documentView;\r\n    private ProgressBar progressBar;\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_main);\r\n        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);\r\n        setSupportActionBar(toolbar);\r\n\r\n        documentView = (TextView) findViewById(R.id.documentView);\r\n        progressBar = (ProgressBar) findViewById(R.id.progressBar);\r\n\r\n        cblHelper.initialize(\r\n            new Database.ChangeListener() {\r\n                @Override\r\n                public void changed(Database.ChangeEvent event) {\r\n                    Log.i(TAG, \"Database change called: count - \" + event.getChanges().size());\r\n\r\n                    if (!event.isExternal()) {\r\n                        return;\r\n                    }\r\n\r\n                    String json = \"\";\r\n\r\n                    for (final DocumentChange change : event.getChanges()) {\r\n                        if (!change.isCurrentRevision()) {\r\n                            continue;\r\n                        }\r\n\r\n                        Document changedDoc = cblHelper.getExistingDocument(change.getDocumentId());\r\n\r\n                        if (changedDoc == null) continue;\r\n\r\n                        try {\r\n                            json += mapper.writeValueAsString(changedDoc.getProperties());\r\n                        } catch (IOException e) {\r\n                            e.printStackTrace();\r\n                        }\r\n                    }\r\n\r\n                    final String text = json;\r\n\r\n                    runOnUiThread(new Runnable() {\r\n                        @Override\r\n                        public void run() {\r\n                            documentView.setText(text);\r\n                        }\r\n                    });\r\n                }\r\n            },\r\n            new Replication.ChangeListener() {\r\n                @Override\r\n                public void changed(Replication.ChangeEvent event) {\r\n                    Log.i(TAG, \"Replication change called: \" + event.toString());\r\n\r\n                    if (event.getError() != null) return;\r\n\r\n                    if (event.getTransition() == null) return;\r\n\r\n                    ReplicationState dest = event.getTransition().getDestination();\r\n\r\n                    final int replicationProgress =\r\n                            ((dest == ReplicationState.STOPPING ||\r\n                              dest == ReplicationState.STOPPED) ?\r\n                                    View.INVISIBLE : View.VISIBLE);\r\n\r\n                    runOnUiThread(new Runnable() {\r\n                        @Override\r\n                        public void run() {\r\n                            progressBar.setVisibility(replicationProgress);\r\n                        }\r\n                    });\r\n                }\r\n            }\r\n        );\r\n    }\r\n}<\/pre>\n<p>O n\u00facleo do c\u00f3digo aqui consiste em dois ouvintes de altera\u00e7\u00f5es, um para o banco de dados e outro para as replica\u00e7\u00f5es. Cada interface de ouvinte define um \u00fanico m\u00e9todo <code>alterado<\/code>.<\/p>\n<p>O ouvinte de altera\u00e7\u00f5es de documento nos permite rastrear as atualiza\u00e7\u00f5es reais do documento. Uma replica\u00e7\u00e3o pode alterar mais de um documento ao mesmo tempo. O evento de altera\u00e7\u00e3o retorna uma lista de IDs de documentos. Percorrendo as IDs dos documentos, recuperamos cada documento diretamente, traduzimos o conte\u00fado do JSON em uma cadeia de caracteres e o anexamos ao texto a ser exibido. Os ouvintes de altera\u00e7\u00e3o s\u00e3o chamados em um thread em segundo plano. Para finalizar, precisamos manipular os elementos da interface do usu\u00e1rio no thread principal. Isso \u00e9 feito facilmente com a fun\u00e7\u00e3o <code>runOnUiThread<\/code> do Activity.<\/p>\n<p>O outro ouvinte nos permite exibir um spinner de espera ocupada (barra de progresso indefinida), dependendo do estado da replica\u00e7\u00e3o. Voc\u00ea pode ler mais sobre o monitoramento do estado da replica\u00e7\u00e3o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/determining-status-replication-couchbase-lite\/\">aqui<\/a>.<\/p>\n<h3>A classe auxiliar de banco de dados<\/h3>\n<p>Costumo envolver as fun\u00e7\u00f5es do banco de dados em uma classe auxiliar. Como precisamos apenas de uma inst\u00e2ncia do auxiliar, uso um padr\u00e3o singleton. Assim como no UA, quero que o auxiliar esteja dispon\u00edvel antes do in\u00edcio do aplicativo principal. Uso a mesma t\u00e9cnica de colocar o c\u00f3digo em um provedor de conte\u00fado.<\/p>\n<p>Aqui est\u00e1 a listagem completa do CBLHelper.java.<\/p>\n<pre class=\"lang:java decode:true\">package com.couchbase.cblite.android.cbpushsync;\r\n\r\nimport android.content.ContentProvider;\r\nimport android.content.ContentValues;\r\nimport android.database.Cursor;\r\nimport android.net.Uri;\r\nimport android.os.Handler;\r\nimport android.os.Looper;\r\nimport android.support.annotation.NonNull;\r\nimport android.support.annotation.Nullable;\r\nimport android.util.Log;\r\n\r\nimport com.couchbase.lite.CouchbaseLiteException;\r\nimport com.couchbase.lite.Database;\r\nimport com.couchbase.lite.Document;\r\nimport com.couchbase.lite.Manager;\r\nimport com.couchbase.lite.android.AndroidContext;\r\nimport com.couchbase.lite.replicator.Replication;\r\n\r\nimport java.io.IOException;\r\nimport java.net.URL;\r\n\r\npublic class CBLHelper extends ContentProvider {\r\n    public static final String TAG = \"Push Sync\";\r\n\r\n    private static String DB = \"db\";\r\n    \/\/private static String syncGateway = \"https:\/\/localhost:4984\";\r\n    private static String syncGateway = \"https:\/\/10.0.2.2:4984\";\r\n    private static URL syncGatewayURL;\r\n\r\n    private Manager manager;\r\n    private Database database;\r\n    private Replication puller;\r\n\r\n    private Database.ChangeListener databaseChangeListener;\r\n    private Replication.ChangeListener replicationChangeListener;\r\n\r\n    private static CBLHelper instance;\r\n\r\n    public static CBLHelper getInstance() { return instance; }\r\n\r\n    @Override\r\n    public boolean onCreate() {\r\n        instance = this;\r\n\r\n        enableLogging();\r\n\r\n        try {\r\n            syncGatewayURL = new URL(syncGateway + \"\/\" + DB);\r\n            manager = new Manager(new AndroidContext(getContext()), Manager.DEFAULT_OPTIONS);\r\n        } catch (IOException ex) {\r\n            ex.printStackTrace();\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    public void closeDatabase() {\r\n        database.close();\r\n    }\r\n\r\n    public void startReplication() {\r\n        puller.start();\r\n    }\r\n\r\n    public void stopReplication() { puller.stop(); }\r\n\r\n    public void reset() {\r\n        stopReplication();\r\n\r\n        try {\r\n            database.delete();\r\n        } catch (CouchbaseLiteException ex) {\r\n            ex.printStackTrace();\r\n        }\r\n\r\n        initialize(databaseChangeListener, replicationChangeListener);\r\n    }\r\n\r\n    public void initialize(Database.ChangeListener dbl, Replication.ChangeListener rl) {\r\n        try {\r\n            database = manager.getDatabase(DB);\r\n        } catch (CouchbaseLiteException ex) {\r\n            ex.printStackTrace();\r\n        }\r\n\r\n        database.addChangeListener(dbl);\r\n        databaseChangeListener = dbl;\r\n\r\n        puller = database.createPullReplication(syncGatewayURL);\r\n        puller.addChangeListener(rl);\r\n        replicationChangeListener = rl;\r\n    }\r\n\r\n    public Document getExistingDocument(String documentID) {\r\n        return database.getExistingDocument(documentID);\r\n    }\r\n\r\n    \/\/ Logging\r\n\r\n    private void enableLogging() {\r\n        Manager.enableLogging(TAG, Log.VERBOSE);\r\n        Manager.enableLogging(com.couchbase.lite.util.Log.TAG, Log.VERBOSE);\r\n        Manager.enableLogging(com.couchbase.lite.util.Log.TAG_SYNC_ASYNC_TASK, Log.VERBOSE);\r\n        Manager.enableLogging(com.couchbase.lite.util.Log.TAG_SYNC, Log.VERBOSE);\r\n        Manager.enableLogging(com.couchbase.lite.util.Log.TAG_QUERY, Log.VERBOSE);\r\n        Manager.enableLogging(com.couchbase.lite.util.Log.TAG_VIEW, Log.VERBOSE);\r\n        Manager.enableLogging(com.couchbase.lite.util.Log.TAG_DATABASE, Log.VERBOSE);\r\n    }\r\n\r\n    \/\/ Helper function to dispatch on UI thread\r\n    private void runOnUiThread(Runnable runnable) {\r\n        new Handler(Looper.getMainLooper()).post(runnable);\r\n    }\r\n\r\n    \/\/ Required overrides\r\n\r\n    @Nullable\r\n    @Override\r\n    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {\r\n        return null;\r\n    }\r\n\r\n    @Nullable\r\n    @Override\r\n    public String getType(@NonNull Uri uri) {\r\n        return null;\r\n    }\r\n\r\n    @Nullable\r\n    @Override\r\n    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {\r\n        return null;\r\n    }\r\n\r\n    @Override\r\n    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {\r\n        return 0;\r\n    }\r\n\r\n    @Override\r\n    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {\r\n        return 0;\r\n    }\r\n}\r\n<\/pre>\n<p>Voc\u00ea pode ver que essa classe forma apenas um inv\u00f3lucro fino. Mantemos uma inst\u00e2ncia da classe durante <code>onCreate<\/code> que se torna nosso singleton. Algumas outras configura\u00e7\u00f5es b\u00e1sicas acontecem, como ativar o registro e criar um gerenciador de banco de dados. Eu escrevi um <code>inicializar<\/code> usado para realmente abrir o banco de dados, preparar a replica\u00e7\u00e3o pull e anexar os dois ouvintes de altera\u00e7\u00e3o. Lembre-se de que ele \u00e9 chamado a partir da nossa classe Activity. (Observa\u00e7\u00e3o: voc\u00ea pode ter mais de um ouvinte de altera\u00e7\u00f5es para cada tipo. O Couchbase mant\u00e9m uma lista de todos os ouvintes adicionados, n\u00e3o apenas o mais recente). Os outros m\u00e9todos do banco de dados fornecem apenas atalhos simples.<\/p>\n<p>Um provedor de conte\u00fado tem v\u00e1rios m\u00e9todos obrigat\u00f3rios a serem implementados. Precisamos fornecer esbo\u00e7os para eles, que voc\u00ea v\u00ea nos \u00faltimos cinco m\u00e9todos.<\/p>\n<h2>O manifesto do Android<\/h2>\n<p>Por fim, apenas para mostrar como tudo isso se encaixa e como as v\u00e1rias partes s\u00e3o expostas, inclu\u00ed o arquivo de manifesto do Android para o projeto.<\/p>\n<p>Aqui est\u00e1 a listagem completa do AndroidManifest.xml.<\/p>\n<pre class=\"lang:default decode:true\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;manifest xmlns:android=\"https:\/\/schemas.android.com\/apk\/res\/android\"\r\n    package=\"com.couchbase.cblite.android.cbpushsync\"&gt;\r\n\r\n    &lt;application\r\n        android:allowBackup=\"true\"\r\n        android:icon=\"@mipmap\/ic_launcher\"\r\n        android:label=\"@string\/app_name\"\r\n        android:supportsRtl=\"true\"\r\n        android:theme=\"@style\/AppTheme\"&gt;\r\n        &lt;meta-data android:name=\"com.urbanairship.autopilot\"\r\n            android:value=\"com.couchbase.cblite.android.cbpushsync.CBAutoPilot\"\/&gt;\r\n        &lt;activity\r\n            android:name=\".MainActivity\"\r\n            android:label=\"@string\/app_name\"\r\n            android:theme=\"@style\/AppTheme.NoActionBar\"&gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=\"android.intent.action.MAIN\" \/&gt;\r\n\r\n                &lt;category android:name=\"android.intent.category.LAUNCHER\" \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/activity&gt;\r\n        &lt;receiver android:name=\".CBAirshipReceiver\"\r\n            android:exported=\"false\"&gt;\r\n\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=\"com.urbanairship.push.CHANNEL_UPDATED\" \/&gt;\r\n                &lt;action android:name=\"com.urbanairship.push.OPENED\" \/&gt;\r\n                &lt;action android:name=\"com.urbanairship.push.RECEIVED\" \/&gt;\r\n                &lt;action android:name=\"com.urbanairship.push.DISMISSED\" \/&gt;\r\n\r\n                &lt;category android:name=\"${applicationId}\" \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/receiver&gt;\r\n        &lt;provider\r\n            android:authorities=\"${applicationId}.dbhelper\"\r\n            android:exported=\"false\"\r\n            android:enabled=\"true\"\r\n            android:name=\".CBLHelper\" \/&gt;\r\n    &lt;\/application&gt;\r\n\r\n&lt;\/manifest&gt;<\/pre>\n<p>A biblioteca UA vem com seu pr\u00f3prio arquivo de manifesto. O sistema de compila\u00e7\u00e3o do Android integra todos os diferentes arquivos de manifesto para criar o arquivo final. O arquivo de manifesto da biblioteca UA \u00e9 onde voc\u00ea encontrar\u00e1 as entradas para o provedor de conte\u00fado que inicializa a biblioteca.<\/p>\n<h2>Gateway de sincroniza\u00e7\u00e3o<\/h2>\n<p>Para testar o aplicativo, usei o Sync Gateway com o banco de dados Walrus integrado. O Walrus \u00e9 um banco de dados <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/resources\/concepts\/in-memory-database\/\">banco de dados na mem\u00f3ria<\/a> geralmente usado apenas para testes. Isso evita o trabalho de configurar uma inst\u00e2ncia back-end do Couchbase Server.<\/p>\n<p>Aqui est\u00e1 a listagem completa do arquivo de configura\u00e7\u00e3o do Sync Gateway.<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"log\": [\"HTTP+\"],\r\n  \"adminInterface\": \"127.0.0.1:4985\",\r\n  \"interface\": \"127.0.0.1:4984\",\r\n  \"CORS\": {\r\n    \"origin\":[\"*\"],\r\n    \"loginorigin\":[\"*\"],\r\n    \"headers\":[\"Content-Type\"],\r\n    \"maxAge\": 1728000\r\n  },\r\n  \"databases\": {\r\n    \"db\": {\r\n      \"server\": \"walrus:\",\r\n      \"users\": { \"GUEST\": {\"disabled\": false, \"admin_channels\": [\"*\"] } }\r\n    }\r\n  }\r\n}<\/pre>\n<p>Isso diz ao Sync Gateway para escutar apenas no <code>localhost<\/code> aceita todas as solicita\u00e7\u00f5es de origem cruzada e habilita o GUEST especial com acesso a todos os canais. \u00c9 uma configura\u00e7\u00e3o de prop\u00f3sito geral muito boa para come\u00e7ar, a fim de garantir que tudo esteja funcionando.<\/p>\n<p>Voc\u00ea deve ter notado que usamos 10.0.2.2 como o endere\u00e7o IP do Sync Gateway no aplicativo Android. O emulador padr\u00e3o que vem com o Android Studio mapeia isso automaticamente para o endere\u00e7o IP do computador de hospedagem <code>localhost<\/code>. Se voc\u00ea usar um emulador diferente (o Genymotion \u00e9 outro popular), n\u00e3o deixe de pesquisar qual endere\u00e7o IP usar, pois eles s\u00e3o diferentes.<\/p>\n<p>Se quiser saber mais sobre como configurar o Sync Gateway em sua m\u00e1quina de desenvolvimento ou como trabalhar com ele a partir da linha de comando, d\u00ea uma olhada em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/getting-comfortable-couchbase-mobile-installing-sync-gateway\/\">s\u00e9rie de blogs<\/a>.<\/p>\n<h2>Testes<\/h2>\n<p>Para testar tudo e gravar a anima\u00e7\u00e3o mostrada no in\u00edcio do blog, executo o emulador de Android e o Sync Gateway em uma m\u00e1quina. Em seguida, publico notifica\u00e7\u00f5es por push no UA por meio de sua API REST.<\/p>\n<p>Para preparar algo interessante, primeiro adiciono um documento ao Sync Gateway. Aqui est\u00e1 um comando do shell para fazer isso.<\/p>\n<pre class=\"lang:sh decode:true\">$ curl -X PUT -H 'Content-Type: application\/json' -H 'Accept: application\/json' -d '{ \"test\" : \"UA\", \"channels\": \"public\" }' https:\/\/localhost:4984\/db\/doc\r\n<\/pre>\n<p>(Leia mais sobre isso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/getting-comfortable-with-couchbase-mobile-sync-gateway-via-the-command-line\/\">aqui<\/a>).<\/p>\n<p>Com um novo documento no banco de dados no Sync Gateway e o aplicativo em funcionamento, tudo o que resta \u00e9 acionar uma replica\u00e7\u00e3o pull para ver a a\u00e7\u00e3o.<\/p>\n<p>Aqui est\u00e1 o <code>enrolar<\/code> para enviar um sinal de \"in\u00edcio\". Lembre-se de que eu extraio o valor da parte \"alert\" da notifica\u00e7\u00e3o para acionar a\u00e7\u00f5es.<\/p>\n<pre class=\"lang:sh decode:true\">$ curl https:\/\/go.urbanairship.com\/api\/push -u 'appKey:appMasterSecret' -X POST -H 'Content-Type: application\/json' -H 'Accept: application\/vnd.urbanairship+json; version=3;' -d '{ \"audience\": { \"android_channel\": \"3110bc81-1c7b-4ef8-a7a3-7c56aab19f08\" }, \"notification\" : { \"alert\": \"start\" }, \"device_types\": \"all\" }'<\/pre>\n<p>Voc\u00ea precisar\u00e1 fornecer sua pr\u00f3pria chave de aplicativo e o segredo mestre do aplicativo acima. Tamb\u00e9m \u00e9 necess\u00e1rio examinar os arquivos de registro para ver o valor do canal a ser inserido para \"android_channel\". Isso muda com bastante regularidade. Infelizmente, o UA n\u00e3o faz muito para indicar isso. Se voc\u00ea achar que as notifica\u00e7\u00f5es por push n\u00e3o parecem estar surtindo efeito, verifique o valor do canal.<\/p>\n<p>Depois de postar na UA, voc\u00ea ver\u00e1 uma resposta como esta.<\/p>\n<pre class=\"lang:default decode:true\">{\"ok\":true,\"operation_id\":\"2a6c0edf-e5d0-4b4d-b762-ad5c4478c291\",\"push_ids\":[\"1951019a-2b7f-4f1b-8888-e87047a1feec\"],\"message_ids\":[],\"content_urls\":[]}<\/pre>\n<p>E, finalmente, para redefinir um banco de dados em branco e tentar novamente, voc\u00ea pode postar isso.<\/p>\n<pre class=\"lang:sh decode:true\">$ curl https:\/\/go.urbanairship.com\/api\/push -u 'appKey:appMasterSecret' -X POST -H 'Content-Type: application\/json' -H 'Accept: application\/vnd.urbanairship+json; version=3;' -d '{ \"audience\": { \"android_channel\": \"3110bc81-1c7b-4ef8-a7a3-7c56aab19f08\" }, \"notification\" : { \"alert\": \"reset\" }, \"device_types\": \"all\" }'\r\n<\/pre>\n<h2>Conclus\u00e3o<\/h2>\n<p>Isso \u00e9 tudo para preparar nosso aplicativo Android para executar replica\u00e7\u00f5es com base em notifica\u00e7\u00f5es push. N\u00e3o deixe de conferir <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/node-js-swagger-monitor-document-changes-couchbase-mobile\/\">esta postagem<\/a> sobre o monitoramento do feed de altera\u00e7\u00f5es do Sync Gateway.<\/p>\n<h2>P\u00f3s-escrito<\/h2>\n<p>Download do Couchbase e do Sync Gateway <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/\">aqui<\/a>. Veja nosso <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/couchbase-lite\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">documenta\u00e7\u00e3o<\/a> para saber como adicionar o Couchbase Lite a um projeto.<\/p>\n<p>Confira mais recursos em nosso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/community\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">portal do desenvolvedor<\/a> e nos siga no Twitter <a href=\"https:\/\/twitter.com\/CouchbaseDev\">@CouchbaseDev<\/a>.<\/p>\n<p>Voc\u00ea pode postar perguntas em nosso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">f\u00f3runs<\/a>. E participamos ativamente de <a href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Estouro de pilha<\/a>.<\/p>\n<p>Entre em contato comigo pelo Twitter com perguntas, coment\u00e1rios, t\u00f3picos que voc\u00ea gostaria de ver etc. <a href=\"https:\/\/twitter.com\/HodGreeley\">@HodGreeley<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Urban Airship is a popular messaging and notification service. \u00a0In part 1 of this post we&#8217;ll look at how to set up Urban Airship push notifications. In part 2 of the post we\u2019ll use these notifications to trigger replications in [&hellip;]<\/p>","protected":false},"author":73,"featured_media":10144,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810],"tags":[],"ppma_author":[9042],"class_list":["post-2515","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.4 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Urban Airship Push Notifications: What You Need to Start<\/title>\n<meta name=\"description\" content=\"Look at this blog post to see how to set up Urban Airship push notifications and how to use these notifications to trigger replications in Couchbase Mobile.\" \/>\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\/getting-started-with-urban-airship-push-notifications\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Getting Started with Urban Airship Push Notifications\" \/>\n<meta property=\"og:description\" content=\"Look at this blog post to see how to set up Urban Airship push notifications and how to use these notifications to trigger replications in Couchbase Mobile.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/getting-started-with-urban-airship-push-notifications\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-23T23:14:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-12T20:26:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/big-data-2001190_1280.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"Getting Started with Urban Airship Push Notifications\",\"datePublished\":\"2017-04-23T23:14:25+00:00\",\"dateModified\":\"2024-01-12T20:26:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/\"},\"wordCount\":2410,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/big-data-2001190_1280.jpg\",\"articleSection\":[\"Couchbase Mobile\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/\",\"name\":\"Urban Airship Push Notifications: What You Need to Start\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/big-data-2001190_1280.jpg\",\"datePublished\":\"2017-04-23T23:14:25+00:00\",\"dateModified\":\"2024-01-12T20:26:11+00:00\",\"description\":\"Look at this blog post to see how to set up Urban Airship push notifications and how to use these notifications to trigger replications in Couchbase Mobile.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/big-data-2001190_1280.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/big-data-2001190_1280.jpg\",\"width\":1280,\"height\":720,\"caption\":\"Urban Airship with Couchbase\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Getting Started with Urban Airship Push Notifications\"}]},{\"@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\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\/\/hod.greeley.org\/blog\",\"https:\/\/x.com\/HodGreeley\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/hod-greeley\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Urban Airship Push Notifications: What You Need to Start","description":"Consulte esta postagem do blog para ver como configurar as notifica\u00e7\u00f5es push do Urban Airship e como usar essas notifica\u00e7\u00f5es para acionar replica\u00e7\u00f5es no Couchbase Mobile.","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\/getting-started-with-urban-airship-push-notifications\/","og_locale":"pt_BR","og_type":"article","og_title":"Getting Started with Urban Airship Push Notifications","og_description":"Look at this blog post to see how to set up Urban Airship push notifications and how to use these notifications to trigger replications in Couchbase Mobile.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/getting-started-with-urban-airship-push-notifications\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-04-23T23:14:25+00:00","article_modified_time":"2024-01-12T20:26:11+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/big-data-2001190_1280.jpg","type":"image\/jpeg"}],"author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"Getting Started with Urban Airship Push Notifications","datePublished":"2017-04-23T23:14:25+00:00","dateModified":"2024-01-12T20:26:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/"},"wordCount":2410,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/big-data-2001190_1280.jpg","articleSection":["Couchbase Mobile"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/","url":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/","name":"Urban Airship Push Notifications: What You Need to Start","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/big-data-2001190_1280.jpg","datePublished":"2017-04-23T23:14:25+00:00","dateModified":"2024-01-12T20:26:11+00:00","description":"Consulte esta postagem do blog para ver como configurar as notifica\u00e7\u00f5es push do Urban Airship e como usar essas notifica\u00e7\u00f5es para acionar replica\u00e7\u00f5es no Couchbase Mobile.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/big-data-2001190_1280.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/big-data-2001190_1280.jpg","width":1280,"height":720,"caption":"Urban Airship with Couchbase"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/getting-started-with-urban-airship-push-notifications\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Getting Started with Urban Airship Push Notifications"}]},{"@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\/9b62593c8a13531e53d52fcd5aabbca4","name":"Hod Greeley, Advogado do desenvolvedor, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"Hod Greeley \u00e9 um defensor dos desenvolvedores da Couchbase e mora no Vale do Sil\u00edcio. Ele tem mais de duas d\u00e9cadas de experi\u00eancia como engenheiro de software e gerente de engenharia. Trabalhou em diversas \u00e1reas de software, incluindo f\u00edsica e qu\u00edmica computacional, seguran\u00e7a de computadores e redes, finan\u00e7as e dispositivos m\u00f3veis. Antes de ingressar na Couchbase em 2016, Hod liderou as rela\u00e7\u00f5es com desenvolvedores para dispositivos m\u00f3veis na Samsung. Hod \u00e9 Ph.D. em f\u00edsica qu\u00edmica pela Universidade de Columbia.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/hod-greeley\/"}]}},"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","author_category":"","last_name":"Greeley","first_name":"Hod","job_title":"","user_url":"https:\/\/hod.greeley.org\/blog","description":"Hod Greeley \u00e9 um defensor dos desenvolvedores da Couchbase e mora no Vale do Sil\u00edcio. Ele tem mais de duas d\u00e9cadas de experi\u00eancia como engenheiro de software e gerente de engenharia. Trabalhou em diversas \u00e1reas de software, incluindo f\u00edsica e qu\u00edmica computacional, seguran\u00e7a de computadores e redes, finan\u00e7as e dispositivos m\u00f3veis. Antes de ingressar na Couchbase em 2016, Hod liderou as rela\u00e7\u00f5es com desenvolvedores para dispositivos m\u00f3veis na Samsung. Hod \u00e9 Ph.D. em f\u00edsica qu\u00edmica pela Universidade de Columbia."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2515","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\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2515"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10144"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2515"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}