Aan de slag met pushmeldingen op Android

Invoering

Gebruikers krijgen om uw app te installeren is slechts de helft van de strijd. Ze moeten het regelmatig gebruiken om de andere helft te gebruiken. Het is goed mogelijk dat uw gebruikers uw app volledig vergeten na slechts één of twee keer te hebben gebruikt. Wat met alle andere nieuwe apps die strijden om hun aandacht.

Door pushmeldingen te gebruiken, kunt u gebruikers zo nu en dan herinneren aan uw app, waardoor de kans groter wordt dat uw app op hun apparaten blijft geïnstalleerd.

Google Cloud Messaging, kortweg GCM, is een gratis service die u kunt gebruiken om pushmeldingen naar uw gebruikers te verzenden. In deze zelfstudie leert u hoe u deze kunt gebruiken om een ​​Android-app te maken die pushmeldingen kan ontvangen en een eenvoudig Python-script op de server dat ze kan genereren en verzenden.

Waarom Google Cloud Messaging gebruiken??

Voor de meeste client-servercommunicatie start de client verzoeken om gegevens van de server te ontvangen. Met andere woorden, de client haalt gegevens van de server. In het geval van pushmeldingen is het echter de server die de gegevensoverdracht start.

Dit wordt meestal bereikt door een persistente TCP / IP-verbinding te onderhouden (een verbinding die voor onbepaalde tijd open blijft) tussen de server en de client. Dat klinkt misschien geweldig, maar als je een populaire app hebt, kan het erg duur zijn om duizenden aanhoudende verbindingen tussen je server en de apparaten van je gebruikers te onderhouden.

Google Cloud Messaging is een service die dit probleem oplost door als tussenpersoon op te treden tussen uw server en het apparaat van uw gebruiker. Met GCM beheert de Cloud Connection Server van Google, vaak CCS genoemd, de blijvende verbindingen voor u. Het zorgt er ook voor dat uw pushmeldingen veilig en betrouwbaar worden afgeleverd.

voorwaarden

Om met mij mee te gaan, hebt u het volgende nodig:

  • de nieuwste versie van Android Studio
  • Python 2.7.6 of hoger
  • een apparaat met Android 4.4 of hoger waarop Google Play Services is geïnstalleerd

1. Het Android Studio-project opzetten

Start Android Studio en maak een nieuw project met een leeg Activiteit. Als u de standaardinstellingen hebt gebruikt, moet het project een Java-klasse bevatten MainActivity.java.

Stap 1: voeg de afhankelijkheden toe

In dit project gebruiken we de Google-plug-in voor het configureren van GCM. Neem het op in het project door de volgende regel toe te voegen in de afhankelijkheden deel van het project build.gradle:

groovy classpath 'com.google.gms: google-services: 1.5.0'

Pas vervolgens de plug-in toe in de app module build.gradle:

plug-in groovy apply: 'com.google.gms.google-services'

Als u de GCM API wilt gebruiken, voegt u toe com.google.android.gms: play-diensten als een compileren afhankelijkheid in hetzelfde bestand:

groovy compile "com.google.android.gms: play-services: 8.3.0"

Als u op klikt Synchroniseer nu knop, zou je de volgende fout moeten zien:

Klik op de Repository en synchronisatieproject installeren link om de fout te herstellen.

Stap 2: werk het manifest bij

Binnen in het project AndroidManifest.xml een bestand maken, maken en gebruiken C2D_MESSAGE toestemming op basis van de pakketnaam van uw project. Zorg ervoor dat de beschermingsniveau van de toestemming is ingesteld op handtekening.

"xml

"

De meldingen worden ontvangen in de vorm van uitzendingen. Om deze uitzendingen te verwerken, heeft onze app een Uitzending ontvanger. We hoeven het echter niet handmatig te maken. We kunnen in plaats daarvan de GcmReceiver klasse als de Uitzending ontvanger.

De Uitzending ontvanger moet een hebben intent-filter die reageert op de com.google.android.c2dm.intent.RECEIVE actie en de naam van zijn categorie moet overeenkomen met de pakketnaam van uw project. Voeg de volgende code toe aan het manifest:

