استفاده از پوش نوتیفیکیشن ها در اندروید - بخش اول

استفاده از پوش نوتیفیکیشن ها در اندروید - بخش اول

مقدمه

ترغیب کاربران جهت دانلود و نصب اپلیکیشن تنها نیمی از راه است و مابقی کار ایجاد تمایل جهت استفاده مداوم از اپلیکیشن می باشد. این احتمال وجود دارد که کاربران پس از یک یا دو بار استفاده از اپلیکیشن آن را کاملا فراموش کنند، از این رو اپلیکیشن های مختلف در تلاش اند تا توجه کاربران را نسبت به خود جلب نمایند.

با به کار بردن پوش نوتیفیکیشن ها قادر هستید به طور مداوم کاربران را از بابت وجود اپلیکیشن خود آگاه نموده و شانس اپلیکیشن برای ماندن در گوشی کاربران را افزایش دهید.

GCM یا همان پیام رسان کلود گوگل، سرویسی است که توسط آن می توانید برای کاربران خود پوش نوتیفیکیشن ارسال کنید. در این مطلب آموزشی ساخت یک اپلیکیشن اندروید که قادر به ارسال پوش نوتیفیکیشن می باشد را فرا خواهید گرفت و برای این کار از یک اسکریپت پایتون که قادر به تولید و ارسال آنها از سمت سرور است استفاده خواهید کرد.

چرا از پیام رسان کلود گوگل استفاده کنیم؟

برای بسیاری از ارتباطات سمت کلاینت، کلاینت درخواست هایی را برای دریافت داده از سرور صورت می دهد، به بیان دیگر کلاینت ها داده ها را از سرور می کشند و برای پوش نوتیفیکیشن ها، این سرور است که تبادل داده را آغاز می کند.

معمولا این مبادله با راه اندازی یک ارتباط مستمر بین کلاینت و سرور که از نوع TCP/IP بوده و به صورت نامحدود باز می ماند، صورت می پذیرد. چنانچه اپلیکیشن شما از محبوبیت زیادی برخوردار باشد، هزاران ارتباط مداوم بین سرور شما و گوشی های کاربران بسیار گران تمام می شود.

پیام رسان کلود گوگل سرویسی است که به کمک حل این مشکل آمده و در نقش یک واسطه بین سرور شما و گوشی کاربران عمل می کند. با GCM، سرور ارتباطی کلود گوگل یا همان CCS، این ارتباطات مستمر را مدیریت نموده و از بابت تحویل امن و قابل اعتماد پوش نوتیفیکیشن های ارسال شده اطمینان حاصل می کند.

پیش نیازها

- آخرین نسخه از اندروید استودیو

- نسخه 2.7.6 و یا بالاتر پایتون

- یک گوشی اندرویدی با نسخه 4.4 و یا بالاتر از اندروید که Google Play Services بر روی آن نصب شده باشد

1. راه اندازی پروژه اندروید استودیو

با باز کردن اندروید استودیو یک پروژه جدید با یک Activity خالی ایجاد کنید، چنانچه پیش فرض ها را مورد استفاده قرار دهید، پروژه باید یک کلاس جاوا در MainActivity.java را در بر بگیرد.

گام 1: افزودن وابستگی ها

در این پروژه از Google Services gradle plugin برای پیکربندی GCM استفاده می شود، لذا باید آن را با افزودن خط زیر در بخش dependencies پروژه در فایل build.gradle درج کنید.

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

سپس پلاگین را در build.gradle ماژول اپلیکیشن بکار بگیرید:

apply plugin: 'com.google.gms.google-services'

به منظور استفاده از GCM API باید com.google.android.gms:play-services را به عنوان یک وابستگی compile در همان فایل اضافه کنید.

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

با کلیک بر روی دکمه Sync Now خطای زیر نمایش داده می شود:

blog_17184_1

برای رفع این خطا بر روی Install Repository and sync project کلیک کنید.

گام 2: آپدیت کردن فایل منیفست

در داخل فایل AndroidManifest.xml، یک مجوز C2D_MESSAGE کاستوم را بر اساس نام پکیج پروژه خود ساخته و مورد استفاده قرار دهید. مطمئن شوید که signature برای protectionLevel مجوز ست شده است.

<permission

android:name="com.github.hathibelagal.pn.permission.C2D_MESSAGE"

android:protectionLevel="signature" />

<uses-permission

android:name="com.github.hathibelagal.pn.permission.C2D_MESSAGE" />

نوتیفیکیشن ها به حالت برادکست دریافت می شوند، لذا به منظور مدیریت برادکست ها اپلیکیشن به یک BroadcastReceiver نیاز خواهد داشت، اما لازم نیست آن را به صورت دستی بسازید، می توان از کلاس GcmReceiver به عنوان BroadcastReceiver استفاده کرد.

Broadcast receiver باید دارای یک intent-filter برای پاسخگویی به اکشن com.google.android.c2dm.intent.RECEIVE بود و نام دسته بندی آن نیز باید مطابق با نام پکیج پروژه باشد، کد زیر را به منیفست بیفزایید:

<receiver

android:name="com.google.android.gms.gcm.GcmReceiver"

android:exported="true"

android:permission="com.google.android.c2dm.permission.SEND" >

<intent-filter>

<action android:name="com.google.android.c2dm.intent.RECEIVE" />

<category android:name="com.github.hathibelagal.pn" />

</intent-filter>

</receiver>

2. دریافت Server API Key و Sender ID

در حین مبادله به سرور ارتباطی کلود، به راهی برای شناسایی نیاز داریم که این کار از طریق استفاده از یک کلید API در سمت سرور و یک ID فرستنده در سمت کلاینت صورت می پذیرد. برای دریافت کلید API و ID فرستنده، یک پروژه جدید در کانسول دولوپر بسازید.

blog_17184_2

کار را با کلیک بر روی دکمه Pick a platform آغاز نمایید، سپس بر روی دکمه Enable services for my Android App کلیک کنید، با این کار از شما درخواست می شود تا یک نام برای پکیچ اندروید اپلیکیشن خود انتخاب کنید، این نام باید با نامی که برای پروژه اندروید استودیو انتخاب کرده بودید، مطابقت داشته باشد.

blog_17184_3

در گام بعدی بر روی دکمه Choose and configure services در قسمت پایین کلیک کنید، در این مرحله قادرید تا سرویس گوگلی را که برای اپلیکیشن خود مد نظر دارید برگزینید.

blog_17184_4

بر روی دکمه Could Messaging کلیک کرده و سپس Enable Google Cloud Messaging را بزنید، پس از چند ثانیه کلید API سرور و ID فرستنده به شما نمایش داده می شود، آنها را یادداشت کرده و Close را بزنید.

blog_17184_5

برای عملکرد صحیح پلاگین Google Services که پیش تر افزوده بودیم، به یک پیکربندی نیاز است. با کلیک بر روی دکمه Generate configuration files فایلی را تولید کرده و پس از ساخته شدن فایل آن را دانلود نموده و درون دایرکتوری app پروژه اندروید استودیو خود قرار دهید.

3. رجستر کردن کلاینت

GCM از توکن های رجیستریشن برای شناسایی گوشی های اندروید استفاده می کند، از این رو اپلیکیشن باید قادر به رجیستر کردن خود در هر گوشی اندرویدی که بر روی آن نصب شده باشد.

گام 1: ساخت یک سرویس رجیستریشن

این عملیات بسته به ارتباطات شبکه ممکن است کمی طول بکشد، از این رو باید آن را در پس زمینه انجام داد. از آنجایی که رجیستریشن به هیچگونه ورودی از سمت کاربر نیاز ندارد، یک IntentService برای این وظیفه گزینه بسیار خوبی به نظر می رسد.

یک کلاس جاوای جدی به نام RegistrationService.java ساخته و آن را زیر کلاس IntentService نمایید، سپس متد onHandleIntent را اورراید کنید.

public class RegistrationService extends IntentService {

public RegistrationService() {

super("RegistrationService");

}

@Override

protected void onHandleIntent(Intent intent) {

}

}

می توان درون متد onHandleIntent از Instance ID API برای تولید و یا واکشی توکن رجیستریشن استفاده کرد. اول از همه یک نمونه اولیه از کلاس InstanceID ساخته و متد getInstance آن را به کار ببرید.

InstanceID myID = InstanceID.getInstance(this);

در این مرحله می توان از متد getToken مربوط به آبجکت InstanceID برای دریافت توکن رجیستریشن به صورت string استفاده کرد. ID فرستنده به عنوان یکی از آرگومنت های getToken استفاده می شود و از آنجایی که فایل google-services.json را به پروژه افزوده ایم، می توانیم با استفاده از R.string.gcm_defaultSenderID، آی دی فرستنده را برای متد مذکور ارسال نماییم.

String registrationToken = myID.getToken(

getString(R.string.gcm_defaultSenderId),

GoogleCloudMessaging.INSTANCE_ID_SCOPE,

null

);

چنانچه برای دیباگ نیازمند مشاهده محتوای رجیستریشن هستید، می توانید با کمک متد log.d پیام دیباگی از آن را دریافت نمایید.

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

در این مرحله قادر به ارسال توکن رجیستریشن به وب سرور و ذخیره سازی آن در پایگاه داده هستید، اما اگر کاربران به صورت شخصی مورد نظر شما نیستند، الزامی برای این کار وجود ندارد. چنانچه مایل به ارسال پیامی مشابه به تمامی کاربران هستید، باید از رویکرد publishe-subscribe استفاده کنید.

در ادامه نحوه عضویت در یک topic به نام my_little_topic نشان داده می شود، این کار تنها به دو خط کد نیاز دارد، اول از همه با استفاده از متد getInstance یک نمونه جدید از کلاس GcmPubSub بسازید و در ادامه متد subscribe آن را صدا بزنید و توکن رجیستریشن را به همراه نام تاپیک برای آن ارسال کنید.

