خانه » لایبرری های مفید و تجربیات شخصی خیلی مفید !!! » Push notification چیست ؟ و روش استفاده چگونه است

Push notification چیست ؟ و روش استفاده چگونه است

این مقاله درمورد push notification و کاربرد آن می باشد که توسط مهدی ملکی در انجمن برنامه نویسی اندروید گذاشته شده بود که مناسب دیدم بر روی وبلاگ قرار بدهم .

تحلیل performance  و security ی یکی از api های گوگل به نام push notification برای گوشی های اندرویدی. 

push notification سرویسی است که گوگل برای ارتباط راحت و کم هزینه بین سرور و کلاینت های اندرویدی فراهم کرده است. از این سرویس می توان برای سینک کردن، اعمال تغییرات آنی روی کلاینت، چت سرور و… استفاده کرد.

 

مقدمه ای بر ( اعمال تغییرات آنی بین سرور و کلاینت )

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

برای اینکه سرور بتواند کلاینت هارا به محض اضافه شدن محصول جدید با خبر کند ، سه روش وحود دارد.

در زیر این سه روش را می بینیم و مزایا و معایب هر کدام را بررسی می کنیم و در نهایت روش سوم که بهترین و کم هزینه ترین روش است را انتخاب می کنیم .

 

۱ – ارتباط مداوم کلاینت سرور

در این روش کلاینت برای این که از آخرین تغییراتی که در سرور اتفاق افتاده و مرتبط با آن است مطلع شود باید در یک بازه زمانی مشخص به سرور درخواست بفرستد. (request) :

   برای مثال هریک یا دو دقیقه یک بار به سرور درخواست بفرستد و سرور نیز شرایط فعلی کلاینت را بررسی کند و به آن جواب بدهد (response) که آیا محصول جدیدی اضافه شده یا نه.

عیب این روش این است که ممکت است برای ساعت ها محصولی به دیتابیس اضافه نشود و با ارسال درخواست های مکرر پروسس (process) اضافی در سرور داشته باشیم یا حتی ممکن است بعضی اوقات بخواهیم بازه ی زمانی ارسال درخواست را کاهش یا افزایش دهیم که این روش از کارایی و سرعت سرور ما می کاهد.

 

۲ – برقراری socket با سرور

در این روش کلاینت یک سوکت (Soket) با سرور برقرار می کند و سرور هر وقت تغییری در محصولاتش اتفاق بیفتد که نیاز باشد کلاینت از آن مطلع گردد ، به آن اطلاع می دهد . اگر تغییری (مثلا اضافه شدن یک محصول به فروشگاه) اتفاق بیفتد آنگاه سرور جزییات آن محصول را برای کلاینت ارسال می کند تا او از آن مطلع شود. این ارتباط مادامی که کلاینت به اینترنت وصل باشده حفظ می شود.

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

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

(در آینده سرویس پوشر Pusher را معرفی می کنم که برای این کار مناسب است)

 

۳ – روش push Notification

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

در اندروید امکان استفاده از یکی از Api های گوگل به نام Google Cloud Messaging یا همان GCM فراهم شده است. GCM سرویسی است که به ما امکان ارسال اطلاعاتی را از سرور به کلاینت (در اینجا دیوایس های اندرویدی) می دهد. همچنین می توانیم اطلاعاتی را از کلاینت دریافت کنیم.

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

در این روش

۱- ابتدا device اندرویدی sender ID و application ID را برای ثبت نام به سرور GCM ارسال می کند .

۲ –  اگر این عملیات با موفقیت انجام شد ، آنگاه GCM به آن Device یک registration ID می دهد.

۳ – سپس device این کد را برای سرور ما ارسال می کن.

۴ – سرور این شناسه را در دیتابیس خود ذخیره می کند تا هروقت نیاز به ارسال اطلاعاتی به device بود از آن استفاده کند.

برای مثال اگر در سیستم فروشگاهی محصولی اضافه شود، آنگاه سرور این تغییر را از طریق GCM به کلاینت هایی که می خواهد ارسال می کند ، به این صورت که سرور یک پیام حاوی registration ID  و متن پیام به GCM ارسال می کند ، سپس GCM با ارسال یک Notification به کلاینت ، device را از وجود این تغییرات مطلع می سازد .