"xml

"

2. Haal een server API-sleutel en een afzender-ID op

Tijdens de communicatie met de Cloud Connection Server moeten we ons identificeren met behulp van een API-sleutel aan de serverzijde en een afzender-ID aan de kant van de klant. Om de API-sleutel en de afzender-ID te krijgen, maakt u een nieuw project in de ontwikkelaarsconsole.

Begin door op de te klikken Kies een platform knop. Klik vervolgens op de Schakel services in voor mijn Android-app knop. Wanneer u dit doet, wordt u gevraagd een naam en een Android-pakketnaam voor uw app op te geven. Zorg ervoor dat de naam van het Android-pakket dat u opgeeft overeenkomt met de pakketnaam die u hebt ingevoerd toen u het Android Studio-project maakte.

Klik vervolgens op de Kies en configureer services knop onderaan. U kunt nu de Google-services selecteren die u aan de app wilt toevoegen.

Klik voor nu op Cloud Messaging knop en klik vervolgens op Schakel Google Cloud Messaging in. Na een paar seconden krijgt u de API-sleutel van uw server en de ID van de afzender te zien. Noteer de API-sleutel van de server en druk op Dichtbij.

De plug-in voor Google-services die we eerder hebben toegevoegd, moet een configuratiebestand correct werken. Genereer het bestand door op te klikken Genereer configuratiebestanden knop.

Nadat het bestand is gegenereerd, downloadt u het en plaatst u het in uw Android Studio-projecten app directory.

3. Registratie van de klant

GCM identificeert Android-apparaten met behulp van registratietokens. Daarom moet onze app zichzelf kunnen registreren vanaf elk Android-apparaat waarop deze is geïnstalleerd.

Stap 1: Maak een registratiedienst aan

De registratie moet op een achtergrondthread worden uitgevoerd, omdat het proces enige tijd kan duren, afhankelijk van de netwerkverbinding. Omdat de registratie geen invoer van de gebruiker nodig heeft, IntentService is ideaal voor deze taak.

Maak een nieuwe Java-klasse met de naam RegistrationService.java, maak er een subklasse van IntentService, en negeer het onHandleIntent methode.

"java public class RegistrationService breidt IntentService uit public RegistrationService () super (" RegistrationService ");

@Override protected void onHandleIntent (Intent opzet)  "

Binnen in de onHandleIntent methode, kunnen we de Instance ID API gebruiken om het registratietoken te genereren of op te halen. Maak eerst een exemplaar van de InstanceID klasse, met behulp van zijn getInstance methode.

java InstanceID myID = InstanceID.getInstance (this);

We kunnen nu de getToken methode van de InstanceID object om het registratietoken te krijgen in de vorm van een Draad. getToken verwacht de afzender-ID als een van zijn argumenten. Omdat we het hebben toegevoegd google-services.json bestand naar ons project kunnen we de afzender-ID doorgeven aan de methode met R.string.gcm_defaultSenderID.

