arleyandrada / PushClient

FREE and Open Source - Titanium PushClient Module
Other
44 stars 17 forks source link

PushClient documentation #14

Closed somefakeuser closed 9 years ago

somefakeuser commented 9 years ago

Hello, i just bought your module and im trying to configure it to work with APN, but i cant see where/how to setup it with the APN keys :s Can you send me a link of a more detailed documentation?

[]'s

arleyandrada commented 9 years ago

Olá,​

O módulo PushClient é utilizado para tratar o recebimento das notificações push no celular.

O envio de notificações push, tanto para Android (GCM) quanto para iOS (APN), deve ser executado em seu próprio servidor ou através de serviços web como Parse.com.

No caso da integração do seu app com o GCM (Android), é necessário informar um ID (GCMSenderId) obtido através da configuração do aplicativo e dos serviços no Google Api Console.

No caso da integração do seu app com o APN (iOS), não é necessário informar nenhum tipo de ID ou Token durante o desenvolvimento, porém existem algumas restrições definidas pela Apple: (1) não é possível receber notificações push em um emulador; (2) o dispositivo utilizado para testes deve estar registrado na Apple Developer e seu aplicativo cadastrado na Apple Developer deve estar com o serviço "Push Notifications" ativado.

Estas características acima são válidas para qualquer módulo / integração com serviços de notificação push.

Qualquer dúvida me retorne.

Atenciosamente,

Arley Andrada Maria

somefakeuser commented 9 years ago

Bem, eu estou utilizando o Parse, assim como o código de exemplo fornecido no módulo, entretanto, nenhum callback está sendo executado após o

PushClient.registerPush(registerOptions);
arleyandrada commented 9 years ago

Quando você executa o método "registerPush" você deve receber, quase que imediatamente, um retorno do evento "success" ou "error" se houver algum impedimento.

Este evento está sendo disparado e você está recebendo o ID do registro (registrationID)? Está ocorrendo algum disparo do evento "error"?

Você está realizando testes com um dispositivo real? Conferiu se o ID do seu aplicativo está idêntico ao ID registrado na Apple? Conferiu se na Apple o cadastro do seu aplicativo está com o serviço "Push Notification" ativado?

Aguardo seu retorno.

Arley

somefakeuser commented 9 years ago

Eu acho que o problema principal é que o componente sequer aparece no titanium como módulo quando eu o instalo. E se eu instalar apenas extraindo na pasta do projeto, eu recebo problemas de licensa. Se tento instalar direto no projeto pelo Studio, o módulo cria as pastas fora da pasta modules.

somefakeuser commented 9 years ago

Resolvi o problema de licença de acordo com o link: http://developer.appcelerator.com/question/136598/tistorekit-gives-verifcation-issue-unlicensed-modules-detected

Mas, como eu disse anteriormente... seguindo o seu tutorial, do código exemplo e sem nenhuma modificação, o único print que vejo é:

[INFO] :   registerPush...

Nada mais... inclusive nenhum device foi registrado no parse.

somefakeuser commented 9 years ago

Acabei de identificar que tudo está funcionando normalmente no Android... Entretanto no iOS nenhum callback é executado. Você tem alguma ideia do porque?

arleyandrada commented 9 years ago

Este módulo está funcionando para mim e para muitos outros desenvolvedores em apps publicadas em produção, tanto para Android quanto para iOS.

Ainda não consegui entender o que está ocorrendo com o seu caso, mas pode ter certeza que é apenas uma questão de tempo até encontrarmos onde está o problema.

Para que eu possa te ajudar, preciso que responsa cada uma das perguntas que fiz anteriormente. Infelizmente com a Apple (iOS) o funcionamento depende de um extenso conjunto de requisitos, os quais estou tentando validar com você.

Sobre a instalação do módulo ou problemas com a validação da licença, estou entendendo que - pelo que foi informado em seus últimos e-mails - está tudo funcionando agora, certo? Se ainda estiver com algum problema, siga as instruções:

http://docs.appcelerator.com/titanium/3.0/#!/guide/Using_a_Module-section-30082372_UsingaModule-Installingmodules

