chabokpush / chabok-client-android

Chabok Push Client for Android
https://chabokpush.com
5 stars 1 forks source link

خطا در زمان مقدار دهی اولیه چابک #16

Closed farzin680 closed 6 years ago

farzin680 commented 6 years ago

برنامه هنگامی که بسته است و کاربر آن را باز میکند ابتدای مقدار دهی چابک یک چنین خطایی میدهد و علیرغم کلیه ی ترای-کچ ها باعث بسته شدن برنامه میشود :

Fatal Exception: java.lang.RuntimeException: Unable to create service 
com.adpdigital.push.PushService: java.lang.IllegalStateException:
 AdpPushClient not initialized yet, please first call AdpPushClient.get with parameters
       at android.app.ActivityThread.handleCreateService(ActivityThread.java:3173)
       at android.app.ActivityThread.access$1900(ActivityThread.java:177)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1513)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5910)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
behrad commented 6 years ago

احتمالن شما متد مقداردهی چابک رو جای مناسبی نگذاشتید که در همه حالت ها که برنامه باز میشه به موقع فراخوانی بشه

farzin680 commented 6 years ago

با سلام مجدد ،

این متد رو در کلاس اپلیکیشن قرار داده ایم. فکر میکنین اونجا جای نا مناسبی باشه ؟

behrad commented 6 years ago

نه نباید مشکلی باشه یه نمونه کد یا توضیح بیشتر در مورد استفادتون بدید لطفن تا بتونیم مورد شما رو بررسی کنییم

@Husseinhj لطفن بررسی کنیم مشکل کد ایشون چیه

farzin680 commented 6 years ago
        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)
            {

            }
        }

    }
behrad commented 6 years ago

@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 !

farzin680 commented 6 years ago

Hmmm , Okay Please Find The Attachment.

HelsaApp.java.zip

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 ...

behrad commented 6 years ago

Talk to your backend team, there's actually no need for those tags!

behrad commented 6 years ago

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.

farzin680 commented 6 years ago

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.

Husseinhj commented 6 years ago

با استفاده از متد 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) {
    }
}
behrad commented 6 years ago

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

farzin680 commented 6 years ago

سلام ،

به نظر حل نشده و همچنان با کدی که راهنمایی کردید هم اون کرش اتفاق میفته. طبق آمار فابریک ، ۱۴۵۰ تا کرش در ۲۱۰۰ اجرا داشتیم.

farzin680 commented 6 years ago

فایلش رو هم اینجا میگذارم براتون com.parsdigit.helsa_issue_4_crash_5BC4288C03710001296CC66BFAD31F87_DNE_0_v2.txt

Husseinhj commented 6 years ago

به نظر حل نشده و همچنان با کدی که راهنمایی کردید هم اون کرش اتفاق میفته.

دقت داشته باشید متد AdpPushClient.init در کلاس Application و متد OnCreate حتما باید فراخوانی شود و نباید کدی مانع اجرا شدن متد فوق بشود.

حتما کد نسخه جدید پروژه استارتر رو مشاهده کنید

farzin680 commented 6 years ago

به نظر حل نشده و همچنان با کدی که راهنمایی کردید هم اون کرش اتفاق میفته.

دقت داشته باشید متد AdpPushClient.init در کلاس Application و متد OnCreate حتما باید فراخوانی شود و نباید کدی مانع اجرا شدن متد فوق بشود.

حتما کد نسخه جدید پروژه استارتر رو مشاهده کنید

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

Husseinhj commented 6 years ago

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

همیشه و در همه حالات متد init فراخوانی می‌شود؟

farzin680 commented 6 years ago

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

همیشه و در همه حالات متد init فراخوانی می‌شود؟

منظورتون اجرای اینیت در public static AdpPushClient activeChabok(HelsaApp context, Context applicationContext, NotificationHandler myHandler) هست ؟

در هر بار اجرای برنامه ؟

Husseinhj commented 6 years ago

در هر بار اجرای برنامه ؟

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

این قسمت از کد استارتر رو مشاهده کنید.

farzin680 commented 6 years ago

با تشکر از شما.

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

com.google.android.gms.gcm.GcmReceiver

Husseinhj commented 6 years ago

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

آیا شما روی پیام چابک به صورت کاستومایز اعلانی نمایش می‌دهید؟

همیشه این اتفاق رخ میدهد؟

farzin680 commented 6 years ago

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

آیا شما روی پیام چابک به صورت کاستومایز اعلانی نمایش می‌دهید؟

همیشه این اتفاق رخ میدهد؟

بله همیشه این اتفاق رخ میدهد.

Husseinhj commented 6 years ago

آیا شما روی پیام چابک به صورت کاستومایز اعلانی نمایش می‌دهید؟

لطفا جواب این سوال بند را هم بدهید.

بله همیشه این اتفاق رخ میدهد.

احتمالا شما اعلان را شخصی‌سازی کرده ولی پیش‌فرض نمایش اعلان روی پیام چابک را غیرفعال نکرده‌اید

farzin680 commented 6 years ago

آیا شما روی پیام چابک به صورت کاستومایز اعلانی نمایش می‌دهید؟

جواب این سوال بنده رو ندادید.

منظور شما از کاستومایز اینه که نوتیفیکیشن رو در اپلیکیشن کلاینت کاستوم کردیم ؟ بله

Husseinhj commented 6 years ago

منظور شما از کاستومایز اینه که نوتیفیکیشن رو در اپلیکیشن کلاینت کاستوم کردیم ؟ بله

