Closed farzin680 closed 6 years ago
احتمالن شما متد مقداردهی چابک رو جای مناسبی نگذاشتید که در همه حالت ها که برنامه باز میشه به موقع فراخوانی بشه
با سلام مجدد ،
این متد رو در کلاس اپلیکیشن قرار داده ایم. فکر میکنین اونجا جای نا مناسبی باشه ؟
نه نباید مشکلی باشه یه نمونه کد یا توضیح بیشتر در مورد استفادتون بدید لطفن تا بتونیم مورد شما رو بررسی کنییم
@Husseinhj لطفن بررسی کنیم مشکل کد ایشون چیه
try
{
String phone = Prefs.getString("MOBILENUMBER", "0");
if ( phone.equals("0") == false )
{
try
{
activeCabok(this, getApplicationContext(), phone, myHandler);
chabok.addListener(this);
}
catch (Exception e)
{
}
}
}
catch (Exception e)
{
}
try
{
if (chabok != null)
{
chabok.addNotificationHandler(myHandler);
}
}
catch (Exception e)
{
}
public static void activeCabok(HelsaApp context, Context applicationContext, String phone,
NotificationHandler myHandler)
{
if (chabok == null)
{
try
{
chabok = AdpPushClient.init(
applicationContext,
Main.class,
"REMOVED FOR THE SECURITY REASON",
"REMOVED FOR THE SECURITY REASON",
"REMOVED FOR THE SECURITY REASON",
"REMOVED FOR THE SECURITY REASON"
);
chabok.setDevelopment(true);
chabok.register("hls" + phone , new String[]{"ANDROID"});
chabok.addTag(phone , context);
chabok.addTag("ANDROID" , context);
chabok.addTag(thisVersion , context);
}
catch (Exception e)
{
}
}
}
@farzin680 please put your code inside java formatter!
and this is no clear where have you put this code inside your app? in your onCreate? and where that crash is happening exactly?
Another un-related issue: there is no need to add phone, android, version tags! Chabok handles them itself !
Hmmm , Okay Please Find The Attachment.
And About Tags , Its Not My Opinion , Actually There are some backend staffs ( I don't know what exactly ) which need them by this format ...
Talk to your backend team, there's actually no need for those tags!
if ( phone.equals("0") == false )
may be this is happening for user's with no mobile number, Please make sure you always initialize chabok. But you can call register
method users number exists.
Well , Actually
if ( phone.equals("0") == false )
Is Always Not Null , because "phone" variable was set before. So It has "0" or Phone Number Inside.
با استفاده از متد getUserId
نام شناسه کاربر رو اگر رجیستر کرده باشین دریافت میکنن اگر این متد null
برگردوند باید کاربر رو به صفحه لاگین خودتون ببرین
من کدهای شما رو دیدم. نیازی نیست شما اطلاعات پایه کاربر رو تگ کنین و یا توی userId
بیارین :
public static AdpPushClient activeChabok(HelsaApp context, Context applicationContext, NotificationHandler myHandler) {
if (this.chabok == null) {
try {
this.chabok = AdpPushClient.init(
applicationContext,
Main.class,
"XXXX",
"XXXX",
"XXXX",
"XXXX" );
this.chabok.setDevelopment(true);
this.chabok.addListener(context);
this.chabok.addNotificationHandler(myHandler);
}
catch (Exception e)
{
}
}
}
@Override
public void onCreate() {
context = getApplicationContext();
appClass = HelsaApp.this;
try {
activeChabok(this, getApplicationContext(), myHandler);
if (this.chabok != null && this.chabok.getUserId() != null) {
his.chabok.register("hls" + this.chabok.getUserId());
} else {
//Navigate user to your login page.......... :-)
}
} catch (Exception e) {
}
}
این موضوع حل شده به نظر میرسه اگر مشکلی داشتید لطفن مطرح کنید و ایشو رو باز کنید
سلام ،
به نظر حل نشده و همچنان با کدی که راهنمایی کردید هم اون کرش اتفاق میفته. طبق آمار فابریک ، ۱۴۵۰ تا کرش در ۲۱۰۰ اجرا داشتیم.
فایلش رو هم اینجا میگذارم براتون com.parsdigit.helsa_issue_4_crash_5BC4288C03710001296CC66BFAD31F87_DNE_0_v2.txt
به نظر حل نشده و همچنان با کدی که راهنمایی کردید هم اون کرش اتفاق میفته.
دقت داشته باشید متد AdpPushClient.init
در کلاس Application
و متد OnCreate
حتما باید فراخوانی شود و نباید کدی مانع اجرا شدن متد فوق بشود.
حتما کد نسخه جدید پروژه استارتر رو مشاهده کنید
به نظر حل نشده و همچنان با کدی که راهنمایی کردید هم اون کرش اتفاق میفته.
دقت داشته باشید متد
AdpPushClient.init
در کلاسApplication
و متدOnCreate
حتما باید فراخوانی شود و نباید کدی مانع اجرا شدن متد فوق بشود.حتما کد نسخه جدید پروژه استارتر رو مشاهده کنید
بله متوجه هستم و در کلاس اپلیکیشن پیاده سازی و اجرا شده است.
بله متوجه هستم و در کلاس اپلیکیشن پیاده سازی و اجرا شده است.
همیشه و در همه حالات متد init
فراخوانی میشود؟
بله متوجه هستم و در کلاس اپلیکیشن پیاده سازی و اجرا شده است.
همیشه و در همه حالات متد
init
فراخوانی میشود؟
منظورتون اجرای اینیت در public static AdpPushClient activeChabok(HelsaApp context, Context applicationContext, NotificationHandler myHandler) هست ؟
در هر بار اجرای برنامه ؟
در هر بار اجرای برنامه ؟
در هر بار اجرا اپلیکیشن باید متد init
چابک فراخوانی بشه و از قرار دادن هر کدی که جلو اینکارو بگیره خودداری کنید.
این قسمت از کد استارتر رو مشاهده کنید.
با تشکر از شما.
مشکل برطرف شد اما مشکل جدیدی که پیش آمده است اینست که زمانی که برنامه باز و در فورگراند است ۲ نوتیفیکیشن می آید. یکبار از کد داخل برنامه و یکبار توسط
com.google.android.gms.gcm.GcmReceiver
مشکل برطرف شد اما مشکل جدیدی که پیش آمده است اینست که زمانی که برنامه باز و در فورگراند است ۲ نوتیفیکیشن می آید. یکبار از کد داخل برنامه و یکبار توسط
آیا شما روی پیام چابک به صورت کاستومایز اعلانی نمایش میدهید؟
همیشه این اتفاق رخ میدهد؟
مشکل برطرف شد اما مشکل جدیدی که پیش آمده است اینست که زمانی که برنامه باز و در فورگراند است ۲ نوتیفیکیشن می آید. یکبار از کد داخل برنامه و یکبار توسط
آیا شما روی پیام چابک به صورت کاستومایز اعلانی نمایش میدهید؟
همیشه این اتفاق رخ میدهد؟
بله همیشه این اتفاق رخ میدهد.
آیا شما روی پیام چابک به صورت کاستومایز اعلانی نمایش میدهید؟
لطفا جواب این سوال بند را هم بدهید.
بله همیشه این اتفاق رخ میدهد.
احتمالا شما اعلان را شخصیسازی کرده ولی پیشفرض نمایش اعلان روی پیام چابک را غیرفعال نکردهاید
آیا شما روی پیام چابک به صورت کاستومایز اعلانی نمایش میدهید؟
جواب این سوال بنده رو ندادید.
منظور شما از کاستومایز اینه که نوتیفیکیشن رو در اپلیکیشن کلاینت کاستوم کردیم ؟ بله
منظور شما از کاستومایز اینه که نوتیفیکیشن رو در اپلیکیشن کلاینت کاستوم کردیم ؟ بله
لطفا این بخش از مستندات رو مطالعه بفرمایید
دقت کنید که چابک به صورت خودکار اقدام به نمایش اعلان میکند، در صورت نمایش اعلان شخصیسازی شده روی پیام چابک باید به چابک اعلام کنید که از نمایش اعلان روی پیام خود خودداری کند.
با استفاده از callback buildNotification
در کلاس notificationHandler
و قرار دادن مقدار return false
منظور شما از کاستومایز اینه که نوتیفیکیشن رو در اپلیکیشن کلاینت کاستوم کردیم ؟ بله
لطفا این بخش از مستندات رو مطالعه بفرمایید
دقت کنید که چابک به صورت خودکار اقدام به نمایش اعلان میکند، در صورت نمایش اعلان شخصیسازی شده روی پیام چابک باید به چابک اعلام کنید که از نمایش اعلان روی پیام خود خودداری کند.
با استفاده از callback
buildNotification
در کلاسnotificationHandler
و قرار دادن مقدارreturn false
متوجه هستم اما با این فالس کردن ، در زمان بسته بودن برنامه نوتیفیکیشنی دریافت نمیکند و نمایش هم نمیدهد.
متوجه هستم اما با این فالس کردن ، در زمان بسته بودن برنامه نوتیفیکیشنی دریافت نمیکند و نمایش هم نمیدهد.
متد addNotificationHandler
زمانی که در کلاس Application
در متد onCreate
فراخوانی شود، در حالتی که اپلیکیشنتان بسته است callback buildNotification
فراخوانی خواهد شد و کد اعلان شخصی سازی شده شما اجرا خواهد شد.
دقت بفرمایید برای دریافت دیتای نوتیفیکیشن در متد buildNotification
این بخش از مستندات را مطالعه بفرمایید چون برای حالت نوتیفیکیشن و پیام چابک دریافت دیتا در دو متغیر متفاوت میباشد به همین علت شما در حالت بسته data را در یک جای دیگر باید دریافت کنید
متوجه هستم اما با این فالس کردن ، در زمان بسته بودن برنامه نوتیفیکیشنی دریافت نمیکند و نمایش هم نمیدهد.
متد
addNotificationHandler
زمانی که در کلاسApplication
در متدonCreate
فراخوانی شود، در حالتی که اپلیکیشنتان بسته است callbackbuildNotification
فراخوانی خواهد شد و کد اعلان شخصی سازی شده شما اجرا خواهد شد.دقت بفرمایید برای دریافت دیتای نوتیفیکیشن در متد
buildNotification
این بخش از مستندات را مطالعه بفرمایید چون برای حالت نوتیفیکیشن و پیام چابک دریافت دیتا در دو متغیر متفاوت میباشد به همین علت شما در حالت بسته data را در یک جای دیگر باید دریافت کنید
متاسفانه در حالت بسته بودن هیچ گونه نوتیفیکیشنی دریافت و نمایش داده نمیشود. فایل برنامه را در ضمیمه قرار داده ام. HelsaApp.java.zip
کد کلاس اپلیکیشن شما را مشاهده کردهایم و تغییرات لازم را در کدی که پایین ضمیمه کردهایم قرار دادهایم.
علت کرش بالا بخاطر قطعه کد زیر است که متد init چابک همیشه فراخوانی نمیشود. در صورتی که متد init باید همیشه تحت هر شرایطی در متد onCreate کلاس Application فراخوانی شود.
try {
// Remove Me Before Flight ;-)
String phone = Prefs.getString("MOBILENUMBER", "0");
if ( phone.equals("0") == false ){
try{
initPushClient(this, phone);
} catch (Exception e) {
}
}
} catch (Exception e) {
}
مستندات مربوط به نکته بالا را مطالعه کنید.
علت عدم نمایش اعلان بر روی پوشنوتیفیکیشن در حالتی که اپ بسته است به این دلیل هست که در متد buildNotification شما مقدار false برمیگردانید این به این معنی است که چابک دیگر اعلان روی پیام چابک و پوشنوتیفکیشن نشان نمیدهد و نمایش اعلان روی پیام چابک و پوشنوتیفیکیشن به عهده شما میباشد.
@Override
public boolean buildNotification(ChabokNotification chabokNotification, NotificationCompat.Builder builder){
getDataFromChabokNotification(chabokNotification);
// return false to prevent this notification to be shown to the user, otherwise true
return false;
}
مستندات مربوط به تصویر بالا را مطالعه کنید
در صورت فراخوانی مقدار دهی اولیه چابک در هر شرایطی مطابق آنچه که شما فرموده این ، خطای زیر در اندروید ۸ رخ میدهد :
لطفا کد خودتون را به توجه به نکات امنیتی و حذف توکنها برای ما اینجا قرار بدید.
Caused by: f.f: Subscriber class com.parsdigit.helsa.HelsaApp has no public methods called onEvent
خطایی که در بالا ذکر شده، شئای را که به متد addListener
دادهاید متد public onEvent
در آن شئ یافت نشده است.
با سلام مجدد ما نسبت به فراخوانی همیشگی مقداردهی اولیه چابک اقدام میکنیم ولی همچنان در اندروید ۸ با خطای فایل ضمیمه مواجه میشویم. com.parsdigit.helsa_issue_7_crash_5BCD84E50283000129FBF0E8F130C48C_DNE_0_v2.txt
ما نسبت به فراخوانی همیشگی مقداردهی اولیه چابک اقدام میکنیم ولی همچنان در اندروید ۸ با خطای فایل ضمیمه مواجه میشویم.
لطفا با مطالعه بخش تغییرات، SDK اندروید را بروزرسانی کنید
این مشکل در نسخه ۲.۱۲.۰ حل شده و آخرین نسخه چابک در حال حاضر ۲.۱۳.۲ میباشد.
ایشو فوق بسته شده است. لطفا موارد دیگر و غیر مرتبط را در ایشو دیگری مطرح کنید تا برای بقیه توسعه دهندگان آسانتر باشد @farzin680
برنامه هنگامی که بسته است و کاربر آن را باز میکند ابتدای مقدار دهی چابک یک چنین خطایی میدهد و علیرغم کلیه ی ترای-کچ ها باعث بسته شدن برنامه میشود :