Google Play generuje powiadomienia w odpowiedzi na wydarzenia i może mieć wpływ na całą firmę. Dostawcy rozwiązań EMM mogą powiadomień i działania na ich podstawie, wysyłając alerty lub inne mechanizmy, przez administratorów swoich klientów.
Z tego przewodnika dowiesz się, jak skonfigurować niezbędną infrastrukturę serwerową w celu otrzymywania i przetwarzania tylko powiadomień push EMM. Powiadomienia pull nie wymagają konfiguracji opisanej w tym przewodniku.
Oprócz konfiguracji serwera opisanej w tym przewodniku w przypadku powiadomień push musisz też przyznać odpowiednie uprawnienia i wykonać inną konfigurację w Konsoli interfejsów API Google. Zobacz Włączanie powiadomień push usług EMM .
Więcej informacji o Google Cloud Pub/Sub (w tym przykłady) znajdziesz w materiałach na temat dokumentacji Cloud Pub/Sub.
Możesz skonfigurować swój system tak, aby powiadomienia push były wysyłane do określonego punktu końcowego HTTPS lub do serwera, który czeka na wysłanie powiadomień.
Informacje o konfiguracji punktu końcowego push
Aby skonfigurować punkt końcowy push, potrzebujesz serwera z prawidłowym certyfikatem SSL. W W tym przykładzie tworzysz certyfikat SSL i przesyłasz go do urzędu certyfikacji (CA), a następnie skonfiguruj serwer NGINX. Na koniec kompilujesz i uruchamiasz kod testowy, upewnij się, że konfiguracja jest prawidłowa.
Ten przykład pokazuje, jak skonfigurować
Serwer NGINX w
odwrotny tryb proxy do łączenia się z aplikacją subskrybującą (w PushSubscriber.java)
uruchomiony na porcie 8093 z systemem Ubuntu 14.04. Twoja firma może użyć innej
serwera, ale przykładowa konfiguracja powinna działać bez żadnych zmian we wszystkich systemach
rozkłady. Inne dystrybucja (np. te oparte na RedHat) są podobne.
ale ich lokalizacja może być inna.
Aby otrzymywać powiadomienia, musisz skonfigurować punkt końcowy, który spełnia następujące kryteria:
Musisz być właścicielem domeny i zweryfikować swoje prawo własności w Konsola interfejsów API Google.
Musisz mieć możliwość uruchamiania usług na porcie 443 (SSL).
Musisz mieć certyfikat SSL podpisany przez urząd certyfikacji. Certyfikaty podpisane samodzielnie nie działają.
Używany serwer WWW musi obsługiwać webhooki.
Punkt końcowy nie musi uruchamiać się w Google App Engine (ale może).
Tworzenie i przesyłanie certyfikatu SSL
1. Wygeneruj certyfikat SSL:
myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 -keyout cert.key -out cert.crt
Spowoduje to wygenerowanie tej odpowiedzi. Zastąp przykładowe wartości
(np. push.solarmora.com i myusername@myhost) z rzeczywistym serwerem
imię i nazwisko, firma, adres itp. w poniższym kodzie. Możesz użyć dowolnej
o ile rekord A tej subdomeny wskazuje Twój serwer.
Generating a 2048 bit RSA private key
...........................................................................
.....+++
writing new private key to 'cert.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:England
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Solarmora, Inc.
Organizational Unit Name (eg, section) []:Creative Publications
Common Name (e.g. server FQDN or YOUR name) []:push.solarmora.com
Email Address []:admin@solarmora.com
2. Sprawdź, czy plik certyfikatu został utworzony:
$ myusername@myhost:/tmp$ ls cert*
cert.crt cert.key
3. Aby podpisać ten certyfikat, utwórz Żądanie podpisania certyfikatu, które należy przesłać do osoby podpisującej:
myusername@myhost:/tmp$ sudo openssl x509 -x509toreq -in cert.crt \ -out cert.csr -signkey cert.key Getting request Private Key Generating certificate request
myusername@myhost:/tmp$ ls cert.* cert.crt cert.csr cert.key
4. Upewnij się, że zawartość pliku CSR wygląda tak:
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=GB, ST=England, L=London, O=Solarmora, Inc.,
OU=Creative Publications,
CN=push.solarmora.com/emailAddress=admin@solarmora.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:cc:0f:54:26:3d:d9:17:eb:8f:6c:f7:27:5e:77:
64:65:00:db:fe:2a:1f:fa:ea:de:21:7a:c5:5d:87:
...
...
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
1d:ea:12:b8:c2:6a:d6:f4:6e:92:2f:b9:12:5e:e3:91:15:a0:
06:b5:81:ce:c5:cf:b7:d2:a7:dd:f2:78:ca:28:8e:21:cd:6d:
...
...
-----BEGIN CERTIFICATE REQUEST-----
MIIC6zCCAdMCAQAwgaUxCzAJBgNVBAYTAkdCMRAwDgYDVQQIDAdFbmdsYW5kMQ8w
DQYDVQQHDAZMb25kb24xGDAWBgNVBAoMD0FDTUUgQ29ycCwgSW5jLjEYMBYGA1UE
CwwPQ3JlYXRpdmUgQW52aWxzMRswGQYDVQQDDBJwdXNoLmFjbWUtY29ycC5jb20x
IjAgBgkqhkiG9w0BCQEWE2FkbWluQGFjbWUtY29ycC5jb20wggEiMA0GCSqGSIb3
...
...
-----END CERTIFICATE REQUEST-----
5. Prześlij część certyfikatu między BEGIN
i END (włącznie) do urzędu certyfikacji. Dokładny proces
zależy od urzędu certyfikacji, ale obejmuje te czynności:
- Prześlij plik żądania podpisania certyfikatu do witryny urzędu certyfikacji lub wklej zawartość pliku w witrynie urzędu certyfikacji. Urząd certyfikacji zweryfikuje i przetworzy te dane.
- Pobierz podpisany certyfikat wygenerowany przez urząd certyfikacji.
6. Dane wyjściowe z urzędu certyfikacji powinny zawierać wiele plików: podpisany plik
certyfikat wraz z certyfikatem urzędu certyfikacji potwierdzającym, że są one upoważnione
podpisywać certyfikaty. Połącz wszystkie pliki certyfikatów (*.crt) w pobranym pliku
umieść w jednym pliku pakietu, np. bundle.push.solarmora.com.crt:
$ cat *.crt > bundle.push.solarmora.com.crt
Konfigurowanie serwera proxy
W tej sekcji skonfigurujesz serwer WWW typu open source NGINX serwera proxy do obsługi punktu końcowego i przekazywania wszystkich żądań przychodzących do serwer subskrybenta. Jako przykładu użyto formatu NGINX, ale możesz użyć dowolnego innego Serwer proxy HTTP.
1. Zainstaluj NGINX na swoim serwerze:
$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v
$ nginx version: nginx/1.4.6 (Ubuntu)
2. Aby dodatkowe pliki konfiguracyjne serwera utworzone w
Katalog sites-enabled jest przetwarzany przez NGINX, edytuj /etc/nginx/nginx.conf
oraz podaj następujące informacje:
$ include /etc/nginx/conf.d/*.conf;
$ include /etc/nginx/sites-enabled/*;
3. Skopiuj pliki certyfikatów do bezpiecznej lokalizacji, w której będzie mogła odczytać
www-data, ale zwykle nie jest czytelny dla innych użytkowników (może być konieczne
lub dostosować nazwę użytkownika, jeśli Twój serwer WWW działa jako inny
użytkownika):
$ sudo mkdir -p /var/openssl/push.solarmora.com
$ sudo mv /tmp/cert.key
/var/openssl/push.solarmora.com/push.solarmora.com.key
$ sudo mv /tmp/bundle.push.solarmora.com.crt
/var/openssl/push.solarmora.com/bundle.push.solarmora.com.crt
4. Utwórz nową konfigurację server. Edytuj push.solarmora.com
w /etc/nginx/sites-enabled i użyj rzeczywistego
w pełni kwalifikowana nazwa domeny serwera jako nazwa pliku:
server {
listen 443;
server_name push.solarmora.com;
ssl on;
ssl_certificate
/var/openssl/push.solarmora.com/bundle.push.solarmora.com.crt;
ssl_certificate_key
/var/openssl/push.solarmora.com/push.solarmora.com.key;
# it is usually very convenient to have separate files for your
# access and error log to analyze for possible problems
access_log /var/log/nginx/nginx.push.solarmora.com.log;
error_log /var/log/nginx/nginx.push.solarmora.com.log;
location / {
# assuming the subscriber will run on the same machine
# on port 8093
proxy_pass http://localhost:8093;
}
}
5. Ponownie uruchom NGINX, aby wprowadzić zmiany:
myusername@myhost:/etc/nginx$ sudo service nginx restart
* Restarting nginx nginx
...done.
6. Serwer jest teraz skonfigurowany. Aby zweryfikować
, spróbuj wysłać zapytanie do serwera, używając curl:
[myusername@myhost:~]$ curl push.solarmora.com
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.4.6 (Ubuntu)</center>
</body>
</html>
To jest oczekiwana odpowiedź, ponieważ nie skonfigurowano serwera odbierającego
(localhost:8093 w naszym pliku konfiguracyjnym).
Przykłady kompilowania i uruchamiania
Aby uruchomić przykłady z tej sekcji, musisz mieć aktywną konsolę interfejsów API Google w projektach AI. Zalecamy utworzenie konta specjalnie do celów testowych. oddzielanie go od projektu produkcyjnego. Po utworzeniu projektu testowego musisz utworzyć konto usługi. Zapisz adres e-mail konta usługi i umieść powiązany plik .p12 na serwerze.
Skonfiguruj drzewo kodu źródłowego
1. Sklonuj repozytorium play-work.git:
myusername@myhost:~/code$ git clone
https://github.com/google/play-work.git
Cloning into 'play-work'...
Username for 'https://github.com': username
Password for 'https://username@github.com':
remote: Counting objects: 110, done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 110 (delta 24), reused 95 (delta 9), pack-reused 0
Receiving objects: 100% (110/110), 23.88 KiB | 0 bytes/s, done.
Resolving deltas: 100% (24/24), done.
Checking connectivity... done.
$ sudo apt-get install maven protobuf-compiler
3. Sprawdź, czy Maven i kompilator Google Protocol Buffers są zainstalowane poprawnie:
myusername@myhost:~$ mvn -v
Apache Maven 3.0.5
Maven home: /usr/share/maven
Java version: 1.7.0_75, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.16.0-30-generic", arch: "amd64", family: "unix"
myusername@myhost:~$ protoc --version
libprotoc 2.5.0
4. Plik konfiguracji Maven pom.xml zakłada, że kompilator buforów protokołów jest zainstalowany w katalogu /usr/bin/protoc:
myusername@myhost:~$ which protoc
/usr/bin/protoc
pom.xml lub dowiązanie symboliczne protoc:
$ sudo ln -s which protoc /usr/bin/protoc
mvn clean compile assembly:single. Powinno to spowodować utworzenie pliku o nazwie
emm-notifications-[version-number]-jar-with-dependencies.jar, gdzie
[version number] to bieżąca wersja przykładu, na przykład 1.0-SNAPSHOT:
myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/*
target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
TestPublisher. Oczekuje się, że kod ulegnie awarii:
myusername@myhost:~/code/play-work/examples/emm-notifications$ java -cp \
target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar \
com.google.android.work.emmnotifications.TestPublisher
Exception in thread "main" java.lang.IllegalArgumentException:
You must specify non-default ServiceAccountEmail in
settings.properties
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:119)
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:69)
at com.google.android.work.emmnotifications.Settings.verifyVariable(Settings.java:129)
at com.google.android.work.emmnotifications.Settings.getSettings(Settings.java:103)
at com.google.android.work.emmnotifications.TestPublisher.main(TestPublisher.java:39)
7. Musisz zastąpić niektóre wartości w pliku settings.properties. Aby to zrobić:
utwórz kopię pliku i zmień w niej właściwości w następujący sposób:
# This should be your own service account's email address
ServiceAccountEmail=368628613713-t4hfexampledn5lhpdcu1qqfgio01626@developer.gserviceaccount.com
ServiceAccountP12KeyFile=/opt/secret/secret.p12
# This will be the name of the service account
ProjectName=enterprise-cloud-pub-sub
SubscriptionName=projects/enterprise-cloud-pub-sub/subscriptions/default
TopicName=projects/enterprise-cloud-pub-sub/topics/default
# The push endpoint in your API Console project
PushEndpoint=https://push.solarmora.com
8. Uruchom kod TestPublisher jeszcze raz, aby upewnić się, że nie ulega awarii. (Może pojawić się
pojedynczy błąd w danych wyjściowych dziennika).
Uruchamianie kodu testowego wydawcy
Musisz uruchomić przykładowy kod publikowania powiadomień, aby subskrybent ma wiadomości do przeczytania.
W poniższym przykładzie kod szuka elementów
tematu określonego w funkcji my_settings.properties, ale nie można go znaleźć, i dlatego zostaje utworzony temat.
Następnie opublikuje wiadomość w tym temacie. Ten przykład pozwala uzyskać cenne informacje
narzędzie do testowania, które umożliwia emulację wiadomości wysyłanych przez interfejs Google Play EMM API.
myusername@myhost:~/code/play-work/examples/emm-notifications$ DEVELOPER_CONSOLE_SETTINGS=./my_settings.properties java -cp \
target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar com.google.android.work.emmnotifications.TestPublisher
Feb 27, 2015 1:39:59 PM com.google.android.work.emmnotifications.RetryHttpInitializerWrapper$1 handleResponse
INFO: RetryHandler: {
"error": {
"code": 404,
"message": "Resource not found (resource=default).",
"errors": [
{
"message": "Resource not found (resource=default).",
"domain": "global",
"reason": "notFound"
}
],
"status": "NOT_FOUND"
}
}
Feb 27, 2015 1:39:59 PM com.google.android.work.emmnotifications.TestPublisher main
INFO: Topic projects/enterprise-cloud-pub-sub/topics/default doesn't exists, creating it
Feb 27, 2015 1:40:02 PM com.google.android.work.emmnotifications.TestPublisher main
INFO: Topic projects/enterprise-cloud-pub-sub/topics/default created
Feb 27, 2015 1:40:02 PM com.google.android.work.emmnotifications.TestPublisher main
INFO: Publishing a request: {messages=[{data=CjEKFQoIMTIzMjEzMjESCXJpZ2h0IG5vdxIWY29tLmdvb2dsZS5hbmRyb2lkLmdtcxgA}]}
Uruchom kod testowy subskrybenta
Kod testowy subskrybenta potwierdza, że możesz otrzymywać wiadomości publikowane przez
kod TestPublisher.
1. Upewnij się, że Twój kod jest aktualny i skompilowany, a następnie uruchom kod testowy subskrybenta:
myusername@myhost:~/code/play-work/examples/emm-notifications$ DEVELOPER_CONSOLE_SETTINGS=./my_settings.properties
java -cp target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
com.google.android.work.emmnotifications.PushSubscriber
Feb 27, 2015 1:46:37 PM com.google.android.work.emmnotifications.PushSubscriber main
INFO: Will be using topic name: projects/enterprise-cloud-pub-sub/topics/default, subscription name:
projects/enterprise-cloud-pub-sub/subscriptions/default
Feb 27, 2015 1:46:38 PM com.google.android.work.emmnotifications.PushSubscriber main
INFO: Trying to get subscription named projects/enterprise-cloud-pub-sub/subscriptions/default
Feb 27, 2015 1:46:38 PM com.google.android.work.emmnotifications.RetryHttpInitializerWrapper$1 handleResponse
INFO: RetryHandler: {
"error": {
"code": 404,
"message": "Resource not found (resource=default).",
"errors": [
{
"message": "Resource not found (resource=default).",
"domain": "global",
"reason": "notFound"
}
],
"status": "NOT_FOUND"
}
}
Feb 27, 2015 1:46:38 PM com.google.android.work.emmnotifications.PushSubscriber main
INFO: Subscription doesn't exist, will try to create projects/enterprise-cloud-pub-sub/subscriptions/default
Feb 27, 2015 1:46:43 PM com.google.android.work.emmnotifications.PushSubscriber main
INFO: Created: {
"ackDeadlineSeconds" : 600,
"name" : "projects/enterprise-cloud-pub-sub/subscriptions/default",
"pushConfig" : {
"pushEndpoint" : "https://push.solarmora.com"
},
"topic" : "projects/enterprise-cloud-pub-sub/topics/default"
}
2. Uruchom ponownie wydawcę, a nowe wiadomości dodane do dziennika:
Feb 27, 2015 1:47:24 PM com.google.android.work.emmnotifications.PushSubscriber$1 handle
INFO: Raw request: {"message":{"data":"CjEKFQoIMTIzMjEzMjESCXJpZ2h0IG5vdxIWY29tLmdvb2dsZS5hbmRyb2lkLmdtcxgA",
"attributes":{},"message_id":"71571141246"},"subscription":"/subscriptions/enterprise-cloud-pub-sub/default"}
Feb 27, 2015 1:47:24 PM com.google.android.work.emmnotifications.PushSubscriber$1 handle
INFO: Pubsub message received: {
"attributes" : { },
"data" : "CjEKFQoIMTIzMjEzMjESCXJpZ2h0IG5vdxIWY29tLmdvb2dsZS5hbmRyb2lkLmdtcxgA",
"message_id" : "71571141246"
}
Feb 27, 2015 1:47:24 PM com.google.android.work.emmnotifications.PushSubscriber$1 handle
INFO: Message received: product_approval_event {
common_event_information {
enterprise_id: "12321321"
event_notification_sent_timestamp: "right now"
}
product_id: "com.google.android.gms"
approved: false
}