Cordova-plugin-firebase: onNotificationOpen não é acionado se o aplicativo estiver fechado - o processo do aplicativo é encerrado em segundo plano.

Criado em 24 nov. 2016  ·  46Comentários  ·  Fonte: arnesson/cordova-plugin-firebase

Oi,

Não sei se esse comportamento padrão ou não. Mas quando o aplicativo está fechado (o processo do aplicativo é encerrado), a notificação por push está chegando e toque nela, o onNotificationOpen não é acionado. Isso é o esperado ou algo precisa ser trabalhado nisso?

messaging

Comentários muito úteis

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

Todos 46 comentários

eu também estou enfrentando o mesmo problema :(

use o evento cordova resume para conectar o retorno de chamada novamente. veja os documentos cordova sobre o ciclo de vida do Android: http://cordova.apache.org/docs/en/6.x/guide/platforms/android/index.html#lifecycle -guide

@robertarnesson Você se importaria de explicar um pouco mais sua resposta? Estou tendo o mesmo problema no iOS. Posso receber notificações enquanto o aplicativo está sendo executado em primeiro e segundo plano, mas assim que eu fecho/sair do meu aplicativo, não posso mais receber notificações.

Eu recebo notificações em ambos, segundo plano e primeiro plano (Android 6.0.1)... (isso acontece mesmo quando o aplicativo está em pausa). Pode ser por causa da faixa de pedestres? Existe alguma correção?

@robertarnesson @Taracque

Não tenho certeza se isso ajuda, mas eu realmente odeio quando as pessoas usam palavras ou links em vez de seus próprios exemplos de código para tentar ajudar.

Esta é uma interpretação básica do que tenho no meu index.html e isso funciona para iOS e Android com carga útil sendo entregue ao aplicativo para manipulação.

Descobri que com o iOS eu só precisava usar a função 'deviceready' do cordova.js, pois isso parecia disparar sempre que uma notificação era recebida quando os aplicativos estavam em primeiro plano E depois de retomar um aplicativo que estava em segundo plano, tocando no botão notificação ou apenas abrindo o aplicativo.

Para o Android, eu precisava usar 'resume' como 'deviceready' só parecia disparar uma vez quando o aplicativo foi carregado pela primeira vez (faz sentido, suponho).

function onLoad(){

    //fire this with load of the HTML page
    document.addEventListener("deviceready", onDeviceReady, false);

    }

    function onDeviceReady(){

    // this will fire when the app first runs (iOS and Android)
    // iOS will run this after tapping a notification as well but not Android

    // Create the resume as soon as the device is ready.
    document.addEventListener("resume", onResume, false); 

    // add initial cordova-plugin-firebase function calls here
    // e.g TokenRefresh, onNotificationOpen etc

    window.FirebasePlugin.onTokenRefresh(function(token){

    //Do something with the token server-side if it exists

    });

    // get any initial or resume notification (used for iOS)
    var payload = getNotification();

    }

    function getNotification(){

    // get any notification variables for use in your app
    window.FirebasePlugin.onNotificationOpen(function(notification){

    //Check if notification exists then do something with the payload vars
    var str = JSON.stringify(notification);
    console.log(str);

    });

    return str;

    }

    function onResume(){
    //Add plugin functions here after app has resumed from background
    // or after notification is tapped (needed for Android)

    //get resume notification and payload (needed for Android)

    var payload = getNotification();

    }

oi pessoal, acho que perdemos o ponto aqui. o aplicativo em si nem mesmo em segundo plano ou primeiro plano. você tenta matar o aplicativo e a função não está sendo acionada, não podemos usar no currículo porque o aplicativo não está suspenso, o aplicativo não está se movendo para o primeiro plano, mas está sendo iniciado. mesmo após o dispositivo estar pronto, onNotification open não é acionado.

Não tenho certeza se entendi, mas isso está correto.

1: seu aplicativo está totalmente inativo
2: você recebe notificação nativa para o aplicativo
3 você clica em notificação
4 o aplicativo carrega
5 onNotificationOpen não está disparando

Isso está correto?

Para que SO é isso?

Você pode fornecer um pouco do seu código?

Você incluiu Cordova.js em seu script?

Você tem 100% de certeza de que não tem erros de js na página de carregamento?

@device68 Gostaria de saber se onNotificationOpen é acionado quando o aplicativo não é iniciado inicialmente, como @nikrhes disse.
Eu testei no Android e no iOS com onNotificationOpen sendo chamado no resume e deviceready. E apenas a situação que mencionei acima não funcionou. Existem também alguns comportamentos inesperados com outras situações também.
Você pode conferir a edição nº 137 que eu abri.

@chanphillip , vou dar uma olhada de manhã. Não posso confirmar o iOS 10, pois estou usando uma versão mais antiga do XCODE, mas verei o que exatamente está acontecendo no Android.

Meu aplicativo faz uso significativo de inicialização a frio com cargas úteis de notificações e retomadas, mas não notou nenhum problema.

@ device68 toda a situação está funcionando bem apenas quando o aplicativo está inativo, a função não é acionada. Eu sou testado, quase em todos os sistemas operacionais IOS e Android que eu posso pegar em minhas mãos. Ainda não funciona.

Pelo que me lembro durante meus testes de hoje no Android é isso que acontece.

1 aplicativo inativo

Se eu receber uma notificação e clicar nela, isso carregará o aplicativo conforme o esperado e qualquer código de plug-in no onDeviceReady capturará essa carga útil.

Qualquer código dentro de Resume não capturará a carga útil.

Quaisquer outras notificações enquanto o aplicativo ainda está ativo e ainda não foi minimizado são recebidas por funções dentro do onDeviceReady.

2 minimizando o aplicativo pela primeira vez.

A primeira vez que minimizo o aplicativo, isso para noDeviceReady porque o decice já está pronto e agora aguarda o estado de retomada.

Se eu receber uma notificação e tocar nela, o aplicativo será aberto e o código do plug-in dentro do Currículo agora captura a carga útil.

Quaisquer notificações subsequentes são todas recebidas pelo Resume.

3 aplicativo minimizado (de um modo geral)

Se meu aplicativo for minimizado a qualquer momento e eu clicar em uma notificação, o Resume captura isso, MAS se eu não clicar nele e, em vez disso, abrir o aplicativo manualmente, o Resume não fará nada e nenhum onNotificationOpen será acionado em qualquer lugar do meu código.

Observe que esta atividade é totalmente diferente no iOS 9.3

4 aplicativo em primeiro plano

Se depois de retomar eu receber uma notificação enquanto estiver no aplicativo, Resume captura a carga útil.

5 aplicativo de matar

Se eu matar o aplicativo, começamos do #1

6 Cargas

As duas diferenças que vi com os dados que o GCM envia no Android dependem se a notificação foi clicada fora do aplicativo ou recebida enquanto está em primeiro plano.

O Google adiciona timecode, from, ID da mensagem, etc., se a notificação for tocada.

O Google remove o acima, mas adiciona apenas tap = false em todas as outras circunstâncias.

Quaisquer variáveis ​​de dados que você enviar estarão presentes em todos os casos.

Estou usando a API Curl do lado do servidor para enviar mensagens entre web, Android e iOS

Em última análise, tudo parece lógico no Android, na verdade é a implementação do iOS que está errada e ilógica.

Tudo no iOS funciona com onDeviceReady e onNotificationOpen é chamado sempre que uma notificação é recebida, mesmo quando você abre um aplicativo manualmente após ser notificado, clicar em uma mensagem ou receber uma notificação enquanto o aplicativo está em primeiro plano.

Espero que isto ajude.

Mas você deve usar onDeviceReady e Resume e colocar versões de onNotificationOpen em cada uma delas se quiser capturar a carga útil em todas as situações.

@ device68 Obrigado pela sua explicação detalhada.
Na verdade, eu disse errado, também estava colocando onNotificationOpen no resumo do dispositivo e pronto, mas o caso de uso 1 (clicar na notificação quando o aplicativo nem foi iniciado) não funcionou do meu lado, enquanto os outros casos de uso estão funcionando como o que você descreveu.

Suponho que você não esteja usando o framework iônico durante o teste. Estou usando platform.ready() mas deve ser o mesmo que deviceready do meu entendimento.

Você poderia confirmar que onNotificationOpen é acionado mesmo quando o aplicativo não é iniciado (o aplicativo foi encerrado) do seu lado? Também é possível para você testar isso no iOS também? Obrigada.

@chanphillip sem problemas, feliz por poder ajudar.

Correto, estou apenas usando o plugin raw phonegap instalado via CLI e, em seguida, este plugin instalado dentro dele.

Hmm na verdade fiz mais alguns testes e criei um vídeo do meu aparelho com alertas em 4 lugares.

https://www.youtube.com/watch?v=xrWQH2wE8Fo

Isso parece confirmar o que você está vendo. onNotificationOpen NÃO é acionado ao tocar em uma notificação que causa uma inicialização a frio do aplicativo. É somente depois disso que as notificações são coletadas da função onNotificationOpen.

Os ouvintes são acionados conforme o esperado, mas não em NotificationOpen.

Para mim, isso não é especificamente um problema para o meu aplicativo, o que provavelmente explica por que eu não o vi até agora.

Testei em dispositivos com Android 4+, 6+ e 7+, todos com o mesmo resultado.

Infelizmente acho que não posso ajudar muito com iOS, estou usando o Virtualbox com Yosemite e XCODE 7.1 (obrigado a incluir iOS 9.3 SDK) encontrei notificações funcionando exclusivamente com onDeviceRedy e nem precisei usar Resume. Isso foi para dispositivos com iOS 9+, mas abaixo de 10+

No entanto, os usuários finais atualizaram seus telefones para 10.2 e as notificações pararam de funcionar. Acredito que seja por causa da minha construção do XCODE com o SDK 9.3, agora preciso comprar um Mac :-(

Deixe-me saber se o vídeo ajuda.

Eu enfrento o mesmo problema. O aplicativo abre, mas não aciona a função. Tentei reproduzir o comportamento no seu vídeo e claro que estou aguardando o estado ondeviceready. Mas o método nunca é acionado.

Observe: ao avaliar a função via soquete de mesa de luz, ela funciona. SÓ funciona quando eu avalio no IDE. Mas a função nunca é acionada, como a versão do plugin do método "não é chamada". Por que avaliar a função funciona?

Olá,
Estou enfrentando o mesmo problema, então estou tentando entender o que está acontecendo no código.
Para o caso de uso de inicialização a frio, o documento diz para usar onNewIntent.
O código para o plugin parece bom.

    <strong i="9">@Override</strong>
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        FirebasePlugin.sendNotification(intent.getExtras());
    }

Mas esse retorno de chamada a ser chamado precisa que a notificação defina uma intenção para começar a usar click_action no payload

{
  "to": "/topics/news",
  "notification": {
    "title": "Click Action Message",
    "text": "Sample message",
    "click_action": "android.intent.action.MAIN"
  }
}

Estou tentando fazer isso mas sem sucesso, não tenho certeza se quer deve ser definido na ação de clique.
Qualquer que seja o valor que eu defino, o aplicativo não inicia

        <activity android:name="MainActivity" >
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Para contornar a falta de ação de clique, talvez seja bom ler o conteúdo extra durante a inicialização do plug-in.
Eu tento com este código e desta vez recebi a notificação.

<strong i="21">@Override</strong>
    protected void pluginInitialize() {
        final Context context = this.cordova.getActivity().getApplicationContext();
        final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
        this.cordova.getThreadPool().execute(new Runnable() {
            public void run() {
                Log.d(TAG, "Starting Firebase plugin");
                mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
                if(extras != null && extras.size()>1) {
                    FirebasePlugin.sendNotification(extras);

                }
            }
        });
    }

De qualquer forma, parece um hack sujo.

Ok, eu consigo usar click_action adicionando uma categoria padrão no manifest.xml, mas onNewIntent não é chamado.

            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

Eu tive o mesmo problema descrito acima, principalmente, a carga de notificação não foi entregue quando o aplicativo foi iniciado tocando em uma notificação. A sugestão de @huny0522 parece corrigir o problema. 👍

Interessante, eu não preciso especificamente disso, mas vou tentar também e ver se funciona para mim. Seria ideal se os desenvolvedores deste plugin pudessem implementar essa mudança de alguma forma, pois parece um grande problema para a maioria das pessoas que precisam de carga de notificação após a inicialização a frio de um aplicativo.

Este problema foi corrigido ou será corrigido na próxima versão!?

Patch de @huny0522 não resolveu o problema para mim. O retorno de chamada onNotificationReceived foi ignorado com a inicialização a frio do Android. Todos os outros cenários se comportam conforme o esperado.

Reinstalar o plugin do github resolveu o problema para mim, depois de tentar todas as soluções sugeridas

plug-in cordova adicionar https://github.com/arnesson/cordova-plugin-firebase.git --save

Alguém resolveu o

passo 3 que @device68 escreveu ??

aplicativo minimizado (de um modo geral)

Se meu aplicativo for minimizado a qualquer momento e eu clicar em uma notificação, o Resume captura isso, MAS se eu não clicar nele e, em vez disso, abrir o aplicativo manualmente, o Resume não fará nada e nenhum onNotificationOpen será acionado em qualquer lugar do meu código.

Este é o meu único problema agora.

Problema semelhante aqui.

Eu tive que remover esta linha do objeto enviado: "click_action":"YOUR_DATA_HERE".

Agora, o aplicativo é iniciado corretamente quando toco na notificação recebida em segundo plano.

Espero que ajude.

Também tenho os mesmos problemas em um aplicativo ionic/cordova, mas apenas em um dispositivo com Android 6.0. Neste dispositivo, a notificação é sempre acionada na barra de status, independentemente de eu ter o aplicativo em segundo plano ou em primeiro plano (!) e o retorno de chamada nunca é acionado quando abro a notificação, portanto, não recebo a carga útil.
Todos os outros dispositivos que testei estavam bem (android 5, iOS 9 e 10): em primeiro plano ele aciona os dados de retorno de chamada e eu reajo a ele, e em segundo plano recebe a notificação normalmente na barra de status conforme descrito na documentação.

@abhishek-kollipara o problema discutido não é como pegar a carga útil no estado de primeiro plano/fundo, e sim quando o aplicativo é inicializado a frio por meio do toque de uma notificação e da coleta da carga útil da notificação. este não é o problema de como a carga útil é formada, especialmente quando é descrita nos documentos de outro plugin e não neste.

Eu tive meu primeiro sucesso em pegar a carga útil em uma inicialização a frio desde os últimos dois dias, quando comecei a caçá-la. obtenha o plugin nativo iônico 'web intent'. instale-o conforme documentado e use sua função interna getIntent() na inicialização. se o aplicativo for inicializado por uma notificação, os dados da notificação estarão em algum lugar dentro do objeto retornado.

@heidji Isso funciona no IOS?

No meu caso:

Android:
-Início a frio: Inicie OnNotificationOpen
-Aplicativo minimizado: Inicie OnNotificationOpen
-Aplicativo em primeiro plano: inicie OnNotificationOpen

IOS:
-Início a frio: NÃO inicie OnNotificationOpen
-Aplicativo minimizado: Inicie OnNotificationOpen
-Aplicativo em primeiro plano: inicie OnNotificationOpen

Obrigado pela ajuda

@Hanzofm Não sei se funciona no iOS para ser honesto. apenas tente usar o plug-in Web Intent e registre sua saída no console na inicialização.

Eu tenho o mesmo comportamento no iOS descrito por @Hanzofm

Eu tenho o mesmo comportamento no iOS. O onNotificationOpen não é chamado na inicialização a frio do aplicativo iOS ao clicar na notificação. Usando o plugin versão 0.1.25.

Atualizar:
Eu estava usando o "cordova-plugin-local-notifications" também com o plug-in do Firebase e isso causou o problema. Quando removi o plugin "cordova-plugin-local-notifications", funcionou bem.

Também estou tendo problemas para fazer noNotificationOpen disparar em partidas a frio (iOS). Existe uma solução lá fora?

Obrigado

No meu caso foi resolvido removendo o plugin local-notifications. Há uma incompatibilidade com este plugin e os plugins de notificação por push

Eu não tenho esse plugin, infelizmente :)

