Closed somefakeuser closed 9 years ago
Eu não trabalho com PHP, mas tenho encontrado boas referências para o "componente" RMSPushNotificationsBundle.
Lendo a documentação disponível, parece ser muito simples de utilizar. https://github.com/richsage/RMSPushNotificationsBundle
Por favor me retorne se eu puder ajudar em algo mais.
Um abraço,
Arley Andrada Maria
Caro Arley,
Finalmente tive tempo pra poder dar atenção a este projeto. Acabei de comprar seu módulo e confesso que estou um pouco confuso.
Pretendo colocá-lo pra funcionar da seguinte forma:
Tenho um sistema Web desenvolvido em php que será encarregado de disparar algumas mensagens eventuais para o aplicativo. Este aplicativo roda em Android e iOS.
Pelo que entendo, o passo-a-passo pra conseguir isto é:
Estou correto?
Como faço pra testar isto?
Conhece alguns serviços que me possibilitem testar isto mais facilmente sem ter que desenvolver todo o código?
Os passos são exatamente estes.
Para testar, sugiro utilizar um dos provedores pagos que existem no mercado pois todos têm cotas gratuita que será suficiente para o teste.
Minha sugestão de provedor é o Parse.com pois meu módulo acompanha inclusive um exemplo de integração da app com este provedor.
Para testar meu módulo a única opção é fazer a compra de uma licença, mas não irá se arrepender. Não ofereço período de avaliação por limitação técnica do controle de licenças da Appcelerator.
Nos próximos dias estará disponível a versão do meu módulo que é compatível com o Titanium SDK 3.4.0 e com o recurso de notificações interativas do iOS 8.
É isso... Divirta-se!
Já tinha comprado seu módulo.
Agora o problema: Meu app já está com o SDK 3.4.0 e agora????
Vou analisar o Parse.com
Não tinha identificado sua compra.
Neste caso pode baixar a nova versão nos links abaixo sem ter que esperar a liberação da Appcelerator.
[ attachment removed ]
Oi Arley,
Ainda estou tentando usar seu módulo e sem sucesso.
Gostaria de fazer-lhe uma crítica construtiva:
Você disponibilizou um módulo que deve ter consumido algum tempo seu, exigiu pesquisa e merece ser pago por isto, mas o material que entregou com o módulo é insuficiente pra ser utilizado adequadamente. Sua documentação não explica nada, só mostra um código fonte. Seu exemplo não é um projeto completo, pois não vem com o XML nem a estrutura de pastas completa (não dá pra importar direto e testar). Acho que precisaria dedicar algum tempo a isto também além da programação em si. Desta forma o tornaria mais vendável e com uma apresentação melhor. Lembre-se que nem todos tem o domínio que já possui no Appcelerator.
Você tem se mostrado muito solícito e isto ajuda bastante, mas eu acredito que quanto menos as pessoas te incomodarem, melhor pra você, pois assim poderá atender a uma demanda muito maior. A melhor forma de diminuir a demanda de suporte é entregando um bom material complementar ao código em si, que é a documentação.
Bom, agora eu preciso da sua ajuda:
A mensagem em questão indica exatamente o que está sendo exibido, que é um problema de uso indevido do módulo sem a devida licença. O usuário utilizado para acessar o Titanium Studio deve ser o mesmo usuário que fez a compra do módulo (é uma licença "per seat").
Agradeço pela crítica construtiva e te afirmo que para minha felicidade o módulo em questão tem uma venda muito boa, com usuários muito satisfeitos e com uma demanda de suporte muito baixa.
Dada a boa experiência com a maior parte dos usuários, entendo que a documentação disponível seja suficiente e objetiva, porém pode ser válida a inclusão de instruções gerais sobre o funcionamento de Notificações PUSH e o esclarecimento de que meu módulo trata apenas do recebimento da notificação no dispositivo / app e que o desenvolvimento de um provedor próprio ou uso de qualquer outro provedor de notificações push, assim como o registro do serviço de push junto à Apple e ao Google são questões externas ao meu módulo e são requisitos para uso do meu módulo.
Sobre outras dificuldades em utilizar o meu módulo, por favor me descreva quais são os problemas para que eu possa ajudá-lo.
Obrigado!
Como te expliquei antes, estou usando o módulo exatamente com o mesmo login da compra: xxxxx@xxxx.com.br, mas você me passou por email a versão 16 (pro SDK 3.4) e estou tentando usar ela. Talvez este seja o problema.
Experimente fazer o "logoff" e "logon" no Titanium Studio, em seguida fazer um "clean" no seu projeto e compilar novamente. Para fazer o "logoff" basta clicar no nome do usuário que aparece no canto inferior direito da tela do Titanium Studio. Aguardo seu retorno.
Agora piorou!
Fiz tudo o que orientou, e reiniciei o Titanium. Agora não reconhece mais seu módulo na listagem:
Já conferi, e os arquivos estão na pasta ~/Library/Application Support/Titanium/modules
Eu já havia visto em algum momento esse problema do módulo não ser listado, porém se ele constar configurado no tiapp.xml (conferindo pela leitura do arquivo xml e não do editor) ele funciona normalmente. Alguma atualização do Titanium Studio gerou esse problema e ainda não tenho solução.
O que estávamos tentando resolver inicialmente era o problema da validação da licença. Você chegou a tentar compilar novamente o projeto que você já tinha o módulo instalado anteriormente?
Aguardo seu retorno.
Acabei de conferir que o problema que eu havia enfrentado anteriormente, do módulo não ser exibido, foi corrigido pela Appcelerator na última versão do Titanium Studio. Você fez a atualização?
De toda forma o módulo continuava funcionando e os projetos sendo compilados com sucesso. O problema ocorria apenas na visualização do módulo na lista de módulos disponíveis e também na lista de módulos "instalados" no app.
Titanium Studio, build: 3.4.1.201410281727
Aguardo seu retorno.
É parece que informando no tiapp.xml ele funciona, mas continua dando o erro na licença:
[WARN] : TiVerify: (Timer-0) [4412,5001] Verifying module licenses...
[ERROR] : TiVerify: (Timer-0) [995,5996] License violation detected. Unlicensed module(s) detected. You must be a subscriber to use one or more of the modules included with this project.. Please contact Appcelerator Support.
Como posso remover completamente o módulo e re-instala-lo? Já tentei apagar da pasta ~/Library/Application Support/Titanium/module/[andoroid-iphone]/br.com.arlsoft.pushclient e instalar novamente, mas não adiantou.
A mensagem de erro de licença não especifica o módulo com problemas.
Seu projeto utiliza apenas o meu módulo?
Se houver outros módulos, experimente remover ou incluir 1 por vez para comprovar que o problema está em um módulo específico.
Quando esta mensagem de erro de validação começou a ser exibida? Pelo que eu entendo, em nossos primeiros contatos você estava conseguindo compilar o projeto.
Por fim, a versão 1.6 já está publicada na loja da Appcelerator. Você pode excluir todas as versões locais, ignorar o que enviei por e-mail, baixar novamente pelo site da Appcelerator, instalar o módulo e experimentar rodar novamente.
A remoção do módulo é realmente simples. Basta apagar o conteúdo da pasta que você mesmo já identificou... e também conferir e apagar da pasta "modules" dentro do seu projeto (pode estar instalado direto no app).
Para instalar novamente é seguir as instruções do site da Appcelerator... que você já fez antes.
Pessoalmente eu sempre prefiro instalar os módulos dentro da pasta "modules" do app... garantindo que o app sempre "carregue com ele" todas as suas dependências. Aguardo notícias.
Só utilizo seu módulo. Nenhum outro. Já removi e reinstalei pelo Dashboard do Titanium. Notei que instalou automaticamente a versão 1.6. Continua dando o erro da licença. Eu não tinha tentado compilar nenhuma vez antes. Hoje foi a primeira vez.
Você já conferiu se minha compra está ok? Tem algum tipo de aprovação?
Sim, sua compra está OK e não existe motivo aparente para gerar problema de validação da licença.
Você experimentou minha dica de remover todas versões do meu módulo que possam estar instaladas na pasta "Library" e também na pasta "modules" do próprio app.... baixar o módulo novamente pelo site da Appcelerator... reinstalar e tentar compilar novamente?
Recomendo também instalar a última versão do Titanium Studio antes de "desistir".
Se isso não funcionar, vou ter que te pedir para fazer contato com a equipe de suporte da Appcelerator.
Você é a primeira pessoa que me procura com este tipo de problema. :-(
Lembrei que existe uma possibilidade de haver algum problema na configuração de quem tem direito de usar o módulo que você comprou. Por exemplo, você poderia comprar para sua empresa, mas atribuir a licença para um desenvolvedor em específico.
Não acho que seja o seu caso, mas na falta de outras opções para investigar, vale a pena conferir no site da Appcelerator algo que estará semelhante ao que tenho abaixo:
Já removi e instalei de novo. Eu não queria atualizar o Titanium pois exige uma atualização do Genymotion e vou ter que baixar e reconfigurar todos os emuladores de novo. Mas, vou tentar isto também.
Por fim, uma existe uma solução não oficial que certamente irá funcionar.
Se nada resolver, recomendo que você utilize de forma paliativa até que a Appcelerator te responda... ou até que possa atualizar o Titanium Studio (que pode ser suficiente para resolver o problema).
Esta solução é "perdida" sempre que você instalar uma versão atualizada do meu módulo.
Aguardo novidades.
Já tinha visto isto. Inclusive, removi e coloquei de novo. Está ok.
Ufa! Desta vez rodou! Atualizei o Titanium e apareceu o módulo na lista também. Mas, você tem algum exemplo de uso com o Parse.com? O módulo que baixei não veio...
O único exemplo de integração com provedores que acompanha meu módulo é a integração com o provedor Parse.com, que é um dos mais simples dentre os que eu já experimentei.
Ao baixar o módulo ou a documentação, dentro da pasta compactada, encontrará uma pasta com nome "example" e uma subpasta de nome "parse".
Os arquivos que compõem o exemplo, como você comentou anteriormente, estão todos dentro desta subpasta "parse", porém devem ser copiados para seus devidos locais conforme o previsto em um projeto Alloy.
parse.js => subpasta app/lib dentro do seu projeto alloy.js + config.json => subpasta app dentro do seu projeto
Feito o seu cadastro no provedor Parse.com, você terá acesso a um conjunto de "keys" que devem ser atualizadas no arquivo de configuração (config.json).
Para Android você consegue colocar para funcionar tudo muito rápido seguindo as instruções acima.... já para iOS você precisa cadastrar seu app, ativar o serviço de push, gerar certificados, cadastrar os certificados no provedor Parse.com, utilizar o mesmo "nome" no app que o cadastro feito na Apple, gerar certificados para permitir instalar o novo app em um dispositivo, etc.... (fiz um resumo rápido, mas tudo isso pode ser encontrado no site do Parse.com).
Isso é tudo... Qualquer dúvida pode me procurar novamente.
Oi Arley,
Consegui colocar pra funcionar... Mas, tenho uma dúvida: Como fazê-lo funcionar com o app em background ou fechado?
Não precisa fazer nada de diferente para fazer funcionar em background ou fechado.
Se tiver seguido o exemplo sem alterações (mantido o código de exemplo no arquivo alloy.js) você pode enviar as notificações push utilizando o provedor Parse.com e a notificação / mensagem será exibida na central de notificações e os eventos "callback" serão acionados.
Existem limitações que impedem o recebimento do callback com modo BACKGROUND quando o app estiver "morto" / "não iniciado"... porém a notificação / mensagem continuará a ser exibida na central de notificações e o callback com modo CLICK será acionado quando o usuário clicar na mensagem exibida.
Experimente...
Não estou usando o Parse.
Tenho que inserir algo no tiapp.xml?
Ok, não faz diferença quem é o provedor... ou se está se comunicando diretamente com o GCM. O comportamento do meu módulo no app continua o mesmo.
O motivo de você não estar recebendo visualizando a notificação push na central de notificações do Android é o fato de que você deve considerar e utilizar os atributos que estão previstos pelo meu módulo. Abaixo segue trecho extraído do código de exemplo:
// Notification properties:
// "alert" (String) to text message - or "text" to Android
// "sound" (String) to sound file to play - "default" to Android default sound
// "badge" (Int) to badge count indicator
// "content-available" (Int) to iOS background notification
// -->> Requires set remote-notification UIBackgroundModes in tiapp.xml
// "notificationId" (Int) to Android notification identification
// "title" (String) to override Android notification title - default app name
// "ticker" (String) to override Android ticker message - default alert message
// "vibrate" (Boolean) to use default Android device vibration
// "lights" (Boolean) to use default Android device lights
// "smallIcon" (String) set small icon to Android notification from assets
// "largeIcon" (String) set large icon to Android notification from local file or url
// "category" (String) to iOS 8 interactive notification
No mínimo você deve enviar uma mensagem com o atributo "alert" ou "text". No exemplo que me enviou (link) está sendo utilizado o atributo "message", que não tem utilidade para o meu módulo.
Consegui fazer funcionar no Android. Agora vou trabalhar no iOS. Acho que não terei maiores problemas, mas se tiver, vou te perturbar de novo!
Obrigado pela ajuda!
Oi Arley, bom dia!
Desculpe incomodá-lo mais uma vez, mas estou com uma dúvida quanto ao iOS. Está funcionando perfeitamente quando o App está fechado, mas quando está aberto, não gera nenhum evento no Callback para que eu possa tratá-lo. O que posso fazer?
Acredito que solucionando este problema, resolverei tudo.
O contrário (não gerar callback quando fechado) é relativamente comum de alguém ter alguma dificuldade. Já não ter callback quando está em foreground é muito raro de acontecer (não lembro de nenhum caso anterior).
De imediato eu tenho algumas perguntas e algumas sugestões:
Aguardo seu retorno.
Também é importante conferir se você inseriu o trecho de "workaround" para um bug do Titanium Studio, que está registrado no meu código de exemplo. Este trecho de código deve ser inserido em qualquer lugar em seu app.
//Workaround to Titanium Mobile issue #17030
//https://jira.appcelerator.org/browse/TIMOB-17030
if (!OS_ANDROID) {
var issue17030 = Ti.Network.registerForPushNotifications;
var issue17030iOS8 = Ti.App.iOS.registerUserNotificationSettings;
}
Pra te esclarecer melhor:
O código do app.js está abaixo:
(function() {
var osname = Ti.Platform.osname,
version = Ti.Platform.version,
height = Ti.Platform.displayCaps.platformHeight,
width = Ti.Platform.displayCaps.platformWidth;
//considering tablets to have width over 720px and height over 600px - you can define your own
function checkTablet() {
var platform = Ti.Platform.osname;
switch (platform) {
case 'ipad':
return true;
case 'android':
var psc = Ti.Platform.Android.physicalSizeCategory;
var tiAndroid = Ti.Platform.Android;
return psc === tiAndroid.PHYSICAL_SIZE_CATEGORY_LARGE || psc === tiAndroid.PHYSICAL_SIZE_CATEGORY_XLARGE;
default:
return (Math.min(Ti.Platform.displayCaps.platformHeight,Ti.Platform.displayCaps.platformWidth) >= 400);
}
}
var isTablet = checkTablet();
//var path = Ti.Filesystem.isExternalStoragePresent() ? Ti.Filesystem.getExternalStorageDirectory() : Ti.Filesystem.getApplicationDataDirectory();
var path = Ti.Filesystem.getApplicationDataDirectory();
Ti.App.gVersionLast=Ti.App.Properties.getString('gVersion','v000');
Ti.App.Properties.getString('nome','');
Ti.App.Properties.getString('email','');
Ti.App.Properties.getString('senha','');
Ti.App.Properties.setString('googleId', '161901286704');
if (osname!=='android')
{
Ti.UI.iPhone.setAppBadge(0);
}
//Workaround to Titanium Mobile issue #17030
//https://jira.appcelerator.org/browse/TIMOB-17030
if (osname!=='android') {
var issue17030 = Ti.Network.registerForPushNotifications;
var issue17030iOS8 = Ti.App.iOS.registerUserNotificationSettings;
}
var PushClient = require('br.com.arlsoft.pushclient');
var registerOptions = {
GCMSenderId : Ti.App.Properties.getString('googleId'),
APNTypes : [ PushClient.NOTIFICATION_TYPE_BADGE, PushClient.NOTIFICATION_TYPE_ALERT, PushClient.NOTIFICATION_TYPE_SOUND ]
};
if (osname!=='android') {
var acceptAction = PushClient.createAction({
identifier: 'ACCEPT_IDENTIFIER',
title: 'Accept',
activationMode: PushClient.NOTIFICATION_ACTIVATION_MODE_FOREGROUND,
destructive: false,
authenticationRequired: true
});
var rejectAction = PushClient.createAction({
identifier: 'REJECT_IDENTIFIER',
title: 'Reject',
activationMode: PushClient.NOTIFICATION_ACTIVATION_MODE_BACKGROUND,
destructive: true,
authenticationRequired: false
});
var downloadContent = PushClient.createCategory({
identifier: 'APPROVE_CONTENT',
actionsForMinimalContext: [acceptAction, rejectAction],
actionsForDefaultContext: [acceptAction, rejectAction]
});
registerOptions.Categories = [downloadContent];
}
// Valid APNTypes (for iOS):
// PushClient.NOTIFICATION_TYPE_BADGE
// PushClient.NOTIFICATION_TYPE_ALERT
// PushClient.NOTIFICATION_TYPE_SOUND
// PushClient.NOTIFICATION_TYPE_NEWSSTAND (prior to iOS8)
// Categories (for iOS 8):
// Equivalent to Ti.App.iOS.createUserNotificationCategory and Ti.App.iOS.createUserNotificationAction
// https://wiki.appcelerator.org/display/guides2/iOS+Interactive+Notifications
// Notification properties:
// "alert" (String) to text message - or "text" to Android
// "sound" (String) to sound file to play - "default" to Android default sound
// "badge" (Int) to badge count indicator
// "content-available" (Int) to iOS background notification
// -->> Requires set remote-notification UIBackgroundModes in tiapp.xml
// "notificationId" (Int) to Android notification identification
// "title" (String) to override Android notification title - default app name
// "ticker" (String) to override Android ticker message - default alert message
// "vibrate" (Boolean) to use default Android device vibration
// "lights" (Boolean) to use default Android device lights
// "largeIcon" (String) set large icon to Android notification from local file or url
// "category" (String) to iOS 8 interactive notification
var eventSuccess = function(event) {
Ti.API.info('PUSH com sucesso:' + JSON.stringify(event));
if (!event) {
//alert('Success:\n\nInvalid success');
// Should never happen...
return;
}
if (Ti.App.Properties.getString('registrationId','')==='')
{
Ti.App.Properties.setString('registrationId',event.registrationId);
}
};
var eventError = function(event) {
Ti.API.info('PUSH com erro:' + JSON.stringify(event));
if (!event) {
alert('Erro:\n\nInvalid error');
// Should never happen...
return;
}
switch (event.code) {
case PushClient.ERROR_SENDER_ID:
alert('Error:\n\nUndefined GCMSenderId');
// Only for Google Cloud Messaging (Android)
break;
case PushClient.ERROR_PLAY_SERVICES:
alert('Error:\n\nGoogle Play Services not available\n\n' + event.error);
// Only for Google Cloud Messaging (Android)
break;
case PushClient.ERROR_NOT_SUPPORTED:
alert('Error:\n\nNot supported error\n\n' + event.error);
// Possible error messages for iOS:
// - "Unable to run with iOS Simulator"
// - "Unable to run with iOS in DEBUG mode"
// - "Unable to run with iOS DEV profile due to Titanium Mobile issue
// #17030"
// Possible error messages for Android:
// - "This device is not supported"
break;
case PushClient.ERROR_REGISTER:
alert('Error:\n\nUnable to register this device\n\n' + event.error);
break;
case PushClient.ERROR_UNREGISTER:
alert('Error:\n\nUnable to unregister this device\n\n' + event.error);
break;
default:
alert('Error:\n\nUnknown error\n\n' + JSON.stringify(event));
// Should never happen...
}
};
var eventCallback = function(event) {
Ti.API.info('PUSH Callback:' + JSON.stringify(event));
if (!event) {
alert('Callback:\n\nInválido!');
// Should never happen...
} else
{
notifica(event.data);
}
};
PushClient.addEventListener(PushClient.EVENT_SUCCESS, eventSuccess);
PushClient.addEventListener(PushClient.EVENT_ERROR, eventError);
PushClient.addEventListener(PushClient.EVENT_CALLBACK, eventCallback);
PushClient.registerPush(registerOptions);
// PushClient.unregisterPush();
// Call this method to unregister
var Window;
if (isTablet) {
Window = require('ui/tablet/ApplicationWindow');
}
else {
Window = require('ui/handheld/ApplicationWindow');
}
var ApplicationTabGroup = require('ui/common/ApplicationTabGroup');
var win = new ApplicationTabGroup(Window).open();
})();
function notifica(data)
{
if (osname==='android')
{
var activity = Ti.Android.currentActivity;
var intent = Ti.Android.createIntent({
action : Ti.Android.ACTION_MAIN,
className : 'br.com.giusoft.ierc.IERCActivity',
url : 'app.js',
flags : Ti.Android.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Ti.Android.FLAG_ACTIVITY_SINGLE_TOP
});
intent.addCategory(Ti.Android.CATEGORY_LAUNCHER);
var pending = Ti.Android.createPendingIntent({
activity : activity,
intent : intent,
type : Ti.Android.PENDING_INTENT_FOR_ACTIVITY,
flags : Ti.Android.FLAG_ACTIVITY_NO_HISTORY
});
var notification = Ti.Android.createNotification({
contentIntent : pending,
contentTitle : data.title,
contentText : data.text,
tickerText : data.tickerText,
when : new Date().getTime(),
icon : Ti.App.Android.R.drawable.icone,
sound: Ti.Filesystem.getResRawDirectory() + 'push.wav',
flags : Ti.Android.ACTION_DEFAULT | Ti.Android.FLAG_AUTO_CANCEL | Ti.Android.FLAG_SHOW_LIGHTS
});
Ti.Android.NotificationManager.notify(1, notification);
}
}
Parece tudo OK com seu código.
No iOS você deveria ter o registro do log 'PUSH Callback:', mesmo sem nenhum efeito ao chamar o método "notifica".
Infelizmente não tenho nenhuma outra dica para dar, simplesmente que deveria funcionar.
Se puder me detalhar todo o seu cenário... posso tentar simular o problema.
Versão do Titanium Studio: xxxx Versão do Titanium SDK utilizado no app: xxxx Qual dispositivo está sendo utilizado no teste: xxxx Qual a versão do SO do dispositivo utilizado: xxxx Qual a mensagem / payload enviado através da notificação push (quais atributos): xxxx
Também pode ser útil me enviar todo o log do console do Titanium Studio durante o ciclo de teste com recebimento de uma mensagem em background e com o recebimento da mesma mensagem em foreground.
Aguardo seu retorno.
Oi Arley,
Uso PHP nos servidores, e se possível, gostaria de exemplos. Pretendo adquirir seu módulo ainda hoje.