GCM برای تحویل دادن پیام به کلاینت نیاز به یک Broadcast Receiver در device دارد تا در صورت رسیدن پیام جدید آن را به اپلیکیشن ما بدهد. (Broadcast Receiver همیشه پیام هارا دریافت می کند حتی اگر اپلیکیشن destroy شده باشد)

در GCM پیام ها باید حداکثر دارای حجم ۴KB باشند. اگر بخواهیم دیتایی را به کلاینت منتقل کنیم که حجم آن از این مقدار بیشتر باشد (مثل یک عکس یا فایل) می توانیم url آن را از طریق پیام به کلاینت ارسال کنیم و به محض دریافت پیام توسط Broadcast Receiver سرویسی را اجرا کنیم تا با استفاده از url عکس یا فایل را از سرور بگیرد.

 

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

از لحاظ امنیتی نیز این روش مناسب است زیرا می توان بین سرور و کلاینت session ایجاد کرد تا پیام هایی که به صورت غیر مستقیم توسط سرور برای کلاینت فرستاده می شوند فقط توسط کلاینت قابل استفاده باشند.

از این روش می توان برای هماهنگ کردن دیتابیس کلاینت با سرور ، اعمال تغییرات آنی ، چت سرور و … استفاده کرد.

 

منبع :

http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/

نویسنده : مهدی ملکی

 

(یک سایت خارجی که این امکان رو به راحتی در دسترس قرار می دهد : www.parse.com می باشد )

 

صفحه اصلی آموزش : آموزش برنامه نویسی اندروید
برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

