ينشئ Google Play إشعارات استجابةً للأحداث التي يتم إجراؤها ويمكن أن تؤثر على المؤسسة. ويمكن لموفّري حلول إدارة الخدمات الجوّالة للمؤسسات (EMM) تلقّي هذه الإشعارات والتصرف وفقًا لها، من خلال تقديم تنبيهات أو الآليات الأخرى مديري عملائهم، على سبيل المثال.
يخبرك هذا الدليل بكيفية ضبط البنية الأساسية للخادم تلقّي ومعالجة الإشعارات الفورية لإدارة الخدمات الجوّالة للمؤسسات (EMM) فقط. لا تتطلب إشعارات السحب الإعداد المفصّل في هذا الدليل.
بالإضافة إلى إعداد الخادم الموضح في هذا الدليل، فإن الإشعارات الفورية فيجب عليك أيضًا منح الامتيازات المناسبة وإجراء عمليات تهيئة المهام في وحدة التحكم في واجهة Google API. عرض تفعيل الإشعارات الفورية لإدارة الخدمات الجوّالة للمؤسسات (EMM) لمزيد من التفاصيل.
لمزيد من المعلومات حول Google Cloud Pub/Sub، بما في ذلك أمثلة، يُرجى الاطّلاع على مستندات Cloud Pub/Sub:
يمكنك ضبط نظامك بحيث يتم إرسال الإشعارات الفورية إلى نقطة نهاية HTTPS المحددة أو إلى خادم ينتظر إرسال الإشعارات.
لمحة عن إعداد نقاط النهاية الفورية
لإعداد نقطة نهاية إرسال، تحتاج إلى خادم يحتوي على شهادة طبقة مقابس آمنة (SSL) صالحة. ضِمن في هذا المثال، يمكنك إنشاء شهادة SSL وتحميلها إلى هيئة إصدار شهادات (CA)، ثم اضبط خادم NGINX. أخيرًا، تقوم بتجميع وتشغيل التعليمة البرمجية تأكَّد من صحة الإعداد.
يوضح هذا المثال كيفية ضبط
خادم NGINX في
وضع الخادم الوكيل العكسي للاتصال بتطبيق المشترك (في PushSubscriber.java)
قيد التشغيل على المنفذ 8093، باستخدام نظام التشغيل Ubuntu 14.04. قد تستخدم مؤسستك واجهة برمجة تطبيقات
ولكن يجب أن يعمل نموذج الإعداد بدون تغييرات، على جميع الأنظمة المستندة إلى Debian
التوزيعات. تعتبر التوزيعات الأخرى (مثل تلك التي تستند إلى RedHat) مشابهة،
ولكن قد يكون موقع ملفات التهيئة مختلفًا.
قبل أن تتمكن من تلقّي إشعارات، يجب إعداد نقطة نهاية تستوفي المعايير التالية:
يجب أن تكون مالكًا للنطاق وأن تُثبت ملكيته في وحدة التحكم في واجهة Google API:
يجب أن تكون قادرًا على تشغيل خدمة عبر المنفذ 443 (طبقة المقابس الآمنة).
يجب أن تتوفّر لديك شهادة طبقة مقابس آمنة (SSL) موقّعة من مرجع تصديق (CA). الشهادات الموقعة ذاتيًا لا تعمل.
يجب أن يتيح خادم الويب الذي تستخدمه دعمًا الردّ التلقائي على الويب:
لا تحتاج نقطة النهاية إلى التشغيل على Google App Engine (على الرغم من إمكانية ذلك).
إنشاء شهادة طبقة المقابس الآمنة (SSL) وتحميلها
1. إنتاج شهادة طبقة المقابس الآمنة (SSL):
myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 -keyout cert.key -out cert.crt
يؤدي هذا الإجراء إلى إنشاء الرد التالي. استبدال قيم العيّنة
(مثل push.solarmora.com وmyusername@myhost) مع خادمك الفعلي
والاسم والشركة والعنوان وما إلى ذلك، في الرمز التالي. يمكنك استخدام أي
نطاق فرعي طالما أن سجل A لهذا النطاق الفرعي يشير إلى خادمك.
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. تحقَّق من إنشاء ملف شهادة:
$ myusername@myhost:/tmp$ ls cert*
cert.crt cert.key
3- لتوقيع هذه الشهادة، قم بإنتاج طلب توقيع الشهادة (CSR) لتحميله إلى الموقِّع:
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. تأكد من أن محتوى ملف CSR يبدو كما يلي:
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- حمِّل الجزء من شهادتك بين "BEGIN".
وEND سطرًا (ضمنًا) إلى مرجع تصديق (CA). ستستغرق العملية الدقيقة
تعتمد على مصدر الشهادة، ولكن ستشمل الخطوات التالية:
- حمّل ملف CSR إلى موقع مرجع التصديق، أو الصق محتوى الملف على موقع مرجع التصديق. وعندئذٍ، يتحقق مرجع التصديق من صحة هذه البيانات ويعالجها.
- نزِّل الشهادة المُوقَّعة التي تم إنشاؤها بواسطة مرجع تصديق (CA).
6- يجب أن يحتوي الناتج من مرجع التصديق على ملفات متعددة: ملف
الشهادة نفسها وشهادة المرجع المصدق (CA) التي تثبت أهليةهما
وتوقيع الشهادات. إنشاء سلسلة لجميع ملفات الشهادة التي يبلغ عددها *.crt في الملف الذي تم تنزيله
حزمة في ملف حزمة واحد، على سبيل المثال bundle.push.solarmora.com.crt:
$ cat *.crt > bundle.push.solarmora.com.crt
إعداد الخادم الوكيل
في هذا القسم، يمكنك إعداد خادم الويب المفتوح المصدر NGINX وعكس خادم وكيل لخدمة نقطة النهاية وإعادة توجيه جميع الطلبات الواردة إلى خادم مشترك. يتم استخدام NGINX كمثال، ولكن يمكنك استخدام أي الخادم الوكيل HTTP بدلاً من ذلك.
1. ثبِّت NGINX على خادمك:
$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v
$ nginx version: nginx/1.4.6 (Ubuntu)
2. للتأكد من أن ملفات تهيئة الخادم الإضافية التي تنشئها في
تعالج NGINX دليل sites-enabled، يُرجى تعديل /etc/nginx/nginx.conf.
وتشمل ما يلي:
$ include /etc/nginx/conf.d/*.conf;
$ include /etc/nginx/sites-enabled/*;
3- انسخ ملفات الشهادة إلى مكان آمن يمكن قراءته بواسطة
مستخدم www-data، ولكن يُفضّل ألا يتمكن أي مستخدم آخر من قراءته (قد تحتاج إلى
لضبط اسم المستخدم إذا كان خادم الويب يعمل باسم مستخدم مختلف
المستخدم):
$ 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. أنشِئ إعداد server جديدًا. تعديل push.solarmora.com
في /etc/nginx/sites-enabled واستخدام
اسم المجال المؤهل بالكامل للخادم كاسم الملف:
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- أعِد تشغيل NGINX لتنفيذ التغييرات:
myusername@myhost:/etc/nginx$ sudo service nginx restart
* Restarting nginx nginx
...done.
6- اكتملت عملية إعداد الخادم. للتحقق من
الإعداد، جرِّب الاستعلام من الخادم باستخدام 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>
هذه هي الاستجابة المتوقّعة لأنّه لم يتم ضبط أي خادم آخر.
(localhost:8093 في ملف الإعداد).
تجميع الأمثلة وتشغيلها
لتشغيل الأمثلة الواردة في هذا القسم، يجب أن تكون لديك وحدة تحكّم نشطة في واجهة Google API. مشروعك. ننصحك بإنشاء حساب مخصَّص لأغراض الاختبار وإبقائها منفصلة عن مشروع الإنتاج لديك. بعد إنشاء مشروع اختباري، عليك إنشاء حساب خدمة. دوِّن عنوان البريد الإلكتروني الخاص بحساب الخدمة، ثم ضَع ملف .p12 المرتبط به في مكان على خادمك.
إعداد شجرة رموز المصدر
1. استنساخ مستودع 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- تأكَّد من أنّ المحول البرمجي لـ Maven وGoogle Protocol Buffers مثبت بشكل صحيح:
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. يفترض ملف إعداد Maven pom.xml أنّ المحول البرمجي لـ Protocol Buffers مثبَّت في الدليل /usr/bin/protoc:
myusername@myhost:~$ which protoc
/usr/bin/protoc
pom.xml أو الرابط الرمزي protoc:
$ sudo ln -s which protoc /usr/bin/protoc
mvn clean compile assembly:single. يُفترض أن ينتج عن هذا ملف يسمى
emm-notifications-[version-number]-jar-with-dependencies.jar، حيث
[version number] هي النسخة الحالية من المثال، على سبيل المثال 1.0-SNAPSHOT:
myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/*
target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
TestPublisher المجمَّع. من المتوقع أن يتعذّر اجتياز الرمز:
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. عليك إلغاء بعض القيم في ملف settings.properties. للقيام بذلك،
إنشاء نسخة من الملف وتعديل الخصائص في النسخة على النحو التالي:
# 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. أعِد تشغيل رمز TestPublisher للتأكّد من عدم تعطُّله. (قد تظهر لك علامة
خطأ فردي في مخرجات السجل).
تشغيل رمز اختبار الناشر
تحتاج إلى تشغيل الرمز النموذجي لإشعارات النشر حتى لدى المشترك بعض الرسائل لقراءتها.
في المثال التالي، تبحث التعليمة البرمجية عن
الموضوع المحدد في my_settings.properties ولكن لم يتمكن من العثور عليه، وبالتالي يتم إنشاء الموضوع.
بعد ذلك، يتم نشر رسالة حول الموضوع. يقدم هذا المثال فكرة
أداة اختبار تتيح لك محاكاة الرسائل المُرسَلة بواسطة واجهة برمجة التطبيقات 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}]}
تشغيل رمز اختبار المشترك
يؤكّد رمز اختبار المشترك أنّه يمكنك تلقّي الرسائل التي نشرتها
رمز TestPublisher.
1. تأكد من أن التعليمة البرمجية محدثة ومجمّعة، ثم شغّل رمز اختبار المشترك:
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. إعادة تشغيل حساب الناشر، وسيتم حفظ الرسائل الجديدة تمت إضافته إلى السجل:
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
}