Delen via


Pushmeldingen inschakelen

Met pushmeldingen kunnen clients worden gewaarschuwd voor binnenkomende berichten en andere bewerkingen die plaatsvinden in een chat-thread in situaties waarin de mobiele app niet op de voorgrond wordt uitgevoerd. Azure Communication Services ondersteunt een lijst met gebeurtenissen waarop u zich kunt abonneren.

Notitie

Pushmeldingen voor chats worden ondersteund voor Android SDK in versies vanaf 1.1.0-beta.4 en 1.1.0. Het wordt aanbevolen om versie 2.0.0 of hoger te gebruiken, omdat oudere versies een bekend probleem hebben met de registratievernieuwing. Stappen van 8 tot en met 12 zijn alleen nodig voor versies die gelijk zijn aan of groter zijn dan 2.0.0.

  1. Stel Firebase Cloud Messaging in voor het ChatQuickstart-project. Voer de stappenCreate a Firebase project, , , Add a Firebase configuration fileen Edit your app manifestAdd Firebase SDKs to your appin de Firebase-documentatieRegister your app with Firebase uit.

  2. Maak een Notification Hub binnen hetzelfde abonnement als uw Communication Services-resource, configureer uw Firebase Cloud Messaging-instellingen voor de hub en koppel de Notification Hub aan uw Communication Services-resource. Zie Het inrichten van Notification Hub.

  3. Maak een nieuw bestand met de naam MyFirebaseMessagingService.java in dezelfde map waarin MainActivity.java zich bevindt. Kopieer de volgende code naar MyFirebaseMessagingService.java. U moet vervangen door <your_package_name> de pakketnaam die wordt gebruikt in MainActivity.java. U kunt uw eigen waarde gebruiken voor <your_intent_name>. Deze waarde wordt gebruikt in stap 6 hieronder.

       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. Voeg boven aan het bestand MainActivity.javade volgende importinstructies toe:

       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. Voeg de volgende code toe aan de klasse 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. Werk de functie onCreate bij in 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. Plaats de volgende code onder de opmerking <RECEIVE CHAT MESSAGES> in 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. Voeg het xmlns:tools veld toe aan het AndroidManifest.xml bestand:
    <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. Schakel de standaard initialisatiefunctie voor WorkManager in 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. Voeg de WorkManager afhankelijkheid toe aan uw build.gradle bestand:
    def work_version = "2.7.1"
    implementation "androidx.work:work-runtime:$work_version"
  1. Voeg een aangepaste WorkManager initialisatiefunctie toe door een klasse te maken die wordt geïmplementeerd Configuration.Provider:
    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();
        }
    }

Uitleg bij de bovenstaande code: de standaard initialisatiefunctie is WorkManager uitgeschakeld in stap 9. Deze stap implementeert Configuration.Provider om een aangepaste 'WorkFactory' te bieden, die verantwoordelijk is voor het maken WorkerManager tijdens runtime.

Als de app is geïntegreerd met Azure Function, moet de initialisatie van toepassingsparameters worden toegevoegd in de methode onCreate(). De methode 'getWorkManagerConfiguration()' wordt aangeroepen wanneer de toepassing wordt gestart, voordat er activiteits-, service- of ontvangerobjecten (met uitzondering van inhoudsproviders) zijn gemaakt, zodat toepassingsparameters kunnen worden geïnitialiseerd voordat ze worden gebruikt. Meer informatie vindt u in de voorbeeldchat-app.

  1. Voeg het android:name=.MyAppConfiguration veld toe, dat gebruikmaakt van de klassenaam uit stap 11, in 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"
>