java String registrationToken = myID.getToken (getString (R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

Als u de inhoud van het registratietoken wilt weergeven voor foutopsporingsdoeleinden, kunt u het als een foutopsporingsbericht registreren met behulp van de Log.d methode.

java Log.d ("Registration Token", registrationToken);

Op dit punt kunt u het registratietoken naar uw webserver verzenden en daar in een database opslaan. U hoeft dit echter niet te doen als u niet van plan bent om uw gebruikers individueel te benaderen. Als u van plan bent hetzelfde bericht naar elke gebruiker te sturen, moet u de methode voor het abonneren op abonneren volgen.

Ik laat je nu zien hoe je je abonneert op een onderwerp riep my_little_topic. Het duurt slechts twee regels code. Maak eerst een nieuw exemplaar van de GcmPubSub klas met zijn getInstance methode. Bel vervolgens het abonneren methode en geef het registratietoken door aan het, samen met de naam van het onderwerp.

java GcmPubSub subscription = GcmPubSub.getInstance (this); subscription.subscribe (registrationToken, "/ topics / my_little_topic", null);

Onze app kan nu elke pushmelding ontvangen die is gepubliceerd op my_little_topic.

Definieer ten slotte de service in AndroidManifest.xml.

"xml

"

De registratiedienst is voltooid.

Stap 2: Maak een InstanceIDListenerService

Registratietokens worden periodiek vernieuwd. Daarom moet elke Android-app die GCM gebruikt een InstanceIDListenerService die deze vernieuwingen aankan. Maak daarom een ​​nieuw Java-bestand met de naam TokenRefreshListenerService.java en maak er een subklasse van InstanceIDListenerService. Binnen in de onTokenRefresh methode van de klas, alles wat we moeten doen is gewoon het registratieproces opnieuw starten door de registratiedienst te starten met behulp van een voornemen en de start dienst methode.

Voeg de volgende code toe aan TokenRefreshListenerService.java:

java public class TokenRefreshListenerService breidt InstanceIDListenerService uit @Override public void onTokenRefresh () Intent i = new Intent (this, RegistrationService.class); startService (i);

Deze service moet kunnen reageren op de com.google.android.gms.iid.InstanceID actie. Daarom tijdens het definiëren van de service in AndroidManifest.xml, voeg de juiste toe intent-filter.

"xml

"

Stap 3: De registratiedienst starten

Om ervoor te zorgen dat het registratieproces begint zodra de app start, moeten we de registratie starten RegistrationService klasse binnen de onCreate methode van Hoofdactiviteit. Hiertoe maakt u een voornemen ervoor en gebruik de start dienst methode.

java Intent i = new Intent (this, RegistrationService.class); startService (i);

4. Pushmeldingen weergeven

GCM geeft automatisch pushmeldingen weer in het meldingenvak zodra ze zijn ontvangen. Dit gebeurt echter alleen als de bijbehorende app een bevat GCMListenerService.

Maak een nieuwe Java-klasse met de naam NotificationsListenerService en maak er een subklasse van GCMListenerService. Tenzij u de gepushte gegevens zelf wilt verwerken, hoeft u geen code in deze klasse te schrijven. We kunnen deze klas voorlopig leeg laten.

"java public class NotificationsListenerService breidt GcmListenerService uit

"

Tijdens het definiëren van de service in AndroidManifest.xml, zorg ervoor dat je een toevoegt intent-filter waarmee het kan reageren op de com.google.android.c2dm.intent.RECEIVE actie.

"xml

"

5. Push-meldingspictogrammen toevoegen

Bij elke pushmelding moet een pictogram zijn gekoppeld. Als je er geen bij de hand hebt, kun je er een krijgen van Google's Material Design Icons Library.

Zodra u het pictogram hebt gedownload, plaatst u het in de res map van uw project. Ik zal gebruiken ic_cloud_white_48dp als het pictogram.

6. De Android-app gebruiken

Onze Android-app is nu voltooid. Zodra u het compileert en uitvoert op een Android-apparaat, kunt u het registratietoken in de logcat logs.

Druk op de knop Terug op uw apparaat om de app af te sluiten. Dit is nodig omdat GCM pushmeldingen automatisch alleen weergeeft als de gebruiker de app niet gebruikt. Als u wilt dat de meldingen ook worden weergegeven als de app actief is, moet u de meldingen zelf binnen maken NotificationsListenerService de ... gebruiken Notification.Builder klasse.

7. Pushmeldingen verzenden

In het laatste deel van deze tutorial zullen we een eenvoudig Python-script maken dat pushmeldingen kan genereren en verzenden naar alle Android-apparaten waarop onze app is geïnstalleerd.

U kunt dit script uitvoeren vanaf uw lokale computer of vanaf een externe webserver waarop u SSH-toegang hebt.

Stap 1: Het script maken

Maak een nieuw bestand met de naam send.py en open het met je favoriete teksteditor.

Aan de bovenkant van het bestand importeert u de urllib2 en urllib modules. We zullen deze modules gebruiken om gegevens te verzenden naar de Cloud Connection Server van Google. Importeer de json module ook omdat de gegevens die we verzenden JSON moeten zijn. Ten slotte, om toegang te krijgen tot de commandoregelargumenten, importeert u de sys module.

python van urllib2 import * import urllib import json import sys

Maak vervolgens een variabele die de API-sleutel van de server opslaat waarvan u eerder kennis hebt genomen. De sleutel moet deel uitmaken van elke HTTP-aanvraag die we in de CCS indienen.

python MY_API_KEY = "ABCDEF123456789ABCDE - 12A"

Elke melding moet een titel en een hoofdtekst hebben. In plaats van ze hardcoderen in ons script, accepteren we de titel en het hoofdgedeelte als opdrachtregelargumenten met behulp van de argv rangschikking.

python messageTitle = sys.argv [1] messageBody = sys.argv [2]

Maak een nieuw Python-woordenboekobject om de gegevens weer te geven die naar de CCS moeten worden verzonden. Om onze Android-app de melding te kunnen ontvangen, moet deze worden gepubliceerd naar een onderwerp met de naam my_little_topic. Voeg daarom een ​​sleutel toe met de naam naar naar het woordenboek en stel de waarde in op / Topics / my_little_topic.

Om de inhoud van de melding weer te geven, voegt u een gebelde sleutel toe kennisgeving naar het woordenboek en stel de waarde ervan in op een ander woordenboekobject met drie sleutels:

  • lichaam
  • titel
  • icoon

Zorg ervoor dat de waarde van de icoon sleutel komt overeen met de naam van het pictogram dat kan worden getekend in uw Android-project.

python data = "naar": "/ topics / my_little_topic", "notification": "body": messageBody, "title": messageTitle, "icon": "ic_cloud_white_48dp"

Converteer het woordenboek naar een JSON-reeks met behulp van de stortplaatsen functie van de json module:

python dataAsJSON = json.dumps (data)

Het enige dat we nu hoeven te doen, is de JSON-reeks verzenden naar https://gcm-http.googleapis.com/gcm/send. Hiertoe maakt u een nieuwe Verzoek object en set dataAsJSON als zijn gegevens. Stel vervolgens de machtiging header naar MY_API_KEY en de Content-type header naar application / json.

python request = Request ("https://gcm-http.googleapis.com/gcm/send", dataAsJSON, "Autorisatie": "key =" + MY_API_KEY, "Content-type": "application / json")

Om ten slotte het verzoek uit te voeren en het antwoord op te halen, geeft u het verzoek-object door aan het urlopen functie en bel zijn lezen methode.

python print urlopen (request) .read ()

Het Python-script is nu voltooid en klaar voor gebruik.

Stap 2: Het script uitvoeren

Op dit moment zijn we klaar om pushmeldingen te verzenden naar alle apparaten waarop onze app is geïnstalleerd. Open een terminal en ga naar de map waarin u de map hebt aangemaakt send.py.

Geef de naam van het script door aan de Python uitvoerbaar samen met een reeks voor de titel van de kennisgeving en een voor de instantie van de melding. Hier is een voorbeeld dat u kunt gebruiken:

bash python send.py "Mijn eerste push-melding" "GCM API is geweldig!"

Als er geen fouten zijn, zou u een antwoord moeten krijgen dat er als volgt uitziet:

javascript "message_id": 12345676892321

Als u uw Android-apparaat controleert, ziet u een nieuwe melding in de meldingenbalk.

Conclusie

U weet nu hoe u pushmeldingen naar uw gebruikers kunt verzenden. In deze les hebt u geleerd hoe u een Android-app kunt maken die zichzelf kan registreren en die meldingen ontvangt die zijn gepubliceerd naar een specifiek onderwerp. Je hebt ook geleerd hoe je een Python-script kunt maken dat meldingen kan publiceren.

Hoewel pushmeldingen een geweldige manier kunnen zijn om met uw gebruikers te communiceren, raad ik aan dat u ze spaarzaam gebruikt en alleen als u iets nuttigs te zeggen hebt, omdat het te vaak verzenden van te vaak de snelste manier is om uw app te krijgen verwijderde.

Raadpleeg de Cloud Messaging Guide voor meer informatie over Google Cloud Messaging.