لطفا این بخش از مستندات رو مطالعه بفرمایید

دقت کنید که چابک به صورت خودکار اقدام به نمایش اعلان می‌کند، در صورت نمایش اعلان شخصی‌سازی شده روی پیام چابک باید به چابک اعلام کنید که از نمایش اعلان روی پیام خود خودداری کند.

با استفاده از callback buildNotification در کلاس notificationHandler و قرار دادن مقدار return false

farzin680 commented 6 years ago

منظور شما از کاستومایز اینه که نوتیفیکیشن رو در اپلیکیشن کلاینت کاستوم کردیم ؟ بله

لطفا این بخش از مستندات رو مطالعه بفرمایید

دقت کنید که چابک به صورت خودکار اقدام به نمایش اعلان می‌کند، در صورت نمایش اعلان شخصی‌سازی شده روی پیام چابک باید به چابک اعلام کنید که از نمایش اعلان روی پیام خود خودداری کند.

با استفاده از callback buildNotification در کلاس notificationHandler و قرار دادن مقدار return false

متوجه هستم اما با این فالس کردن ، در زمان بسته بودن برنامه نوتیفیکیشنی دریافت نمیکند و نمایش هم نمیدهد.

Husseinhj commented 6 years ago

متوجه هستم اما با این فالس کردن ، در زمان بسته بودن برنامه نوتیفیکیشنی دریافت نمیکند و نمایش هم نمیدهد.

متد addNotificationHandler زمانی که در کلاس Application در متد onCreate فراخوانی شود، در حالتی که اپلیکیشنتان بسته است callback buildNotification فراخوانی خواهد شد و کد اعلان شخصی سازی شده شما اجرا خواهد شد.

دقت بفرمایید برای دریافت دیتای نوتیفیکیشن در متد buildNotification این بخش از مستندات را مطالعه بفرمایید چون برای حالت نوتیفیکیشن و پیام چابک دریافت دیتا در دو متغیر متفاوت می‌باشد به همین علت شما در حالت بسته data را در یک جای دیگر باید دریافت کنید

farzin680 commented 6 years ago

متوجه هستم اما با این فالس کردن ، در زمان بسته بودن برنامه نوتیفیکیشنی دریافت نمیکند و نمایش هم نمیدهد.

متد addNotificationHandler زمانی که در کلاس Application در متد onCreate فراخوانی شود، در حالتی که اپلیکیشنتان بسته است callback buildNotification فراخوانی خواهد شد و کد اعلان شخصی سازی شده شما اجرا خواهد شد.

دقت بفرمایید برای دریافت دیتای نوتیفیکیشن در متد buildNotification این بخش از مستندات را مطالعه بفرمایید چون برای حالت نوتیفیکیشن و پیام چابک دریافت دیتا در دو متغیر متفاوت می‌باشد به همین علت شما در حالت بسته data را در یک جای دیگر باید دریافت کنید

متاسفانه در حالت بسته بودن هیچ گونه نوتیفیکیشنی دریافت و نمایش داده نمیشود. فایل برنامه را در ضمیمه قرار داده ام. HelsaApp.java.zip

Husseinhj commented 6 years ago

کد کلاس اپلیکیشن شما را مشاهده کرده‌ایم و تغییرات لازم را در کدی که پایین ضمیمه کرده‌ایم قرار داده‌ایم.

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) {
}

image

مستندات مربوط به نکته بالا را مطالعه کنید.

علت عدم نمایش اعلان بر روی پوش‌نوتیفیکیشن در حالتی که اپ بسته است به این دلیل هست که در متد 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;
}

image

مستندات مربوط به تصویر بالا را مطالعه کنید

Husseinhj commented 6 years ago

در صورت فراخوانی مقدار دهی اولیه چابک در هر شرایطی مطابق آنچه که شما فرموده این ، خطای زیر در اندروید ۸ رخ میدهد :

لطفا کد خودتون را به توجه به نکات امنیتی و حذف توکن‌ها برای ما اینجا قرار بدید.

Caused by: f.f: Subscriber class com.parsdigit.helsa.HelsaApp has no public methods called onEvent

خطایی که در بالا ذکر شده، شئ‌ای را که به متد addListener داده‌اید متد public onEvent در آن شئ یافت نشده است.

farzin680 commented 6 years ago

با سلام مجدد ما نسبت به فراخوانی همیشگی مقداردهی اولیه چابک اقدام میکنیم ولی همچنان در اندروید ۸ با خطای فایل ضمیمه مواجه میشویم. com.parsdigit.helsa_issue_7_crash_5BCD84E50283000129FBF0E8F130C48C_DNE_0_v2.txt

Husseinhj commented 6 years ago

ما نسبت به فراخوانی همیشگی مقداردهی اولیه چابک اقدام میکنیم ولی همچنان در اندروید ۸ با خطای فایل ضمیمه مواجه میشویم.

لطفا با مطالعه بخش تغییرات، SDK اندروید را بروزرسانی کنید

این مشکل در نسخه ۲.۱۲.۰ حل شده و آخرین نسخه چابک در حال حاضر ۲.۱۳.۲ می‌باشد.

Husseinhj commented 6 years ago

ایشو فوق بسته شده است. لطفا موارد دیگر و غیر مرتبط را در ایشو دیگری مطرح کنید تا برای بقیه توسعه دهندگان آسان‌تر باشد @farzin680