10 دیدگاه

  1. با سلام
    بخشید که ابن جا سوال می کنم یه چند تا سوال دارم ، اگه می شود جواب بدهید .ممنونم
    ۱- این API چیست و ورژن اندروید چیست و نام ها(kit kat و دونالت و . . .) چیست؟ آیا رابطه منطقی دارند؟ api ها یکی یکی بالا می روند ؟ ورژن ها چی ؟
    ۲- از کجا بفهمیم کدام گوشی کدام API ، کدام ورژن را ساپورت می کند؟
    ۳- به نظر شما با چه ورژنی و چهapi کد بنویسیم که روی اکثر گوشی ها اجرا بشود،مردم ایران بیشتر از چه گوشی هایی و چه api و چه ورژنی استفاده می کنند؟ ( من در حال حاضر کتاب مرجع کاربردی برنامه نویسی اندروید که مترجم آقای آرمان اسد سنگابی است رو می خونم که اندروی ۴٫۴ kitkat رو درس میدهد)
    ۴- این شبیه سازی که من ساختم ، خیلی کنده، از چه تنظیماتی (ram.cpu.hard و . . . ) استفاده کنم که مثل دستگاه واقعی بشود (لطفا اگر می شود یک کانفیگ بگویید که من با آن شبیه ساز را درست کنم که روان باشد)
    ۵- در شبیه ساز از کجا متوجه بشویم که دستگاه شبیه سازی شده وبیره می زند(مثال: در کدها ما notification را با ویبره داریم اما در دستگاه شبیه سازی شده چیزی نشان داده نمی شود ، همچنین انگار شبیه ساز صدا ندارد)
    ۶- از کجا بفهمیم که شتاب سنج بر روی شبیه ساز است؟ و همچنین شبیه ساز قطب نما و برعکس.
    ۷- چطور می شود یک فایل از روی کامپیوتر بر روی شبیه ساز ریخت و برعکس.
    ۸- وقتی برنامه بر روی دستگاه شبیه ساز نصب شد ، چطور می شود به روت فایل ها و نرم افزار رفت (مثلا عکس هایی که در پوشه drawable است کجای گوشی هستند)و همچنین این فایل دیتا بیس که مثلا در کد تولید می کنیم در کجای هارد گوشی است.
    ۹- چطور می شود نرم افزار را همزمان بر روی ۳ تا گوشی مثلا یکی سایز صفحه بزرگ باشد یکی کوچک و یکی متوسط( من شنیدم که گوگل یک نرم افزار داره که همزمان می شود بر روی ۳ ، ۴ تا رندر کرد)
    ۱۰- من دستور printf جاوا مثلا یک نوشته چاپ می کنم، این نوشته در کدام پنجره اکلیپس چاپ می شود؟
    ۱۱- من فیلد برنامه نویسی اصلی که کار می کنم ، فلش و ایر است ، آیا می شود فایل های خروجی (مثلا swf یا ایر و یا حتی کدهای )action scripte 3 رو در پروژه استفاده کرد. من دوست ندارم با ایر پلیر یا فلش پلیر که بر روی موبایل نصب کنم .منظورم این است که مثلا یک فایل swf رو در قسمت منابع بگذارم و در پروژه استفاده کنم و یا همانطور که کد های html رو در نرم افزار رندر می کنیم کد های فلش رو نیز رندر کنیم.
    با تشکر قبلی از تمام اساتید که با صبر و دقت جواب سوالات من رو می دهند.با سلام
    من تازه شروع به یاد گرفتن اندروید کرده ام، محیط برنامه نویسی من اکلیپس است.
    یه چند سوالی در مورد شبیه ساز دارم و دیگر گزینه ها ،لطفا اساتید کمک کنید.
    ۱- این API چیست و ورژن اندروید چیست و نام ها(kit kat و دونالت و . . .) چیست؟ آیا رابطه منطقی دارند؟ api ها یکی یکی بالا می روند ؟ ورژن ها چی ؟
    ۲- از کجا بفهمیم کدام گوشی کدام API ، کدام ورژن را ساپورت می کند؟
    ۳- به نظر شما با چه ورژنی و چهapi کد بنویسیم که روی اکثر گوشی ها اجرا بشود،مردم ایران بیشتر از چه گوشی هایی و چه api و چه ورژنی استفاده می کنند؟ ( من در حال حاضر کتاب مرجع کاربردی برنامه نویسی اندروید که مترجم آقای آرمان اسد سنگابی است رو می خونم که اندروی ۴٫۴ kitkat رو درس میدهد)
    ۴- این شبیه سازی که من ساختم ، خیلی کنده، از چه تنظیماتی (ram.cpu.hard و . . . ) استفاده کنم که مثل دستگاه واقعی بشود (لطفا اگر می شود یک کانفیگ بگویید که من با آن شبیه ساز را درست کنم که روان باشد)
    ۵- در شبیه ساز از کجا متوجه بشویم که دستگاه شبیه سازی شده وبیره می زند(مثال: در کدها ما notification را با ویبره داریم اما در دستگاه شبیه سازی شده چیزی نشان داده نمی شود ، همچنین انگار شبیه ساز صدا ندارد)
    ۶- از کجا بفهمیم که شتاب سنج بر روی شبیه ساز است؟ و همچنین شبیه ساز قطب نما و برعکس.
    ۷- چطور می شود یک فایل از روی کامپیوتر بر روی شبیه ساز ریخت و برعکس.
    ۸- وقتی برنامه بر روی دستگاه شبیه ساز نصب شد ، چطور می شود به روت فایل ها و نرم افزار رفت (مثلا عکس هایی که در پوشه drawable است کجای گوشی هستند)و همچنین این فایل دیتا بیس که مثلا در کد تولید می کنیم در کجای هارد گوشی است.
    ۹- چطور می شود نرم افزار را همزمان بر روی ۳ تا گوشی مثلا یکی سایز صفحه بزرگ باشد یکی کوچک و یکی متوسط( من شنیدم که گوگل یک نرم افزار داره که همزمان می شود بر روی ۳ ، ۴ تا رندر کرد)
    ۱۰- من دستور printf جاوا مثلا یک نوشته چاپ می کنم، این نوشته در کدام پنجره اکلیپس چاپ می شود؟
    ۱۱- من فیلد برنامه نویسی اصلی که کار می کنم ، فلش و ایر است ، آیا می شود فایل های خروجی (مثلا swf یا ایر و یا حتی کدهای )action scripte 3 رو در پروژه استفاده کرد. من دوست ندارم با ایر پلیر یا فلش پلیر که بر روی موبایل نصب کنم .منظورم این است که مثلا یک فایل swf رو در قسمت منابع بگذارم و در پروژه استفاده کنم و یا همانطور که کد های html رو در نرم افزار رندر می کنیم کد های فلش رو نیز رندر کنیم.
    با تشکر قبلی از شما که با صبر و دقت جواب سوالات من رو می دهند.

    • سلام ،
      ۱ – api همان کد نسخه های اندروید هست که هر کدام اسم خاصی دارند مثل kitKat یا … ، بله api ها یکی

      یکی بالا می روند که همان نسخه های اندروید هستند . ( نسخه api شماره integer ورژن برنامه هست که

      هر شماره یکی اضافه می شود ولی نسخه نمایشی مثل ۴٫۴ یا ۴٫۱ نسخه String می باشد).

      ۲ – هر گوشی یک نسخه خاصی از اندروید را دارد که آن نسخه یک عدد api دارد (می توانید جستجو کنید)

      مثلا api 19 برای اندروید ۴٫۴ یا kitkat می باشد.

      ۳ – اکثرا گوشی های داخلی اندروید ۲٫۳ به بالا (یعنی نسخه api 9) یا همون Gingerbread هستند.

      ۴ ۵ ۶- من مدت زیادی هست که از شبیه ساز Genymotion استفاده می کنم به شما هم پیشنهاد می کنم از اون

      استفاده کنید ، خیلی سریع هست.(http://www.genymotion.com/)

      ۷ – زمان استفاده ای Genymotion با درگ کردن فایل ها می توانید به راحتی برروی شبیه ساز فایلی را بریزید.

      ۸ – با برنامه DDMS که داخل sdk می باشد میتونید این کار رو بکنید.

      ۹ – فکر می کنم منظور شما android studio هست ، اون برنامه هنوز Beta هست و نسخه کامل اون منتشر نشده(در حال حاضر من از IntelliJ IDEA استفاده می کنم).

      ۱۰ – در logcat در اندروید بهتر است از Log استفاده کنید که به همین منظور ساخته شده (Lod.d(“TAG”,”string); )

      ۱۱ – دقیقا از این موضوع اطلاعی ندارم ولی ممکنه بتونید فایل فلش رو در webView اجرا کنید.

  2. ببخشید که زیاد سوال می کنم
    ۱- این کلاس support چیست؟ من جاهایی دیدم که مثلا گرید ویو حداقل API 14 می خواهد و یا search 11 می خواهد .از کجا بفهمیم که کدام API کدام کد و با ویجت را پشتیبانی نمی کند و از کدام support استفاده کنیم؟ اگه می شود یه مثالی از نحوه استفاده آن را بگویید.
    ۲- در ایران از کدام ورژن از اندروید ها بیشتر استفاده می شود؟ من نفهمیدم که با کدام ورژن برنامه نویسی کنم و حداقل API را رو چند بنویسم.
    ۳- کدام API فارسی رو ساپورت نمی کند و راه حل چیست؟
    ۴- از کجا بفهمیم که الان روی چه API نرم افزار اجرا شده است؟
    ۵- بهترین راه آپ دیت نرم افزار چیست؟ آیا کاربر نرم افزار را حذف کند و دوباره نصب کند و یا راه حل دیگر است؟ آیا به کاربر هشدار بدهم که نرم افراز جدید انتشار پیدا کرده است و بگم دانلود کنه و حذف کنه یا راه حلی دیگر است.مثلا یک لودینگ بذارم و فایل رو دانلود کنم و کد های جدید و دیتا بیس را جاگیزین کنم ؟آبا چنین روشی است؟ آیا می شود که کاربر را هشدار بدهیم و بعد جایگزین کنیم و نرم افزار را ریستار کنیم؟
    ۶- از کجا بفهم که نرم افزار الان چقدر رم و باتری و cpu مصرف می کند، یه ابزاری شبیه task maneger ویندوز نیست؟

  3. با سلام
    اگه ممکنه آموزش کامل پوش نوتیفیکیشن از طریق Google Cloud Messaging رو آموزش بدید
    با تشکر

  4. با سلام و تشکر از مطالب ارزنده تون
    مثال عملی از push ntification دارید تو انبوهی از مطالب آدم گم میشه

  5. سلام جناب عابدینی باید باهاتون صحبت کنم به کمکتون نیاز دارم لطفا شماره تماستون رو واسم ایمیل کنید

    ممنون میشم

  6. سلام

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

    ممنون

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا