آموزش پیاده‌سازی Shared Element در اندروید

استاندارد

در اپلیکیشن‌های اندرویدی ، به صورت پیش‌فرض حرکت بین Activity یا Fragment هامون دارای انیمیشن ورود و خروج هستن . این انیمیشن‌ها شامل انیمیشن‌های پیشفرضی مثل fade in ، slide یا explode هست ، همینطور علاوه بر اینها ، شما میتونید از انیمیشن‌های دلخواه خودتون که ساختین استفاده کنید .
حالا گاهی پیش میاد که بین Activity یا Fragment هایی که قراره بین اونها حرکت کنیم کامپننت‌های گرافیکی مشابهی وجود داشته باشه . توی این حالت میتونیم با استفاده از Shared Element ، در حین حرکت بین دو activity (یا fragment) این کامپننت‌ها رو نگه داریم و فقط اونها رو از موقعیتی که در activiy (یا fragment) اول حضور دارن به موقعیت جدیدشون در activity (یا fragment) دوم منتقل کنیم . مثل زیر .

sharedelementgif

نکته : Shared Element فقط در اندروید ۵ ( api ۲۱) و بالاتر از اون پشتیبانی میشه .

حالا میریم سراغ سناریو مثالی که ما میخوایم اون رو پیاده‌سازی کنیم .  فرض کنید دوتا activity داریم ، activiy اول شامل یک لوگو با اندازه بزرگ در وسط صفحه‌ ، که نقش صفحه اسپلش رو برای ما بازی میکنه و activity دوم صفحه ثبت‌نام اپلیکیشن هست که باز هم شامل همون لوگو هست اما در اندازه کوچک‌تر . ما قراره با باز کردن اپلیکیشن با دیدن actitiy اسپلش ، بعد از ۲ ثانیه وارد activity ثبت‌نام بشیم . در حرکت بین این دو صفحه قراره لوگوی ما ( ImageView) از وسط صفحه‌ اسپلش با استفاده از Shared Element به جای جدیدش در activity ثبت‌نام منتقل بشه . دقیقا مثل روندی که کمی بالاتر در تصویر دیدیم . به خواندن ادامه دهید

ارسال نوتیفیکیشن از طریق فایربیس با مثال

استاندارد

تو پست قبل درباره امکانات فایربیس کمی توضیح دادم ، حالا وقتشه با هم ببینیم چطور میتونیم از این قاببلیت‌های باحال توی پروژه‌هامون استفاده کنیم . در ادامه باهم خواهیم دید که چطور میتونیم به ساده‌ترین شکل ممکن از فایربیس برای ارسال نوتیفیکیشن به کاربرانمون استفاده کنیم .
بیاید اول با هم روند انجام کار رو برسی کنیم . اولین مرحله ثبت‌نام در فایربیس و ثبت پروژه‌مون داخل پنلش هست . در مرحله بعد یک پروژه خواهیم ساخت و با استفاده از کتابخونه‌های فایربیس کلاسی برای دریافت Token و همینطور کلاسی برای دریافت نوتیفیکیشن‌ها و نمایش اون‌ها خواهیم ساخت . این کلاس دو مدل نوتیفیکیشن رو نمایش خواهد داد . مدل اول مدل ساده که فقط شامل یک متن و یک توضیح هست و مدل دوم که شامل یک لینک هست .  درصورتی که اپلیکیشن در حال اجرا و در حالت foreground بود با کلیک بر روی نوتیفیکیشن لینکی که ما مد نظرمون بوده باز خواهد شد اما اگر برنامه بسته بود یا در background بود با کلیک روی نتیفیکیشن activity اصلی پروژه باز شده و لینک مورد نظر نمایش داده میشه . و بعد از انجام تمام این مراحل میریم سراغ پنل فایربیس و شروع میکنیم به ارسال نوتیفیکیشن .
متاستفانه در نسخه کنونی فایربیس ، در ارسال نوتیفیکیشن از طریق پنل این مشکل وجود داره که وقتی اپلیکیشن شما درحالت اجرا و foreground نیست شما امکان تغیر و شخصی سازی نوتیفیکیشن نمایش داده شده رو ندارید . در این حالت نوتیفیکیشن توسط کلاس‌های خود فایربیس ساخته خواهد شد و دیگر اطلاعات ارسال شده همراه نوتیفیکیشن از طریق activity ای که از طریق کلیک بر روی نوتیفیکیشن باز خواهد شد قابل دسترسی هست .

مرحله اول

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

بعد از این مرحله و کلیک رو دکمه ADD APP ، فایلی با فرمت json به اسم google-services شروع به دانلود میشه . این فایل شامل اطلاعاتی از اپلیکیشنتون هست که کتابخونه فایربیس به اونها احتیاج داره . به خواندن ادامه دهید

معرفی و برسی امکانات فایربیس

استاندارد

یکی از جذاب‌ترین اتفاقات امسال رو میشه خریده شدن فایربیس توسط گوگل دونست . چیزی که باعث شد این سرویس خوب حالا اعتبار خوبی هم پیدا کنه . معرفی فایربیس در Google I/O امسال تاثیر خیلی زیادی در محبوبیت و شناخته شدن اون بین دولوپرها داشت .
فایربیس رو میشه شبیه به سرویس‌های قدیمی‌تری مثل Parse دونست اما با امکاناتی خیلی خیلی بیشتر . فایربیس امکان این رو به ما میده که بتونیم بدون صرف زمان و هزینه کارهایی که انجام اونها نیاز به server side داره رو بدون نیاز به server side انجام بدیم . همنطور خیلی از کارها رو که سرویس دهنده‌های مختلف در اختیار ما میگذاشتن رو به صورت یک پارچه دراورده .
در ادامه امکانات و سرویس‌های فایربیس رو بصورت مختصر و کوتاه برسی میکنیم .

فایربیس چه امکاناتی رو به ما میده ؟

  • امکان آنالیز اپلیکیشن و مشاهده گزارشات از طریق پنل  ( چیزی شبیه به گوگل آنالیتیک )
  • ارسال نوتیفیکیشن بدون نیاز به سرور و پنل برای مدیریت نوتیفیکیشن‌های ارسالی .
  •  ذخیره اطلاعات اپلیکیشن در دیتابیس (NoSql) ابری فایربیس به راحتی و دسترسی به اون‌ها حتی در شرایط offline .
  • استفاده از FireBase Strorage که امکان اپلود و دانلود فایل‌ها رو بصورت امن به شما میده . این سرویس از بک اند Google Cloud Storage برای این کار استفاده میکنند .
  • هاستیگ برای توسعه وب اپلیکیشن‌ و …
  • امکان تغییر در عملکرد و ظاهر اپلیکیشن بدون نیاز به بروزرسانی . در این روش فایربیس امکان ذخیره کردن فیلدهایی رو با عنوان default value در سمت سرور به شما میده که شما میتونید با این فیلدها نوع عملکرد و ظاهر اپلیکیشن رو برای کاربرانتون مشخص کنید ، همچنین فایربیس امکان تغییر این فیلدها از طریق پنل رو به شما میده .
  • Test Lab که به وسیله اون میشه اپلیکیشن رو با حجم زیادی از دستگاه‌های اندرویدی تست کرد (‌ امکان استفاده از این سرویس در نسخه مجانی وجود نداره ) .
  • جمع آوری خطاهای رخ داده و مشاهده اون‌ها ( Crash Reporting ) .این سرویس خطا‌ها رو به همراه جزییات اونها‌ در اختیار شما قرار میده و میتونید اون‌ها رو در پنل فایربیس مورد برسی قرار بدید ( این سرویس فعلا دو مرحله beta ست ).
  • امکان پیاده‌سازی ثبت نام و ورود از طریق سرویس‌های آماده فایربیس . این سرویس به شما امکان ورود و ثبت‌نام از طریق روش‌های مختلفی رو میده ، مثل ‌ایمیل و پسورد یا از طریق شبکه‌های اجتماعی همچون گوگل پلاس ، فیسبوک ، تویتتر و گیت‌هاب . با این سرویس شما میتونید کمترین نگرانی رو از بابت سرویس‌‌های سمت سرور و ذخیره‌سازی اطلاعات کاربر در سرور رو داشته باشید و بیشتر وقتتون رو بر روی پیاده سازی رابط کاربری و بخش‌های دیگه اپلیکیشنتون متمرکز کنید .
  • app indexing ، به وسیله این سرویس شما میتونید کاری کنید که اپلیکیشنتون در داخل جستجو‌های گوگل نمایش داده بشه .
  • Dynamic like ، با این قابلیت شما میتونید لینک‌هایی رو برای اپلیکیشنتون آماده کنید که در باز شدن  عملکردی مثل باز کردن یک صفحه خواست از اپلیکیشن رو انجام بدند و همچنین میتونید متوجه بشین که آیا صفحه مورد نظر از طریق dynamic link باز شده یا نه و اگر شده عملیاتی متناسب رو انجام بدید .‌(‌ مثلا وقتی کسی از طریق لینکی که در شبکه اجتماعی براشون قرار دادید به صفحه ثبت نام میره و ثبت نام رو انجام میده ، بهش اعتبار هدیه بدید ) . همینطور درصورتی که کاربر اپلیکیشن شما رو نصب نداشت ، امکان این هست که صفحه مربوط به گوگل پلی یا اپ استور اپلیکیشنتون باز بشه .
  • همینطور فایربیس امکاناتی برای راحت قرار دادن تبلیغات درون برنامه‌ای برای اپلیکیشن‌ها در اختیار شما قرار میده .

در توصیحات بالا سعی بر این بود که مختصر توضیحی راجع‌به تمام سرویس‌ها داده بشه .
در پست‌های آینده سعی میکنم هر کدوم از این سرویس‌ها بصورت جداگانه همراه با مثال برسی کنیم.

وقتی پسورد keystore اپلیکیشن رو فراموش کردیم !

استاندارد

یکی از بدترین اتفاقاتی که میتونه برای یک توسعه‌دهنده اندروید بیوفته ، فراموش کردن اطلاعات مربوط به sign اپلیکیشنه .
چرا ؟‌ چون بدون داشتن این اطلاعات باید فکر بروزرسانی کردن اپلیکیشنتون روی مارکت‌ها رو از سرتون بیرون کنید . منظور از بروزرسانی ، امکان نصب نسخه جدید به روی نسخه قدیمی بدون بوجود اومدن خطا در حین این کاره . یعنی کاربرتون به‌راحتی بدون نیاز به پاک کردن نسخه قدیمی نسخه جدید اپلیکیشنتون رو نصب کنه .
حالا چه اتفاقی میوفته اگه نسخه جدید اپلیکیشنمون رو با اطلاعاتی متفاوت از چیزی که نسخه‌‌های قبلی رو با اون sign کردیم sign کنیم ؟‌ تو این حالت اگه کاربرمون بخواد نسخه جدید رو نصب کنه به error زیر بر میخوره ( یا یه همچین چیزی ) .
photo_2016-06-21_11-07-06
در این حالت تنها کاری که کاربر میتونه برای نصب نسخه جدید انجام بده ، حذف نسخه قدیمی و بعد از اون نصب نسخه جدیده (که با این کار کاربرتون اطلاعات درون اپلیکشن رو از دست میده ).
خب حالا اگه این اتفاق بیوفته چیکار میتونیم بکنیم ؟
اول از همه اگه فایل keyStore تون رو گم کردین متاسفانه راهی براتون نمیمونه جز اینکه بیخیال بروزرسانی کردن نسخه قدیمی اپلیکیشنتون بدون حذف کردنش بشید .
ولی اگه فایل keyStore تون رو گم نکردید و فقط پسورد اون رو به خاطر نمیارید ، هنوز جای امیدواری هست .     به خواندن ادامه دهید

گرفتن دسترسی‌ها در زمان اجرا برای اندروید ۶

استاندارد

همونطور که احتمالا میدونید گوگل توی اندروید۶ یک مفهوم به اسم Runtime Premissoin یا گرفتن دسترسی در زمان اجرا رو معرفی کرد. که به نظر خیلی‌ها یکی از بهترین تغییرات در زمینه بالا بردن حس امنیت توی کاربرا بوده و قطعا میشه از اون به عنوان یه امکان بسیار خوب برای کاربرای نهایی اپلیکیشن‌ها نام برد . ولی خب همیشه قرار نیست هر تغییری برای همه خوشایند باشه ، و اینجا این موضوع برای دولوپرهایی که توی اپلیکیشن‌شون جاهای زیادی نیاز به گرفتن دسترسی دارند و میخوان از این مفهوم استفاده کنن، خیلی خوشایند نیست.

چه زمانی نیاز به دریافت دسترسی در زمان اجرا خواهیم داشت :

Permission‌های موجود در اندروید به دو دسته تقسیم میشند . دسته اول Normal Permission یا دسترسی‌های معمولی و غیر حیاتی مثل دسترسی به انترنت ( android.permission.INTERNET  ) که برای استفاده از اون‌ها فقط کافی مثل قبل و همونطور که توی کد بالا میبینید دسترسیتون رو داخل AndroidManifest بنویسید و بدون نیاز به گرفتن دوباره اون از کاربر در زمان اجرا ازش استفاده کنید .

دسته دوم Dangerous Permission یا دسترسی‌های خطرناک و حیاتی هستند مثل دسترسی نوشتن بر روی کارت حافظه و یا خوندن دفترچه تلفن که برای استفاده از این نوع دسترسی‌ها هم باید اون‌ها رو مثل دسترسی‌های معمولی داخل AndroidManifest قرار بدین ، هم در زمان اجرا از کاربران برای استفاده از این دسترسی اجازه بگیرید . اینجا میتونید لیستی از دسترسی‌ها و نوع اونها رو ببینید .

چطوری گرفتن دسترسی در زمان اجرا رو پیاده‌سازی کنیم :

 

device-2016-04-04-161253-1
معمولا وقتی اقدام به پرسیدن و گرفتن یک دسترسی از کاربر میکنم که بخوایم از اون استفاده کنیم . مثلا اگه بخوایم بر روی حافظه گوشی چیزی بنویسیم بهتره درست قبل از اینکه این کار رو بکنیم از کاربرمون این دسترسی رو بگیریم، که کاربرمون هم بتونه متوجه بشه که این دسترسی رو مشخصا برای انجام چه کاری قراره بده . کد زیر روند چک کردن دسترسی و در صورت موجود نبودن، اقدام به گرفتنش رو نشون میده .

توی کد بالا اول چک میکنیم و میبینیم اگه دسترسی نوشتن روی حافظه رو داشتیم تابع ()myPermissionNeededMethod رو که نیاز به این دسترسی داره رو اجرا میکنیم ، و اگر این دسترسی رو نداشتیم request ای میدیم تا کاربر بتونه دسترسی مورد نیازمون رو بهمون بده. حالا باید به یه طریقی بتونیم بفهمیم که آیا کاربرمون دسترسی که میخواستیم رو بهمون داده یا نه . این کار رو از طریق override کردن تابع ()onRequestPermissionResult توی Activity یا Fragment مون میکنیم .

توی کد زیر اول چک میکنیم که اگه کاربر دسترسی مورد نظرمون رو به ما داده بود ، تابع ()myPermissionNeededMethod که نیاز به این دسترسی داشت رو اجرا میکنیم و اگر کاربر این دسترسی رو به ما نداده بود میتونیم متناسب با کاری که قرار بود اجرا بشه پیامی به کاربر نشون بدیم و اقدام‌های لازم رو انجام بدیم .

نکته مهم : این نوع دریافت دسترسی فقط و فقط زمانی لازم میشه که اپلیکیشن شما SDK هدفش ۲۳ باشه (targetSdkVersion 23 ) و کابر شما اندروید ۶ یا بالاتر روی گوشیش داشته باشه .