Isso deveria estar ligado?

skjermbilde 2018-04-27 kl 09 22 50

Fechamento para limpeza. Por favor, teste com a versão mais recente e reabra se ainda for um problema.

@heidji digamos que resolvemos o problema usando seu método, você tem alguma informação sobre como obter os dados de notificação na seguinte situação?

O aplicativo está completamente fechado. O usuário recebe notificação por push. O usuário não clica na notificação, mas a remove da barra de notificação. O usuário abre o aplicativo mais tarde e vai para a página de notificações e não vê nada. Porque o usuário não recebe a notificação em primeiro plano nem clicou nela para abrir o aplicativo. Mas ainda precisamos saber que essa notificação existe para mostrar ao usuário. Como fazer isso em ionic3?

@akildemir não há como fazer isso no Ionic, você terá que registrar as notificações em seu próprio servidor e recuperá-las quando o usuário abrir o aplicativo como qualquer um faria normalmente.

@heidji como vou registrar as notificações no meu servidor para recuperá-las, se não souber que essa notificação existe?
Existe uma maneira de o Firebase também enviar as notificações para o meu servidor com o dispositivo ou Você quis dizer não usar o Firebase, mas usar seu próprio servidor para notificações?

@akildemir Quero dizer, quando você cria uma notificação push, você também registra sua existência em outro lugar, como em seu próprio servidor ou em qualquer servidor que você esteja usando para seu projeto. Acho que o Firebase também fornece esses serviços.
Eu não sei como você cria essas notificações, mas no meu projeto quando algo acontece no meu servidor PHP, por exemplo, alguém te enviou uma mensagem, eu entro em contato com o firebase para enviar uma notificação e TAMBÉM armazeno este evento com um "is_read = 0" sinalizador, portanto, se o usuário nunca clicar na notificação, ele poderá recuperá-la no site ou o aplicativo usar seu próprio serviço para chamar essas notificações ou qualquer outra coisa, apenas coisas de desenvolvimento padrão.