GcmPubSub subscription = GcmPubSub.getInstance(this);

subscription.subscribe(registrationToken, "/topics/my_little_topic", null);

در این مرحله اپلیکیشن قادر به دریافت تمامی پوش نوتیفیکیشن ها منتشر شده برای my_liitle_topic می باشد. در آخر لازم است سرویس را در AndroidManifest.xml تعریف کنید.

<service android:name=".RegistrationService"

android:exported="false" />

سرویس رجیستریشن کامل شده است.

گام 2: ساخت یک InstanceIDListenerService

توکن های رجیستریشن به طور دوره ای بازنشانی می شوند، در نتیجه هر اپلیکیشن اندرویدی که از GCM استفاده می کند به یک InstanceIDListenerService جهت مدیریت این بازنشانی ها نیاز دارد. یک فایل جدید جاوا با نام TokenRefreshListenerService.java ساخته و آن را زیر کلاس InstanceIDListenetService نمایید. در داخل متد onTokenRefresh از کلاس، تنها کار لازم شروع فرآیند رجیستریشن با شروع سرویس رجیستریشن و با استفاده از Intent و متد StartService می باشد.

کد زیر را به TokenRefreshListenerService.java اضافه کنید:

public class TokenRefreshListenerService extends InstanceIDListenerService {

@Override

public void onTokenRefresh() {

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

startService(i);

}

}

لازم است این سرویس قادر به پاسخ گویی به اکشن com.google.android.gms.iid.InstanceID باشد، از این رو هنگام تعریف سرویس در AndroidManifest.xml باید intent-filter مناسب را نیز بیفزایید.

<service

android:name=".TokenRefreshListenerService"

android:exported="false">

<intent-filter>

<action android:name="com.google.android.gms.iid.InstanceID" />

</intent-filter>

</service>

گام 3: شروع سرویس رجیستریشن

جهت کسب اطمینان از آغاز فرآیند رجیستریشن به محض شروع اپلیکیشن، باید کلاس RegistrationService در داخل متد onCreate از MainActivity را شروع کنید. برای این کار برای آن یک Intent ساخته و متد startService را به کار ببرید.

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

startService(i);

4. نمایش پوش نوتیفیکیشن ها

GCM به طور خودکار به محض دریافت پوش نوتیفیکیشن، آنها را در بخش نوتیفیکیشن ها به نمایش در می آورد، این عملکرد تنها در صورتی است که اپلیکیشن یک GCMListenerSevice را در بر گرفته باشد.

یک کلاس جاوای جدید به نام NotificationListenerService ساخته و آن را زیر کلاس GCMListenerService نمایید. تنها در صورتی که خود تمایل به مدیریت داده های پوش شده داشته باشید، نیاز به نوشتن کد خواهید داشت، در غیر این صورت لازم نیست هیچ کدی را در کلاس بنویسید. در این مرحله کلاس خالی گذاشته می شود.

public class NotificationsListenerService extends GcmListenerService {

}

در زمان تعریف سرویس در AndroidManifest.xml مطمئن شوید که یک intent-filter را که به اکشن com.google.android.c2dm.intent.RECIVE واکنش نشان می دهد، افزوده اید.

<service

android:name=".NotificationsListenerService"

android:exported="false" >

<intent-filter>

<action android:name="com.google.android.c2dm.intent.RECEIVE" />

</intent-filter>

</service>

5. افزودن آیکون های پوش نوتیفیکیشن ها

هر پوش نوتیفیکیشن باید دارای آیکونی مطابق با خود باشد، چنانچه آیکون مناسبی ندارید می توانید از Material Design Icons Library گوگل استفاده کنید.

blog_17184_6

پس از دانلود آیکون آن را درون پوشه res از پروژه قرار دهید، در اینجا از آیکون ic_cloud_whitte_48dp استفاده شده است.

6. اجرای اپلیکیشن اندروید

اپلیکیشن اندروید در این مرحله کامل شده و با کامپایل و اجرای آن بر روی گوشی اندروید تمامی توکن های رجیستریشن در logcat به نمایش در می آیند.

blog_17184_7

از دکمه بازگشت برای خروج از اپلیکیشن استفاده کنید، از آنجا که GCM نوتفیکیشن ها را به طور خودکار در زمانی که کاربر از اپلیکیشن استفاده نمی کند، نمایش می دهد، با بستن اپلیکیشن از نمایش صحیح آنها اطمینان حاصل می شود. چنانچه مایلید تا در حین استفاده از اپلیکیشن نیز نوتیفیکیشن ها نمایش داده شوند، باید نوتیفیکیشن های خود را در داخل NotificationListenerService و با استفاده از کلاس Notification.Builder بسازید.

در ادامه نحوه ساخت یک اسکریپت پایتون جهت ارسال نوتیفیکیشن آموزش داده می شود.

http://code.tutsplus.com برگرفته از

اینها را هم بخوانید