Bagikan melalui


Mengaktifkan pemberitahuan push

Pemberitahuan push memungkinkan klien diberi tahu untuk pesan masuk dan operasi lain yang terjadi di utas obrolan dalam situasi di mana aplikasi seluler tidak berjalan di latar depan. Azure Communication Services mendukung daftar acar yang dapat Anda ikuti untuk .

Catatan

Pemberitahuan push obrolan didukung untuk Android SDK dalam versi mulai dari 1.1.0-beta.4 dan 1.1.0. Disarankan agar Anda menggunakan versi 2.0.0 atau yang lebih baru, karena versi yang lebih lama memiliki masalah yang diketahui dengan perpanjangan pendaftaran. Langkah-langkah dari 8 hingga 12 hanya diperlukan untuk versi yang sama dengan atau lebih besar dari 2.0.0.

  1. Siapkan Firebase Cloud Messaging untuk proyek ChatQuickstart. Selesaikan langkah Create a Firebase project- , Register your app with Firebase, Add a Firebase configuration file, Add Firebase SDKs to your app, dan Edit your app manifest dalam Dokumentasi Firebase.

  2. Buat Notification Hub dalam langganan yang sama dengan sumber daya Communication Services Anda, konfigurasikan pengaturan Firebase Cloud Messaging untuk hub, dan tautkan Notification Hub ke sumber daya Communication Services Anda. Lihat Provisi Notification Hub.

  3. Buat file baru yang disebut MyFirebaseMessagingService.java di direktori yang sama tempatnya MainActivity.java berada. Salin kode berikut ke dalam MyFirebaseMessagingService.java. Anda harus mengganti <your_package_name> dengan nama paket yang digunakan dalam MainActivity.java. Anda dapat menggunakan nilai Anda sendiri untuk <your_intent_name>. Nilai ini akan digunakan pada langkah 6 di bawah ini.

       package <your_package_name>;
    
       import android.content.Intent;
       import android.util.Log;
    
       import androidx.localbroadcastmanager.content.LocalBroadcastManager;
    
       import com.azure.android.communication.chat.models.ChatPushNotification;
       import com.google.firebase.messaging.FirebaseMessagingService;
       import com.google.firebase.messaging.RemoteMessage;
    
       import java.util.concurrent.Semaphore;
    
       public class MyFirebaseMessagingService extends FirebaseMessagingService {
           private static final String TAG = "MyFirebaseMsgService";
           public static Semaphore initCompleted = new Semaphore(1);
    
           @Override
           public void onMessageReceived(RemoteMessage remoteMessage) {
               try {
                   Log.d(TAG, "Incoming push notification.");
    
                   initCompleted.acquire();
    
                   if (remoteMessage.getData().size() > 0) {
                       ChatPushNotification chatPushNotification =
                           new ChatPushNotification().setPayload(remoteMessage.getData());
                       sendPushNotificationToActivity(chatPushNotification);
                   }
    
                   initCompleted.release();
               } catch (InterruptedException e) {
                   Log.e(TAG, "Error receiving push notification.");
               }
           }
    
           private void sendPushNotificationToActivity(ChatPushNotification chatPushNotification) {
               Log.d(TAG, "Passing push notification to Activity: " + chatPushNotification.getPayload());
               Intent intent = new Intent("<your_intent_name>");
               intent.putExtra("PushNotificationPayload", chatPushNotification);
               LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
           }
       }
    
    
  4. Di bagian atas file MainActivity.java, tambahkan pernyataan impor berikut:

       import android.content.BroadcastReceiver;
       import android.content.Context;
       import android.content.Intent;
       import android.content.IntentFilter;
    
       import androidx.localbroadcastmanager.content.LocalBroadcastManager;
       import com.azure.android.communication.chat.models.ChatPushNotification;
       import com.google.android.gms.tasks.OnCompleteListener;
       import com.google.android.gms.tasks.Task;
       import com.google.firebase.messaging.FirebaseMessaging;
    
  5. Tambahkan kode berikut ke kelas MainActivity:

       private BroadcastReceiver firebaseMessagingReceiver = new BroadcastReceiver() {
           @Override
           public void onReceive(Context context, Intent intent) {
               ChatPushNotification pushNotification =
                   (ChatPushNotification) intent.getParcelableExtra("PushNotificationPayload");
    
               Log.d(TAG, "Push Notification received in MainActivity: " + pushNotification.getPayload());
    
               boolean isHandled = chatAsyncClient.handlePushNotification(pushNotification);
               if (!isHandled) {
                   Log.d(TAG, "No listener registered for incoming push notification!");
               }
           }
       };
    
    
       private void startFcmPushNotification() {
           FirebaseMessaging.getInstance().getToken()
               .addOnCompleteListener(new OnCompleteListener<String>() {
                   @Override
                   public void onComplete(@NonNull Task<String> task) {
                       if (!task.isSuccessful()) {
                           Log.w(TAG, "Fetching FCM registration token failed", task.getException());
                           return;
                       }
    
                       // Get new FCM registration token
                       String token = task.getResult();
    
                       // Log and toast
                       Log.d(TAG, "Fcm push token generated:" + token);
                       Toast.makeText(MainActivity.this, token, Toast.LENGTH_SHORT).show();
    
                       chatAsyncClient.startPushNotifications(token, new Consumer<Throwable>() {
                           @Override
                           public void accept(Throwable throwable) {
                               Log.w(TAG, "Registration failed for push notifications!", throwable);
                           }
                       });
                   }
               });
       }
    
    
  6. Perbarui fungsi onCreate di MainActivity.

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
    
           LocalBroadcastManager
               .getInstance(this)
               .registerReceiver(
                   firebaseMessagingReceiver,
                   new IntentFilter("<your_intent_name>"));
       }
    
  7. Masukkan kode berikut di bawah komentar <RECEIVE CHAT MESSAGES> di MainActivity:

   startFcmPushNotification();

   chatAsyncClient.addPushNotificationHandler(CHAT_MESSAGE_RECEIVED, (ChatEvent payload) -> {
       Log.i(TAG, "Push Notification CHAT_MESSAGE_RECEIVED.");
       ChatMessageReceivedEvent event = (ChatMessageReceivedEvent) payload;
       // You code to handle ChatMessageReceived event
   });
  1. xmlns:tools Tambahkan bidang ke AndroidManifest.xml file:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.azure.android.communication.chat.sampleapp">
  1. Nonaktifkan penginisialisasi default untuk WorkManager di AndroidManifest.xml:
    <!-- Disable the default initializer of WorkManager so that we could override it in MyAppConfiguration  -->
    <provider
        android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        android:exported="false"
        tools:node="merge">
      <!-- If you are using androidx.startup to initialize other components -->
      <meta-data
          android:name="androidx.work.WorkManagerInitializer"
          android:value="androidx.startup"
          tools:node="remove" />
    </provider>
    <!-- End of Disabling default initializer of WorkManager -->
  1. WorkManager Tambahkan dependensi ke file Andabuild.gradle:
    def work_version = "2.7.1"
    implementation "androidx.work:work-runtime:$work_version"
  1. Tambahkan penginisialisasi kustom WorkManager dengan membuat penerapan Configuration.Providerkelas :
    public class MyAppConfiguration extends Application implements Configuration.Provider {
        Consumer<Throwable> exceptionHandler = new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) {
                Log.i("YOUR_TAG", "Registration failed for push notifications!" + throwable.getMessage());
            }
        };
    
        @Override
        public void onCreate() {
            super.onCreate();
            // Initialize application parameters here
            WorkManager.initialize(getApplicationContext(), getWorkManagerConfiguration());
        }
    
        @NonNull
        @Override
        public Configuration getWorkManagerConfiguration() {
            return new Configuration.Builder().
                setWorkerFactory(new RegistrationRenewalWorkerFactory(COMMUNICATION_TOKEN_CREDENTIAL, exceptionHandler)).build();
        }
    }

Penjelasan untuk kode di atas: Inisialisasi WorkManager default telah dinonaktifkan di langkah 9. Langkah ini diterapkan Configuration.Provider untuk menyediakan 'WorkFactory' yang disesuaikan, yang bertanggung jawab untuk dibuat WorkerManager selama runtime.

Jika aplikasi terintegrasi dengan Azure Function, inisialisasi parameter aplikasi harus ditambahkan dalam metode 'onCreate()'. Metode 'getWorkManagerConfiguration()' dipanggil ketika aplikasi dimulai, sebelum objek aktivitas, layanan, atau penerima apa pun (tidak termasuk penyedia konten) telah dibuat, sehingga parameter aplikasi dapat diinisialisasi sebelum digunakan. Detail selengkapnya dapat ditemukan di aplikasi obrolan sampel.

  1. android:name=.MyAppConfiguration Tambahkan bidang , yang menggunakan nama kelas dari langkah 11, ke dalam AndroidManifest.xml:
<application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:theme="@style/Theme.AppCompat"
      android:supportsRtl="true"
      android:name=".MyAppConfiguration"
>