@heidji Eu não tenho um site para o meu aplicativo, mas sim, o que você disse é bastante lógico, posso armazenar a notificação no meu servidor ao mesmo tempo e recuperá-la mais tarde. Obrigado! e sim, eu posso ser contado como novato em coisas de desenvolvimento móvel. Também posso perguntar outra coisa? Como posso registrar a mesma notificação para vários dispositivos através do Firebase? você pode pensar nisso como um bate-papo em grupo. Quando alguém digita algo no bate-papo em grupo, todos no grupo entendem. Estou usando este formato para registrar uma notificação:

deixe corpo = {
"notificação":{
"título":"título" , "body":"body" ,
},
"dados":{
"param1": "valor1"
},
"para": DeviceId ,
"prioridade":"alta",
"restricted_package_name":""
}

  let options = new HttpHeaders().set('Content-Type','application/json');
  this.http.post("https://fcm.googleapis.com/fcm/send",body,{
    headers: options.set('Authorization', 'key=),
  })

aqui, se você passar deviceId para a seção "to", ele enviará para o dispositivo. mas posso passar vários deviceIds aqui?

@nikrhes Você pode verificá-lo nos metadados:
window.FirebasePlugin.onNotificationOpen().subscribe((data) => {
if (data.tap) {
// usuário tocando na notificação
} outro {
// o aplicativo está sendo executado em primeiro plano
}
});

Não tenho certeza de que isso tenha sido resolvido, mas estou procurando a resposta há meses através dos vários tópicos por aí sobre isso. Para ser claro, o problema é que o onNotification não é acionado especificamente no caso do iOS, onde o aplicativo está completamente fechado/desligado/eliminado. A notificação chega, inicialize a frio o aplicativo, mas a função não é acionada e a carga útil não é entregue.

@heidji - sua solução alternativa de armazenar os eventos push no servidor e verificar se eles foram lidos faz sentido. No entanto, em nosso aplicativo, há cenários para os quais isso não funcionará (ou seja, precisamos determinar se a notificação é disparada com base no fato de o usuário ter clicado nela e não se a leu).

Mas o principal, como tantos outros afirmaram, é que esse parece ser um comportamento crítico para o qual deve haver uma solução?

@wwwguy minha solução não é uma solução alternativa. é uma prática padrão que todo mundo usa, grande ou pequeno.
você não pode confiar em prensas de notificação, estes não são eventos garantidos. Quero dizer, quando eu pressiono uma notificação do facebook no meu telefone xiaomi, às vezes o aplicativo nem abre.

Sim, eu entendo. Implementamos dezenas de aplicativos para muitos clientes diferentes. Utilizamos a prática de rastreamento de "leituras" de notificações no servidor também em vários de nossos aplicativos. Mas há outros casos a serem considerados - ou seja, notificações que são mais do que simples notificações, mas carregam cargas úteis que direcionam certas funcionalidades dentro do aplicativo se forem clicadas. Facebook é uma porcaria. Todo mundo sabe disso. Mas as notificações do FB também são apenas isso, notificações simples (que apenas aparecem em uma lista de arquivos dentro do aplicativo). Eles não são funcionais por natureza. ou seja, não há certos tipos de notificações do FB que, quando você clica nelas, precisa abrir o aplicativo e direcioná-lo para um local específico.

De qualquer forma ... eu não estava necessariamente postando para entrar em uma grande discussão filosófica (na verdade, estava apenas dando um aceno para @heidji pela boa ideia, pois isso resolveria o problema em muitos casos). Mas certamente todos podemos concordar que isso:

Aplicativo aberto Android = FUNCIONA
Aplicativo aberto para iOS = FUNCIONA
Aplicativo Android em segundo plano = FUNCIONA
App em segundo plano para iOS = FUNCIONA
Inicialização a frio do Android a partir do aplicativo morto = FUNCIONA
Inicialização a frio do iOS do aplicativo morto = NÃO FUNCIONA

...não é o design pretendido do plugin. Portanto, ou é um bug que o desenvolvedor não abordou (talvez devido à confusão que causa em todos esses vários tópicos e diferentes pessoas diagnosticando erroneamente qual é o problema), ou então algo como variáveis ​​​​passadas no corpo PUSH ou funcionalidade compilada no xCode causando esse comportamento.

Correção de bug para o plugin pelo desenvolvedor à parte... alguém conseguiu isolar uma correção de código manual para isso?

honestamente, a notificação da inicialização a frio no iOS funciona para mim 100%. eu usei o plugin webintent apenas para android porque onNotificationOpen não funcionou para mim lá e webintent não existe no iOS.
se vc precisar de algum detalhe na minha configuração me avise

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ghost picture ghost  ·  3Comentários

dhavalsoni2001 picture dhavalsoni2001  ·  5Comentários

danielpalen picture danielpalen  ·  5Comentários

DanielAccorsi picture DanielAccorsi  ·  3Comentários

eilian92 picture eilian92  ·  4Comentários