onesignal pushe.co s-3.664-0.699-5.062-2.099c-1.397-1.398-2.097-3.087-2.097-5.065s0.699-3.667,2.097-5.065c1.397-1.399,3.085-2.099,5.062-2.099 s3.664,0.699,5.062,2.099C223.888,120.556,224.587,122.244,224.587,124.223z"/>

Basic4Android

راه‌اندازی

  • برای استفاده از پوشه بایستی بتوانید از SDK manager لایبرری دانلود نمایید. لذا حداقل از نسخه‌ی 7.8 استفاده کنید.
  • برای استفاده از لایبرری باید از android.jar نسخه ی 26 و یا بالاتر استفاده کنید.
  • در صورت بروز هرگونه مشکل لطفا ابتدا بخش عیب‌یابی را بررسی نمایید.

کتابخانه پوشه و ملزومات B4A را از این لینک دانلود کنید و محتوای پوشه ی درون زیپ را در پوشه ی Libraries برنامه ی B4A قرار دهید. درصورتی که یکی یا بیشتر از فایل ها قبلا وجود دارند میتوانید گزینه ی replace را انتخاب کنید.

پوشه برای دریافت لایبرری‌های خود از Maven استفاده می‌کند. باتوجه به تحریم‌بودن سرورهای Maven لطفا از ابزار گذر از تحریم استفاده کنید تا با خطای Maven artifact not found‍‍ مواجه نشوید. در صورت بروز مشکل عیب‌یابی را بررسی کنید.

در نرم افزار B4A در پنجره Libraries کلیک راست کنید و صفحه را Refresh کنید و کتابخانه PushePlugin را انتخاب کنید.

تغییرات AndroidManifest.xml

وارد پنل پوشه شوید و اپلیکیشن خود ثبت کنید. توجه داشته باشید که از همان Package Name استفاده کنید که در Build Configuration خود ثبت کرده اید. فایل منیفست مربوط به B4A را دانلود کنید. منیفست پروژه را از طریق Project > Manifest Editor در نرم افزار B4A باز کنید و محتویات داخل فایل را در آن جایگذاری کنید. برخی از دسترسی ها (permissions) برای پوشه اختیاری است. این دسترسی ها برای ارسال هدفمند اعلان به کاربران است. شما قادر خواهید بود با استفاده از این دسترسی ها کاربران خود را دسته بندی کنید و اعلانهای خود را هدفمند ارسال کنید.

افزودن کد

در کلاس Main در قسمت Sub Globals کد زیر را قرار دهید:

Dim pushe As Pushe

در کلاس Main در قسمت Activity Create کد زیر را وارد کنید:

pushe.initialize()

تست

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

  • نکته: اگر برنامه خود را از نسخه ی قبلی پوشه به نسخه ی جدید بروزرسانی می کنید، مطمئن شوید که کتابخانه های جدید را استفاده می کنید و تیک نسخه قبلی پوشه را در قسمت لایبرری بردارید. برای اطمینان می توانید فایل های مربوط به نسخه قبلی پوشه را از مسیر C:\Program Files (x86)\Anywhere Software\Basic4android\Libraries حذف کنید تا اشتباها استفاده نشوند.
  • به صفحه نصب ها بروید.
  • بعد از گذشت زمان کوتاهی یک ردیف مشخصات نصب به لیست نصب ها اضافه می شود که متعلق به گوشی شما است.
  • یک اعلان تست ارسال کنید. دقت کنید تلفن همراه شما به اینترنت متصل باشد.

توصیه می شود اپلیکیشن را بر روی موبایل یا تبلت اجرا و تست کنید. اگر می خواهید اپلیکیشن را بر روی Emulator تست کنید، بر روی ایمولاتور شما باید Google API نصب باشد.

امکانات

دریافت اطلاعات دلخواه با فرمت JSON

شما میتوانید از طریق پنل برای اپلیکیشن خود اطلاعات دلخواه در قالب یک JSON ارسال کنید. برای اینکه بتوانید از این اطلاعات در اپلیکیشن خود استفاده کنید مراحل زیر را انجام دهید. برای دریافت JSON شما باید یک receiver بسازید. فایل های لازم را از این لینک دریافت کنید. از مسیر project > add existing module در نرم افزار B4A ، ماژول PusheJsonService.bas را انتخاب کنید. کد زیر را در منیفست خود اضافه کنید:

AddManifestText(
<permission android:name="$PACKAGE$.permission.C2D_MESSAGE" android:protectionLevel="signature" />)
AddPermission($PACKAGE$.permission.C2D_MESSAGE)
AddPermission(com.google.android.c2dm.permission.RECEIVE)
' Push Service Receiver Attribute
SetReceiverAttribute(PusheJsonService, android:permission, "com.google.android.c2dm.permission.SEND")
' Service Receiver Text
AddReceiverText(PusheJsonService,
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="$PACKAGE$" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="$PACKAGE$" />
</intent-filter>)
  • بجای $PACKAGE$ پکیج نیم خود را قرار دهید.

  • در اندروید 8 ممکن است نوتیفیکیشنی ایجاد شود و ثابت روی استاتوس بار کاربر بماند. این به این دلیل است که b4a برای جلوگیری از بسته شدن سرویس جیسون آن را با نوتیفیکیشن زنده نگه میدارد. برای جلوگیری از نمایش نوتیفیکیشن بایستی کد زیر را در Service_start جیسون رسیور قرار دهید:

Service.StopAutomaticForeground

از این طریق JSON دریاقت می شود و با قرار دادن کد خود به جای your code در ماژول PusheJsonService.bas می توانید از اطلاعات دریافت شده استفاده کنید.

فرض کنید جیسونی به صورت مقابل فرستاده اید:

{
    "titr": "تیتر",
    "matn": "متن"
}

برای نمایش این جیسون بصورت toast ، در ماژول جیسونی که از سایت پوشه دریافت کرده اید، کد زیر را بنویسید (ساب MessageArrived را جایگزین تابعی که در ماژول دریافتی هست کنید) :

Sub MessageArrived (pIntent As Intent)
    Dim JsonMsg As String

    JsonMsg = PusheUtil.getPusheJsonMsg(pIntent)
    If JsonMsg <> "" Then
      'add your code here to deal with JsonMsg
          Log("Json message received: " & JsonMsg)
           processJson(JsonMsg)

    End If
End Sub

Sub processJson(jsonStr As String)
    Dim json1 As JSONParser
    Dim data As Map
    Dim s1 As String
    Dim s2 As String

      json1.Initialize(jsonStr)
      Try
        data = json1.NextObject
        s1 = data.Get("titr")
        s2 = data.Get("matn")
        ToastMessageShow(s1 & ":" & s2 , True)
  Catch
    Log(LastException)

  End Try
End Sub

تاپیک (topic)

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

برای استفاده از این امکان باید کاربران خود را در تاپیک مورد نظر عضو کنید. فرض کنید نام تاپیک مورد نظرتان varzeshi باشد. برای عضویت در این تاپیک از دستور زیر استفاده کنید:

pushe.subscribe("varzeshi")

برای لغو عضویت از این تاپیک از دستور زیر استفاده کنید:

pushe.unsubscribe("varzeshi")

نکته: توجه داشته باشید که توابع مربوط به عضو شدن و لغو عضویت در تاپیک باید بعد از پایان Pushe.initialize اجرا شوند. بنابراین آنها را بلافاصله بعد از Pushe.initialize قرار ندهید.

غیرفعال کردن نمایش پوش

می توانید نمایش پوش را غیرفعال کنید. مثلا در تنظیمات اپلیکیشن خود امکان دریافت نکردن پوش را برای کاربر قرار دهید و طبق انتخاب کاربر آن را فعال یا غیرفعال کنید.

برای غیرفعال کردن نمایش پوش از دستور زیر استفاده کنید:

pushe.notificationOff()

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

pushe.notificationOn()

ارسال پوش از یک دستگاه به دستگاه دیگر

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

Dim p as Pushe
String pid = p.getPusheId()

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

p.sendSimpleNotifToUser("pid_a0e3-82ac-a0", "title", "content")

پارامتر اول pusheId است و پارامتر دوم و سوم به ترتیب تیتر و متن اعلان هستند. برای ارسال اعلان پیشرفته از این دستور استفاده کنید:

p.sendAdvancedNotifToUser("pid_a0e3-82ac-a0", "{ \"title\":\"تست\", \"content\":\"پیام ارسالی از یک دستگاه \" }")

پارامتر اول pusheId است و پارامتر دوم یک رشته با فرمت جیسون است که مشخصات اعلان پیشرفته را تعیین می کند. برای دیدن فرمت جیسون اعلان پیشرفته به قسمت راهنمای استفاده از API قسمت ارسال اعلان پیشرفته مراجعه کنید. برای ارسال جیسون دلخواه از دستور زیر استفاده کنید:

p.sendCustomJsonToUser("pid_a0e3-82ac-a0", "{ \"key1\":\"value1\", \"key2\":\"value2\" }")

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

نکته مهم: توابع ارسال اعلان به دستگاه دیگر و عضویت یا لغو عضویت در تاپیک را بعد از اطمینان از اینکه عملیات initialization پوشه انجام شده است، صدا بزنید. برای این کار به روش زیر عمل کنید:

If p.pusheInitialized() Then
    p.sendSimpleNotifToUser("pid_a0e3-82ac-a0", "title", "content")
End If

ایجاد و حذف کانال نوتیفیکیشن در اپلیکیشن (Android 8.0+ only)