Também é válido acessar novamente a loja (Marketplace) da Appcelerator e baixar novamente o módulo, que já tem que estar na sua lista de "purchased products", além de conferir se a licença comprada foi corretamente associada com seu usuário (mesmo usuário que utiliza para iniciar o Titanium Studio).

Aproveitando o e-mail, seguem mais algumas questões que você deve conferir:

Em seu app, com base no meu exemplo, você incluiu as linhas de código para tratar a issue 17030? Elas são obrigatórias até que a Appcelerator faça a correção do bug existente.

Seu dispositivo de teste está com a conexão de internet ativada / disponível?

Aguardo seu retorno.

Um abraço,

Arley

somefakeuser commented 9 years ago

Olá Arley, a linha que resolve o bug está sim presente no código. Eu agradeço muito a sua atenção e vou fazer questão de votar positivamente no produto no marketplace. Inclusive ainda vamos ter que comprar outra cadeira para os nossos demais developers. A instalação do módulo teve que ser feita de maneira manual.

Sobre o problema com o iOS, eu tenho conhecimento de todos esses problemas, inclusive já utilizamos urbanAirship e o cloudpush. Ainda resta uma desconfiança que acabo de perceber, o nosso certificado da apple está em revisão, talvez isto possa ser a raiz do problema. Entretanto, eu fui completamente enganado pela falta de feedback do plugin, ou seja... nada acontece, inclusive nenhum callback de erro é chamado. Eu vou me certificar de fazer a tentativa novamente assim que obtiver o o certificado ativo de novo. Você acha que este pode ser o problema? Nào deveria acontecer algum tipo de erro se o certificado não for válido?

arleyandrada commented 9 years ago

Te digo que nunca fiz um teste com o certificado em revisão e infelizmente não tenho um certificado neste estado que possa confirmar se traria algum problema, mas em algumas pesquisas rápidas na Internet encontrei algumas referências semelhantes (com certificado expirado) que sugerem que realmente não iria funcionar.

O primeiro passo a ser alcançado é conseguir que o evento "success" seja disparado e que você tenha como retorno o "registrationId" que será enviado para o serviço Parse.com.

Se quiser e puder compartilhar seu código fonte (seu projeto inteiro ou uma versão reduzida do mesmo) eu posso realizar testes mais específicos com o seu cenário.

Você está utilizando o Titanium SDK 3.3.0?

Aguardo seu retorno. Fique à vontade para questionar o que precisar.

Um abraço,

Arley

somefakeuser commented 9 years ago

I got it working after all, but only work if i put the following code after all script posted on the example:

//HACK FOR IOS!

if (OS_IOS) {

    Titanium.Network.registerForPushNotifications({

        types: registerOptions.APNTypes,

        success: function(e) {

            var deviceToken = e.deviceToken;

            Ti.API.info("Push notification device token is: "+deviceToken);

            Ti.API.info("Push notification types: "+Titanium.Network.remoteNotificationTypes);

            Ti.API.info("Push notification enabled: "+Titanium.Network.remoteNotificationsEnabled);

        }

    });

}
somefakeuser commented 9 years ago

Agora eu só preciso saber ser eu preciso de algo especial para deiar o UIBackgroundModes funcionando... Você teria alguma dica?

arleyandrada commented 9 years ago

O "hack" que você citou é exatamente o que citei como "issue 17030". Você não precisa acionar o método "registerForPushNotifications" da API do Titanium. Basta incluir o seguinte trecho de código abaixo em qualquer lugar no seu código. Este trecho de código é o suficiente para "enganar" o compilador do Titanium.

//Workaround to Titanium Mobile issue #17030
//https://jira.appcelerator.org/browse/TIMOB-17030
if (!OS_ANDROID) {
    var issue17030 = Ti.Network.registerForPushNotifications;
}

Sobre o UIBackgroundModes, você só precisa seguir as instruções contidas no código de exemplo:

// "content-available" (Int) to iOS background notification
// -->> Requires set remote-notification UIBackgroundModes in tiapp.xml

Exemplos:

Push Payload

{
alert : "Hello world!",
sound : "bingbong.aiff"
content-available : 1
}