در اندروید ۸ به بعد قابلیتی برای تعریف کانال نوتیفیکیشن در اپلیکیشن ایجاد شده است. به این شکل که در برنامه خود یک یا چند کانال نوتیفیکیشن تعریف می کنید و در زمان ارسال اعلان پیشرفته با وارد کردن Channel-Id آن کانال می توانید اعلان را برای آن کانال خاص ارسال کنید. مزیت این کار این هست که کاربر می تواند دریافت نوتیفیکیشن از بعضی کانال ها را غیرفعال کند و همچنان بتواند از یک یا چند کانال دیگر اعلان بگیرد. فراخوانی تابع ایجاد یا حذف کانال در حالتی که برنامه شما روی اندروید زیر ۸ اجرا شود، اثری ندارد. همچنین اگر بیشتر از یکبار تابع ایجاد کانال را صدا بزنید هم فقط یکبار کانال ایجاد می شود و مشکلی ایجاد نمی کند. با استفاده از دستور زیر در برنامه خود می توانید کانال نوتیفیکشن تعریف کنید:

    Dim p As Pushe
    p.createNotificationChannel(
        "MY_CHANNEL_ID", 'channelId
        "all news channel", 'Channel Name
        "", 'description about channel
        4, 'importance: Number between 0 to 5 (5 is the most important)
        true, 'enableLight
        true, 'enableViberation
        true, 'showBadge
        -16776961, 'led color
        new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400} 'Vibrate mode (can be null)
    )

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

     Dim p As Pushe
     p.removeNotificationChannel(
         "MY_CHANNEL_ID" 'channelId 
    )

عیب یابی

شما می توانید خطاهای عمومی موجود در هنگام نصب در اندروید را در این لینک مشاهده نمایید. موارد عنوان شده در زیر تنها مربوط به بیسیک 4اندروید هستند.


خطا‌‌های مربوط به Maven Artifact not found …

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

برای حل مشکل بایستی لایبرری لازم را دانلود نمایید.

ابتدا از Tools،‌ گزینه‌ی SDK manager را انتخاب کنید و لایبرری‌ای که در خطا مشاهده کردید را جستجو نمایید. دقت کنید که از ابزار گذر از تحریم استفاده نمایید تا دانلود و جستجو بدون مشکل انجام‌شود.


Maven artifact not found: com.google.auto.value/auto-value-annotations

این لایبرری در SDK manager بیسیک۴اندروید وجود ندارد و مطابق این پست بایستی این فایل را در آدرس زیر در AndroidSDK خود اکسترکت کنید.

<محل SDK> => extras => google


Uncaught translation error: java.lang.IllegalArgumentException: already added: …

این خطا به دلیل conflict دو یا بیشتر از لایبرری‌های اضافه‌شده به پروژه رخ می‌دهد.

با توجه به اینکه پوشه لایبرری‌ها را با استفاده از Maven اضافه می‌کند، به احتمال زیاد لایبرری‌های دیگر از Maven استفاده نکرده‌اند. بایستی فایل xml لایبرری‌هایی که اضافه کرده‌اید را باز کنید و لایبرری‌ها را در صورت امکان به Maven تبدیل کنید.

مثال از خطا

Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/AnimRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/AnimatorRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/AnyRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/AnyThread;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/ArrayRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/AttrRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/BinderThread;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/BoolRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/CallSuper;
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Translation has been interrupted
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:689)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:313)
at com.android.dx.command.dexer.Main.run(Main.java:279)
at com.android.dx.command.dexer.Main.main(Main.java:247)
at com.android.dx.command.Main.main(Main.java:106)
Caused by: java.lang.InterruptedException: Too many errors
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:681)
... 4 more

در این خطا می‌توانیم ببینیم که لایبرری support-annotation دو بار به پروژه اضافه‌شده است. در فایل xml پوشه:

<dependsOn>com.android.support:support-annotations</dependsOn>

مشاهده می‌شود. در صورتی که لایبرری‌های دیگر که از این لایبرری استفاده می‌کنند، به نحوی دیگر مثلا:

<dependsOn>support-annotations.jar</dependsOn>

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

در صورت موفق نشدن در این امر مشکل را با ذکر خطا به پشتیبانی پوشه اطلاع دهید.


Generate R . Error

این خطا دلایل مختلفی دارد که معمولا در پایین آن درج شده است. در صورتی که هیچ خطایی بعد از آن نیست معمولا ناسازگاری android.jar و یا نسخه ی استفاده شده در B4A است.


Install parse failed manifest malformed

این مشکل به دلیل این است که شما در Package Name اپلیکیشن خود از حروف بزرگ انگلیسی استفاده کرده اید. و اگر در منیفست شما از پکیج نیم استفاده شده باشد، بیسیک 4 اندروید نمی تواند کامپایل کند. برای آشنایی بیشتر می توانید به این سایت مراجعه کنید.

همچنین بررسی کنید که فایل مانیفست ایراد نگارشی نداشته باشد.


همیشه در کنارتان هستیم

در اولین فرصت با ایمیل به شما پاسخ خواهیم داد.

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