TiApp.xml

...
<ios>
  <plist>
    <dict>    
      ...
      <key>UIBackgroundModes</key>
      <array>
        <string>remote-notification</string>
      </array>
    </dict>
  </plist>
</ios>
...

Isso é tudo. Por favor me retorne se tudo estiver OK.

Obrigado!

somefakeuser commented 9 years ago

Obrigado man, eu vou verificar sobre o UIBackgroundModes. Sobre o 17030,está em um if para o android... o hack que tive que criar foi para o iOS. Você já testou o seu módulo no sdk mais novo? Pra mim só funcionou com o hack para o iOS que criei.

arleyandrada commented 9 years ago

Veja que o trecho de código é "(not)IOS_ANDROID", mas na verdade é um código que nem mesmo precisa ser executado. Tanto que a única coisa que faço é inicializar uma variável com a referência para o método, sugerindo ao compilador que eu irei chamar o método da SDK do Titanium... isso é o suficiente para fazer funcionar.

O hack que você criou é válido, mas é uma requisição de registro do dispositivo que é dispensável.

Qualquer dúvida me retorne.

Saudações,

Arley

somefakeuser commented 9 years ago

Certo, de fato nao tinha me atentado... mas apagando as linhas de código que lhe disse e mantendo apenas o seu if, ainda não funciona para mim. Acabei de apenas copiar os seus arquivos, sem modificar nenhuma linha além das keys e não funciona... insiro as linhas do hack que eu criei e funciona....

Enfim, está funcionando para mim agora, mas somente funciona com o meu hack.

A unica coisa que nao funcionou ainda foi o callback em background, mesmo com os tutoriais que vc me enviou. Só funcionou no android.

arleyandrada commented 9 years ago

Antes de lhe responder novamente eu fiz questão de refazer meus testes no iOS, utilizando Titanium SDK 3.3.0.GA, e utilizando o serviço Parse.com para receber o registro do dispositivo e enviar a notificação push.

Não consigo entender o motivo do meu "workaround" para a issue 17030 não ter funcionando para você, pois funcionou perfeitamente em meus novos testes, porém se você encontrou um outra solução já é um ganho.

Sobre o envio / recebimento de notificações em background no iOS, ao refazer os testes eu notei que dei um exemplo de JSON inválido e que consequentemente não iria funcionar. Experimente enviar o "JSON payload" a seguir:

{
"alert" : "Hello world!",
"sound" : "bingbong.aiff",
"content-available" : 1
}

Aguardo seu retorno.

P.S.: "Killing the application (swipe up from task list) prevents the application from being launched when a background notification is received. If the notification contains an alert, the alert will still be shown. Notifications that are “silent” are ignored".

Saudações,

Arley

somefakeuser commented 9 years ago

Hey man, ficou tudo muito show de bola! O único problema é que os dispositivos android não conseguem se registrar para o push no parse qnd instalam o APK, mas se colocamos no studio e damos o deploy pela IDE tudo funciona... Você tem alguma dica para isto?

arleyandrada commented 9 years ago

Este problema também não ocorreu em nenhum teste e em nenhum outro usuário do módulo.

Você conseguiu confirmar se a falha ocorre no registro do dispositivo (não consegue gerar o "registrationId") ou se a falha ocorre ao tentar se conectar / se comunicar com o serviço do Parse.com?

Experimentou desinstalar o app do dispositivo antes de tentar instalar a .apk?

Aguardo seu retorno.

somefakeuser commented 9 years ago

Cache do titanium! Solved! Estou muito satisfeito com o módulo :)

somefakeuser commented 9 years ago

Man, no seu módulo existe algum tratamento para o Badge? Eu recebi uma notificação que incrementa o badge, mas ele sempre fica lá.... existe alguma opção para dizer que a mensagem já executou algum callback ou coisa do tipo?

arleyandrada commented 9 years ago

Meu módulo não controla diretamente o badge no iOS.

Para redefinir o badge em sua app você pode utilizar a API do próprio Titanium:

Ti.UI.iPhone.appBadge = 0;

http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.iPhone-property-appBadge

Saudações,

Arley